mirror of
https://github.com/openglow-org/forgefirm.git
synced 2026-09-27 08:41:13 -07:00
23502 lines
636 KiB
JSON
23502 lines
636 KiB
JSON
{
|
|
"authorized": true,
|
|
"campaign": {
|
|
"catalog_hash": "1f1f7f5daba32301dbf31723ecf2bc4a045a0a6a7ce8647c084876493e79be64",
|
|
"id": "c-20260919222216-7903",
|
|
"image": "20260919221704 (dev)",
|
|
"manifest_sha": "58495afe066c6964484fb07d5664895a4e742e65509c81c10056d9303570f182",
|
|
"t": "campaign",
|
|
"ts": "2026-09-19T22:22:16Z"
|
|
},
|
|
"catalog_hash": "1f1f7f5daba32301dbf31723ecf2bc4a045a0a6a7ce8647c084876493e79be64",
|
|
"counts": {
|
|
"inherited": 73,
|
|
"required": 0,
|
|
"satisfied": 91,
|
|
"total": 91
|
|
},
|
|
"exported_at": "2026-09-19T22:32:19Z",
|
|
"format": 1,
|
|
"identity_sha": "4a50449eac3286fe5449881635f35e52f42b5c9c69bdf994fc1f00bbba35715f",
|
|
"image": {
|
|
"name": "forgefirm-image-dev",
|
|
"version": "20260919221704 (dev)"
|
|
},
|
|
"invalidate": null,
|
|
"manifest": {
|
|
"build": {
|
|
"layers": {
|
|
"meta": {
|
|
"dirty": false,
|
|
"rev": "70ed6f677234d32198371a030178d2f272cf2d94"
|
|
},
|
|
"meta-forgefirm": {
|
|
"dirty": false,
|
|
"rev": "f306c9983f944acc1355976b78af101ee9a450c9"
|
|
},
|
|
"meta-freescale": {
|
|
"dirty": false,
|
|
"rev": "b699d026506a6fc402e03afb432dcabd3d81c7ab"
|
|
},
|
|
"meta-freescale-distro": {
|
|
"dirty": false,
|
|
"rev": "b9d6a5d9931922558046d230c1f5f4ef6ee72345"
|
|
},
|
|
"meta-glowforge-bsp": {
|
|
"dirty": false,
|
|
"rev": "71fad52e8ff5695bce3b9c6bc8530a1468426819"
|
|
},
|
|
"meta-networking": {
|
|
"dirty": false,
|
|
"rev": "b0c2c648a1af89e7a8dd4c2ec841f3bc0ed0ccb9"
|
|
},
|
|
"meta-oe": {
|
|
"dirty": false,
|
|
"rev": "b0c2c648a1af89e7a8dd4c2ec841f3bc0ed0ccb9"
|
|
},
|
|
"meta-openglow-core": {
|
|
"dirty": false,
|
|
"rev": "71fad52e8ff5695bce3b9c6bc8530a1468426819"
|
|
},
|
|
"meta-poky": {
|
|
"dirty": false,
|
|
"rev": "70ed6f677234d32198371a030178d2f272cf2d94"
|
|
},
|
|
"meta-python": {
|
|
"dirty": false,
|
|
"rev": "b0c2c648a1af89e7a8dd4c2ec841f3bc0ed0ccb9"
|
|
}
|
|
}
|
|
},
|
|
"components": {
|
|
"ffboot": {
|
|
"component": "ffboot",
|
|
"files": [
|
|
[
|
|
"ffboot",
|
|
"794049bce7f33581bd43acd6ef4ed4b8f2000eee"
|
|
],
|
|
[
|
|
"fw_env.config",
|
|
"9d5dbf3bede2cb8ca6c28a58f5637bcd74b60c44"
|
|
]
|
|
],
|
|
"pv": "1.0",
|
|
"recipes": [
|
|
"ffboot"
|
|
],
|
|
"source": "files",
|
|
"srcrev": null
|
|
},
|
|
"forgectrl": {
|
|
"component": "forgectrl",
|
|
"files": [
|
|
[
|
|
".devcontainer/Dockerfile",
|
|
"b5fe47b2324ef29fb4d14ca04d81a555f4c2b310"
|
|
],
|
|
[
|
|
".devcontainer/devcontainer.json",
|
|
"aac36c6d76eb9379ed898242e55be1c7f44a844b"
|
|
],
|
|
[
|
|
".devcontainer/post-create.sh",
|
|
"f6a319a4386a56858c277cfacd402ffff07b0d6b"
|
|
],
|
|
[
|
|
".env.example",
|
|
"c5e199c33f528c8a22e6ac31f46519ca890e4487"
|
|
],
|
|
[
|
|
".gitattributes",
|
|
"1b30e1b56dcc0411c10ee780053d04f1c9d862e1"
|
|
],
|
|
[
|
|
".github/workflows/build.yml",
|
|
"1e5a14a608ea1c619714946397e94b508a4f3515"
|
|
],
|
|
[
|
|
".gitignore",
|
|
"2982052941081476662b3fd88cac64dd10c71f15"
|
|
],
|
|
[
|
|
".vscode/tasks.json",
|
|
"0680fc703a11f0041bfa6641ed67e3146982464e"
|
|
],
|
|
[
|
|
"AGENTS.md",
|
|
"b9e7fb425f505c0cb222db2931d271da611f718f"
|
|
],
|
|
[
|
|
"CMakeLists.txt",
|
|
"b1992576d2fa18cb07a8ccfcf207205417ed445b"
|
|
],
|
|
[
|
|
"CONTRIBUTING.md",
|
|
"ca2a98e7d617e1bca2b2f814a598e94f89186c6e"
|
|
],
|
|
[
|
|
"LICENSE",
|
|
"ddfa51eaa264bc020ac65023e52f60be1d8cc1cd"
|
|
],
|
|
[
|
|
"README.md",
|
|
"cf6799bfcf5e9cd51ba4c952cc012216756098ef"
|
|
],
|
|
[
|
|
"docs/advisories/cloud-service.md",
|
|
"004e5c4cdd3c3b8a487452814fd79ef926063f70"
|
|
],
|
|
[
|
|
"docs/advisories/licenses.md",
|
|
"76cbe3f3cdd34d17188ca318349308440ee48c6e"
|
|
],
|
|
[
|
|
"docs/advisories/privacy.md",
|
|
"fa9fc1f3eeaf61fa7dcde0d972c43522e8367cba"
|
|
],
|
|
[
|
|
"docs/advisories/safety-and-risk.md",
|
|
"88b56eddc84e66f7a482d39ab8656d8fbb9314b7"
|
|
],
|
|
[
|
|
"init/forgectrl.init",
|
|
"ee35651f9be1d8dff23ff87323b085482f88802b"
|
|
],
|
|
[
|
|
"src/accel.c",
|
|
"5cc63aba5005d4fc4f3f8af9482dfea2b9e12481"
|
|
],
|
|
[
|
|
"src/accel.h",
|
|
"5e8807d02b6f29b1e006835c6e81c798a0a3ab2f"
|
|
],
|
|
[
|
|
"src/advisories.c",
|
|
"1a45f811f2ee58b54b4433d61de864ba507c92f4"
|
|
],
|
|
[
|
|
"src/advisories.h",
|
|
"6e2a2ea2b6089d6885613d718345f832ea7a2596"
|
|
],
|
|
[
|
|
"src/airflow.c",
|
|
"02627ff272070a76cad7d1e9f48293858af27eff"
|
|
],
|
|
[
|
|
"src/airflow.h",
|
|
"4a9e3f2328ffc8a899cd8521a01667929abfdd25"
|
|
],
|
|
[
|
|
"src/auth.c",
|
|
"2943c568f84b3362f0f3919b30b1d76081618266"
|
|
],
|
|
[
|
|
"src/auth.h",
|
|
"e74f03b2511cb1d410e890ce439b39418b25986c"
|
|
],
|
|
[
|
|
"src/button.c",
|
|
"fce73c84ab531f6e9e8205e922e5506b392ea00c"
|
|
],
|
|
[
|
|
"src/button.h",
|
|
"c9abf79767336fe892413330ee920134b70c9301"
|
|
],
|
|
[
|
|
"src/cam.c",
|
|
"54b373b8663573bfeec6f4e06955c9a570926650"
|
|
],
|
|
[
|
|
"src/cam.h",
|
|
"849af0702ea3e77cf67dfaddb41f7d320b966828"
|
|
],
|
|
[
|
|
"src/camhealth.c",
|
|
"2ce8a0e4dd6586b67b2bc9d340444c7638454311"
|
|
],
|
|
[
|
|
"src/camhealth.h",
|
|
"4d0765ebe62a733226fc5d1f09ff648fdb9f3645"
|
|
],
|
|
[
|
|
"src/camkey.c",
|
|
"c29ae59d985eaee8ecf81e508b5fe4ca50973a19"
|
|
],
|
|
[
|
|
"src/camkey.h",
|
|
"a33a4338e3cf3322e64b8034f57b6dc5726f6ffc"
|
|
],
|
|
[
|
|
"src/cool.c",
|
|
"2e608c0fae0ddc60093fbe7e2ad2547839e095c7"
|
|
],
|
|
[
|
|
"src/cool.h",
|
|
"ae847de946084145e691b7dd5f72cc560fcee615"
|
|
],
|
|
[
|
|
"src/coolfmt.c",
|
|
"aa89421f4e2b14d37345faab3c1b2e18970001a7"
|
|
],
|
|
[
|
|
"src/coolfmt.h",
|
|
"55fe9b4734d508b7f58bb311cb4fa9264ccda14d"
|
|
],
|
|
[
|
|
"src/curverec.c",
|
|
"86fdefdb6556d216a27f150e557836fe806324c4"
|
|
],
|
|
[
|
|
"src/curverec.h",
|
|
"f05b0eec1fdb333e708941dcc946123b93c3d1b7"
|
|
],
|
|
[
|
|
"src/debayer.c",
|
|
"8193350d231de08eaab92c00a27574ba3f21afae"
|
|
],
|
|
[
|
|
"src/debayer.h",
|
|
"66ada9cb84f29091c97a42d881a64d21b6919b41"
|
|
],
|
|
[
|
|
"src/diag.c",
|
|
"05964889a23ed6206d014be461797654fe3b9999"
|
|
],
|
|
[
|
|
"src/diag.h",
|
|
"40d454355736e20cb34984a05a7175c32d9b4cf0"
|
|
],
|
|
[
|
|
"src/fflog.c",
|
|
"cdeb518386db022df74cbfff89008bf17f5a864c"
|
|
],
|
|
[
|
|
"src/fflog.h",
|
|
"905314b0d5be06487faecdf97720e23d2506bb4e"
|
|
],
|
|
[
|
|
"src/font_hershey.c",
|
|
"9d7e7be583299f495997da276ca19c785ecb6e6d"
|
|
],
|
|
[
|
|
"src/font_hershey.h",
|
|
"535bbdcdf671b57b24fb710211a89c7e0a855c55"
|
|
],
|
|
[
|
|
"src/gates.c",
|
|
"9724fee4144ee6c7fb0fd6d769a580c3ba2b23c9"
|
|
],
|
|
[
|
|
"src/gates.h",
|
|
"5f164f39cc39be006e6eb59651760d7d3f81bb2e"
|
|
],
|
|
[
|
|
"src/gpu_debayer.c",
|
|
"1672674a4d3e8f0d74d1cd7f2b89a7062988178f"
|
|
],
|
|
[
|
|
"src/gpu_debayer.h",
|
|
"dc09046d56a52ffe457d26ea5e7bf73ec7ca4ece"
|
|
],
|
|
[
|
|
"src/hooks.h",
|
|
"99bb724ae54b645b620d2e539838b055e8020083"
|
|
],
|
|
[
|
|
"src/ipu_copy.c",
|
|
"c87bbba0d37b7ac14a3f3ab8a0cbb7bf6b6f2a56"
|
|
],
|
|
[
|
|
"src/ipu_copy.h",
|
|
"27e150b6a249af6eb14987aefdf856fe45455f2c"
|
|
],
|
|
[
|
|
"src/jobstream.c",
|
|
"9776f7c525057dea7a9ced20987dd10592d85b0e"
|
|
],
|
|
[
|
|
"src/jobstream.h",
|
|
"2ce465885dabf0dc91b0a4ab18c90ecc91fd3be1"
|
|
],
|
|
[
|
|
"src/led.c",
|
|
"0a80fa9c983416b9dc8610b30b65de16416e285d"
|
|
],
|
|
[
|
|
"src/led.h",
|
|
"22f72dfb34519d1f7a071984560763cf6ba74816"
|
|
],
|
|
[
|
|
"src/lens.c",
|
|
"d78ec7da0ab1893889efc4692d65f85efa4d8290"
|
|
],
|
|
[
|
|
"src/lens.h",
|
|
"d157a98cffcddb1bc9d405f1779e2c494c92ef17"
|
|
],
|
|
[
|
|
"src/lenshome.c",
|
|
"219e8d95c700ec20c5c703c5d334af6b4f8d80ea"
|
|
],
|
|
[
|
|
"src/lenshome.h",
|
|
"eaf10e197aad7e040bd22f117c186b6de636dd2d"
|
|
],
|
|
[
|
|
"src/liveness.c",
|
|
"b36f18e738e9b88680ed4cabd4f7b165b85f8369"
|
|
],
|
|
[
|
|
"src/liveness.h",
|
|
"88ae53c31c80386b5daf570b77c806c978357061"
|
|
],
|
|
[
|
|
"src/logs.c",
|
|
"558db5a093de4df2a8e15e2c8731c412c0a6cf2e"
|
|
],
|
|
[
|
|
"src/logs.h",
|
|
"aad504323d01627cd41ee0ea7aec1fda32929163"
|
|
],
|
|
[
|
|
"src/main.c",
|
|
"f2174bc81e0f368ea38e983f10ff365368eefe3f"
|
|
],
|
|
[
|
|
"src/mp4mux.c",
|
|
"90dae21b0bca1fd1b84d2ed308d229e9685922bc"
|
|
],
|
|
[
|
|
"src/mp4mux.h",
|
|
"36cfe2f67d643fe114ab279caba5b9da388dfd22"
|
|
],
|
|
[
|
|
"src/paths.h",
|
|
"6edaf15b1db6f039186f39e10c4dba12a239aeb7"
|
|
],
|
|
[
|
|
"src/peer.c",
|
|
"e2fdf6aad48fbc6861bf5846fafa64ac79064f8d"
|
|
],
|
|
[
|
|
"src/peer.h",
|
|
"705b548996451c32141db3b545b3e6f7b721c480"
|
|
],
|
|
[
|
|
"src/recordhtml.c",
|
|
"c23d1957cfded491cd541937ce092ac38443f96d"
|
|
],
|
|
[
|
|
"src/recordhtml.h",
|
|
"a0088d926c8edadcbf884372b77f5974d54da6de"
|
|
],
|
|
[
|
|
"src/relcheck.c",
|
|
"3438cd67649ed19ce522ae8b4aeba09a92c42be0"
|
|
],
|
|
[
|
|
"src/relcheck.h",
|
|
"77748d7dc5074414eabb58e47486ff40b040ec80"
|
|
],
|
|
[
|
|
"src/sanitize.c",
|
|
"09abdc633301b437c4deac6713888892b0187250"
|
|
],
|
|
[
|
|
"src/sanitize.h",
|
|
"b52ae3da495e4d6308f59b4ec4105e99debe910b"
|
|
],
|
|
[
|
|
"src/session.c",
|
|
"db815c861cb91ca4909ea8d01ba7faad4a436081"
|
|
],
|
|
[
|
|
"src/session.h",
|
|
"2b05c01cb2bbef6056a090cce333e514626bc957"
|
|
],
|
|
[
|
|
"src/settings.c",
|
|
"33338d8c2b7f073fe300373352250505796e3596"
|
|
],
|
|
[
|
|
"src/settings.h",
|
|
"a2c073b5beefac147237367cd859bbac43f0c134"
|
|
],
|
|
[
|
|
"src/setup.c",
|
|
"8ff610b31567fed823e731b2a099cec7f9931e3f"
|
|
],
|
|
[
|
|
"src/setup.h",
|
|
"751d71f7dce700dd2023961288fdb9e4485b9985"
|
|
],
|
|
[
|
|
"src/sha256.c",
|
|
"b8b38167cec8a586055093c6a120624049b08632"
|
|
],
|
|
[
|
|
"src/sha256.h",
|
|
"a8806a440e43d96866735a1da17d590491b6d55a"
|
|
],
|
|
[
|
|
"src/sheet.c",
|
|
"54b690d95cd6f78928fc968500ca566676b91ed4"
|
|
],
|
|
[
|
|
"src/sheet.h",
|
|
"b7fc62399bb193f62bb690d10341c06c878c0436"
|
|
],
|
|
[
|
|
"src/sheetid.c",
|
|
"aa63f45a50d7874e0aa2922ce21339ff17cbb5c5"
|
|
],
|
|
[
|
|
"src/sheetid.h",
|
|
"fe25e6648df6be8a8fb640f63e84338c342da6a6"
|
|
],
|
|
[
|
|
"src/status.c",
|
|
"fd6d1bbd1cc805dcc6d255a1aa482823f5ee47b1"
|
|
],
|
|
[
|
|
"src/status.h",
|
|
"96d5515b53af72b219dca81ab49223f8dd6b6b8a"
|
|
],
|
|
[
|
|
"src/super.c",
|
|
"3a5be1a117ccaf2d6435446ab3240b1b772a9774"
|
|
],
|
|
[
|
|
"src/super.h",
|
|
"3b38086a8fa9a01a2c0759732e145aaf1c8795fa"
|
|
],
|
|
[
|
|
"src/tls.c",
|
|
"f16f2262c9fe71642900d8ede90f7b7d0acd7244"
|
|
],
|
|
[
|
|
"src/tls.h",
|
|
"95c16e4514a53025e7385564f0e0528303b12b09"
|
|
],
|
|
[
|
|
"src/ui.h",
|
|
"1f1a14cb062e9220afad0e34cc582aab2fe2c9a4"
|
|
],
|
|
[
|
|
"src/ui/embed.cmake",
|
|
"100117410761b09d6884878cb0ed19abb8ec75c3"
|
|
],
|
|
[
|
|
"src/ui/embed_docs.cmake",
|
|
"91bf8bfe00694143ec6c28b146e81563e0db8dbe"
|
|
],
|
|
[
|
|
"src/ui/forms.js",
|
|
"c7e8527fdbd727065f53bed2a47fe2b5b2a8f86e"
|
|
],
|
|
[
|
|
"src/ui/help.js",
|
|
"a72ef30263967ca817213239fb9c0b9ebd94b24c"
|
|
],
|
|
[
|
|
"src/ui/index.html",
|
|
"7a96929e4aa414937aab20fcb83c6e3ebad43941"
|
|
],
|
|
[
|
|
"src/ui/login.html",
|
|
"22acf58351a5a874cd2ffc2a3309fe43e8a94116"
|
|
],
|
|
[
|
|
"src/ui/login.js",
|
|
"d38480ff1f4eb67b2e2c356b2f2a2b82a2656fd4"
|
|
],
|
|
[
|
|
"src/ui/md.js",
|
|
"e879a630efd6a53b6ed16d5a4052f6b8ced21a5b"
|
|
],
|
|
[
|
|
"src/ui/panel.js",
|
|
"7f9d9240870841834b85a3342ffb91e98c54a4d2"
|
|
],
|
|
[
|
|
"src/ui/regions.js",
|
|
"42b6da0673a3aa5d196c9f661877acf63b119da7"
|
|
],
|
|
[
|
|
"src/ui/theme.css",
|
|
"bdd2c9a0290b058d6b0e46cb665e0d2b03ba3002"
|
|
],
|
|
[
|
|
"src/ui/vendor/LICENSE",
|
|
"fa7c00bc4ebd5dc9c0b1e7f8c4b6a202fd9fa816"
|
|
],
|
|
[
|
|
"src/ui/vendor/bootstrap.bundle.min.js",
|
|
"881b51776c82ddd6bd7225fb03f6e9bb07f53c40"
|
|
],
|
|
[
|
|
"src/ui/vendor/bootstrap.min.css",
|
|
"c558c23e686c9473d35abc3aa3b16cec11b6f7d7"
|
|
],
|
|
[
|
|
"src/ui/wizard.css",
|
|
"30b20aa34d87b61fe358d8bad8f8ece10804f667"
|
|
],
|
|
[
|
|
"src/ui/wizard.html",
|
|
"ecacdd8fc719234013bb8ff6a140a75ae8d86103"
|
|
],
|
|
[
|
|
"src/ui/wizard.js",
|
|
"26b13cb020c160e825f606d81a34080f2137bb35"
|
|
],
|
|
[
|
|
"src/update.c",
|
|
"bf4e489166bf252ab5f5ca48b4c552c2b7748c52"
|
|
],
|
|
[
|
|
"src/update.h",
|
|
"8fb161a46fccacc72c50b7bf0acc4bf6b6d3d40f"
|
|
],
|
|
[
|
|
"src/users.c",
|
|
"2a624ff9c32eacda78375f079b3b057ec7e5056a"
|
|
],
|
|
[
|
|
"src/users.h",
|
|
"57fc30cdfba07f69296821028ac874a208bae4dc"
|
|
],
|
|
[
|
|
"src/vpu_h264.c",
|
|
"2a3d9ea5b5930403d3a0bc698e36aeee2b9c4a6e"
|
|
],
|
|
[
|
|
"src/vpu_h264.h",
|
|
"ea40e0fd3098522d590ab0ec19fc4006e6682caa"
|
|
],
|
|
[
|
|
"src/vpu_jpeg.c",
|
|
"917baa19432793d86bb7c28d415e8c0e817366a5"
|
|
],
|
|
[
|
|
"src/vpu_jpeg.h",
|
|
"f33954985eca5b49bce91056ea5d1c8450b7d846"
|
|
],
|
|
[
|
|
"src/wiz.c",
|
|
"8094d62579ed3e99e225593f5d47de54ec883b05"
|
|
],
|
|
[
|
|
"src/wiz.h",
|
|
"96732c9791d6996123d21ee4130a9d2f0af00e53"
|
|
],
|
|
[
|
|
"src/wizcalc.c",
|
|
"05f25aea3932a3f814ac430a3c15439aa4247ac6"
|
|
],
|
|
[
|
|
"src/wizcalc.h",
|
|
"e7914a6c4753ce771be9a3600a797ac358dd26f5"
|
|
],
|
|
[
|
|
"src/wizdark.c",
|
|
"519f115603a3b6f96d71396add8182faa11a0f6a"
|
|
],
|
|
[
|
|
"src/wizdark.h",
|
|
"ba3e27f4a2fb56cbe788027f949dd4f5c93f0fa2"
|
|
],
|
|
[
|
|
"src/wizlive.c",
|
|
"de57e22629dba670924d5f03b66df42512799720"
|
|
],
|
|
[
|
|
"src/wizlive.h",
|
|
"1f95d7a4424d145bbae79880003ba3e014c9aa0b"
|
|
],
|
|
[
|
|
"src/wizrun.h",
|
|
"c7327306a6f6d2bbd242f0d5c05f8c333043cb70"
|
|
],
|
|
[
|
|
"tests/accel_test.c",
|
|
"58efc7af80341548045169074ccf64f8fc3fb326"
|
|
],
|
|
[
|
|
"tests/airflow_test.c",
|
|
"79e3ba5b2aa5f45c21dab0fca3b3aa1427c607d0"
|
|
],
|
|
[
|
|
"tests/auth_peer_test.c",
|
|
"ac5994496f50a021b6e1bab6d211ad948a4d5244"
|
|
],
|
|
[
|
|
"tests/camhealth_test.c",
|
|
"32aecc993f1192c343262636b214d590a9ccf94f"
|
|
],
|
|
[
|
|
"tests/camkey_test.c",
|
|
"ee3838d49d5a3246c89bdddae3116180154e2dbb"
|
|
],
|
|
[
|
|
"tests/cool_fanwrite_test.c",
|
|
"b18534f296a2a43f198dc1daa393ff0fa41db93e"
|
|
],
|
|
[
|
|
"tests/cool_flow_test.c",
|
|
"5197b10bb3a28ffafe67bc981f0793966daa37c1"
|
|
],
|
|
[
|
|
"tests/cool_gate_test.c",
|
|
"fad8afe6f27797381ae137debdba535d3f5a5a8c"
|
|
],
|
|
[
|
|
"tests/coolfmt_test.c",
|
|
"f6d209c769d21a6b99815d7a77d405fa8109fda4"
|
|
],
|
|
[
|
|
"tests/curverec_fit_test.c",
|
|
"8229d90ee60ad04eea4a09fac038f9d1b8060553"
|
|
],
|
|
[
|
|
"tests/debayer_test.c",
|
|
"56c4fe062c73fd5e878cc6cac906ab883e6c15b5"
|
|
],
|
|
[
|
|
"tests/enclosure_wait_test.c",
|
|
"a888b9e19b5ccfe53d8ac02b8cc30e9315def772"
|
|
],
|
|
[
|
|
"tests/fflog_e2e.sh",
|
|
"af437b98b34d31f4f4c0c0fa45583e99e897cd32"
|
|
],
|
|
[
|
|
"tests/fflog_e2e_test.c",
|
|
"0a69f4e6e36549966713827fabbd6d585efa222c"
|
|
],
|
|
[
|
|
"tests/jobstream_test.c",
|
|
"93d51e74b57e6bacfa13128e3dd22a3d70ed67e2"
|
|
],
|
|
[
|
|
"tests/lens_test.c",
|
|
"acf677522523eb55daf79c795a47ca6af9814902"
|
|
],
|
|
[
|
|
"tests/lenshome_test.c",
|
|
"5221adf9d27ef645b4766356b39c9f882823ff06"
|
|
],
|
|
[
|
|
"tests/lid_gate_test.c",
|
|
"bd2c5a2aaedb1cf5d3008a5633cc1c02c485787d"
|
|
],
|
|
[
|
|
"tests/mp4mux_test.c",
|
|
"2406647623a9ef83a6b91c5b932a95a282586818"
|
|
],
|
|
[
|
|
"tests/recordhtml_test.c",
|
|
"0c17708a1b7bdb8d3547fa6b8a8c92c916ff75fe"
|
|
],
|
|
[
|
|
"tests/relcheck_test.c",
|
|
"4276bb3a0d7cf5b618410e75748f2a68dffbf345"
|
|
],
|
|
[
|
|
"tests/sanitize_test.c",
|
|
"add2169b6d0bcd25624669afd78da58683408d78"
|
|
],
|
|
[
|
|
"tests/setup_test.c",
|
|
"8395da6ed10243455a8c258d4530b34529ea7a82"
|
|
],
|
|
[
|
|
"tests/sha256_test.c",
|
|
"017ef369f6bff5cc0827dc74aeb1189843b052ca"
|
|
],
|
|
[
|
|
"tests/sheet_test.c",
|
|
"fca9b93935061c2fe3a680ba9b6ddb93c0d18e34"
|
|
],
|
|
[
|
|
"tests/sheetid_test.c",
|
|
"bc923a6fea6e58461676774ee98f8b9b65c078d4"
|
|
],
|
|
[
|
|
"tests/status_grbl_test.c",
|
|
"a8d8f5bb7038bdcff4fc369fa50d757d4b393f8b"
|
|
],
|
|
[
|
|
"tests/status_idle_test.c",
|
|
"48e82d35051f383e33fbb0848fe85821fd48b4d3"
|
|
],
|
|
[
|
|
"tests/status_sys_test.c",
|
|
"d1205ff4fda9d2a8e5ccac0408bb2600d1df3dc9"
|
|
],
|
|
[
|
|
"tests/super_test.c",
|
|
"c3c052c6dfcf3c86c5f1ceefff4a7e83b92c67c9"
|
|
],
|
|
[
|
|
"tests/test_devserver_mock.py",
|
|
"c1bb5953cfbb413852ad5958b1d420eb607430db"
|
|
],
|
|
[
|
|
"tests/tls_test.c",
|
|
"ab6d7780746c7e20de48eef9202ce21a03f46a26"
|
|
],
|
|
[
|
|
"tests/users_test.c",
|
|
"d447b90ec43e878b1b8b6f9b594bfe043a68a035"
|
|
],
|
|
[
|
|
"tests/wizcalc_test.c",
|
|
"ffdceb20d528cd0424c65d358d35ca49099a9200"
|
|
],
|
|
[
|
|
"tools/devserver.py",
|
|
"fb5f4f677e1a8ea0bfd7fdc1b71fc4d9d78def31"
|
|
],
|
|
[
|
|
"tools/hershey_gen.py",
|
|
"d2e09fec7c28f41aa37af06f57cdd75a3a0b3d8d"
|
|
]
|
|
],
|
|
"pv": "0.1.27",
|
|
"recipes": [
|
|
"forgectrl"
|
|
],
|
|
"source": "git://github.com/openglow-org/forgectrl.git",
|
|
"srcrev": "0dae758cb93e1461034aaa58f4b9fc22edc68367"
|
|
},
|
|
"forgefirm-app": {
|
|
"component": "forgefirm-app",
|
|
"files": [
|
|
[
|
|
".gitattributes",
|
|
"1b30e1b56dcc0411c10ee780053d04f1c9d862e1"
|
|
],
|
|
[
|
|
".github/workflows/host-tests.yml",
|
|
"58584524c1d484feb3ca9e4b3f1cc8bc1b4e6516"
|
|
],
|
|
[
|
|
".gitignore",
|
|
"2d6f9ccefa02c61cfd5cabc2d8b171025eadce09"
|
|
],
|
|
[
|
|
"AGENTS.md",
|
|
"620fcc0024033e662602ff361b45ce164bed2ff6"
|
|
],
|
|
[
|
|
"CONTRIBUTING.md",
|
|
"ca2a98e7d617e1bca2b2f814a598e94f89186c6e"
|
|
],
|
|
[
|
|
"LICENSE",
|
|
"d80cdb21e95685fdf696b2e01895bae8114ff927"
|
|
],
|
|
[
|
|
"LICENSE.LGPL-2.1",
|
|
"04bb156e77d5714dc2ee29bd0a37f16532ec741c"
|
|
],
|
|
[
|
|
"MANIFEST.in",
|
|
"e88a5f7bb02d90ece462ac8f196691fc5f1a61b6"
|
|
],
|
|
[
|
|
"README.md",
|
|
"d730969bc812a458c370bede7a23213a3c57499a"
|
|
],
|
|
[
|
|
"forgefirm-app/ffmachine.py",
|
|
"f12e15645decdbdbc95f9b5297704a440d205d27"
|
|
],
|
|
[
|
|
"forgefirm-app/gfcloud.init",
|
|
"0eb7c8d367315510ab492a13d6b28cbbb6fa860d"
|
|
],
|
|
[
|
|
"forgefirm-app/gfcloud.py",
|
|
"0a0d9868078df5c20f0234efdd3d111efa628436"
|
|
],
|
|
[
|
|
"forgefirm-app/gfhome.conf.sample",
|
|
"d00bf0e00c8a795443f95c6f227c8d8df3291869"
|
|
],
|
|
[
|
|
"forgefirm-app/gfhome.py",
|
|
"d6d925b5560875b29fe78b1da072488b61d9cf3a"
|
|
],
|
|
[
|
|
"gfhardware/__init__.py",
|
|
"d4145850379d8919241f1de6d5148f275146987d"
|
|
],
|
|
[
|
|
"gfhardware/_common.py",
|
|
"d431911c90c0fea6bf3d8d869c8fbd23c3ff398c"
|
|
],
|
|
[
|
|
"gfhardware/cam.py",
|
|
"dd082c7c91e5ce5a1932585d454185d1558863f7"
|
|
],
|
|
[
|
|
"gfhardware/cnc.py",
|
|
"63f3d5a5544bb602ae8efd2b11c69c4ae84fc502"
|
|
],
|
|
[
|
|
"gfhardware/cooling.py",
|
|
"418a689e7958efbb39606848436b2c63dbec476d"
|
|
],
|
|
[
|
|
"gfhardware/coolsvc.py",
|
|
"0345354b46e1680ea0911969b72752d3db3525ff"
|
|
],
|
|
[
|
|
"gfhardware/feeder.py",
|
|
"1387fd8f640d91bb58dc4ddfe9134c8d1335a240"
|
|
],
|
|
[
|
|
"gfhardware/id.py",
|
|
"3ad32e9a32a097dd5b916621ca70f4813effe2c1"
|
|
],
|
|
[
|
|
"gfhardware/input/__init__.py",
|
|
"02c064daf4e04ace8c8f318dc0254b9cbe22a610"
|
|
],
|
|
[
|
|
"gfhardware/leds.py",
|
|
"354d71cef35bcb714129fd216fa38951ddedb97f"
|
|
],
|
|
[
|
|
"gfhardware/machine.py",
|
|
"dcea1652c678af140d309b65c7aa85b2120f1f6e"
|
|
],
|
|
[
|
|
"gfhardware/src/bayer.c",
|
|
"61a1b9d54b8a4e718b4c55af7ae601a8840876ce"
|
|
],
|
|
[
|
|
"gfhardware/src/bayer.h",
|
|
"499f91dd8f22d21f6e91da2f7d3f13b55a88cbf5"
|
|
],
|
|
[
|
|
"gfhardware/src/evdev.c",
|
|
"723630aee75f46995aee59552e5ef48d08ee5a18"
|
|
],
|
|
[
|
|
"gfhardware/src/gfcam.c",
|
|
"b0900f0e1ca94ecd30c922f2459011b1729f0227"
|
|
],
|
|
[
|
|
"gfhardware/switches.py",
|
|
"80fd05df3f629f246eb480bd7d9c03bd9c9eb6ec"
|
|
],
|
|
[
|
|
"gfhardware/utils/__init__.py",
|
|
"e69de29bb2d1d6434b8b29ae775ad8c2e48c5391"
|
|
],
|
|
[
|
|
"gfhardware/utils/capture.py",
|
|
"ebf94278b686f9838e82d8024a9bf9511f91a951"
|
|
],
|
|
[
|
|
"gfhardware/z_axis.py",
|
|
"2a27d0f3bbd2f3fb45ba67a65f9b861455dc3900"
|
|
],
|
|
[
|
|
"requirements.txt",
|
|
"1e3c0f0dc607867f671e470f039971a81e4a6c47"
|
|
],
|
|
[
|
|
"setup.py",
|
|
"3ef5a500f23461b0ad9ed86388f009edafb1fcac"
|
|
],
|
|
[
|
|
"tests/test_cam_lid_gate.py",
|
|
"d97dc1af7d46d3c1c2ee1861ea44e344063423dc"
|
|
],
|
|
[
|
|
"tests/test_feeder.py",
|
|
"8dd86655b52495a9247b5ae968ae777b5e7365a6"
|
|
],
|
|
[
|
|
"tests/test_ffmachine_agent.py",
|
|
"79e0927955c7b5f00b9032f72f9fab9284e5b4f6"
|
|
],
|
|
[
|
|
"tests/test_ffmachine_emulator.py",
|
|
"5de6c0f6359616f1e253f9c3c047180a9f106440"
|
|
],
|
|
[
|
|
"tests/test_ffmachine_park.py",
|
|
"e83d97622e8807657374c87ea443f4ba1ef7ba58"
|
|
],
|
|
[
|
|
"tests/test_gfhome_exit.py",
|
|
"d78d5def849e143687558d4e53931cd4c3549584"
|
|
],
|
|
[
|
|
"tests/test_limits.py",
|
|
"25966007bac504ff75c8e5c19339c231ca43af51"
|
|
],
|
|
[
|
|
"tests/test_machine_lid_button.py",
|
|
"c7dc110f5e4c77b854b4903d8102dbfa9c156dae"
|
|
],
|
|
[
|
|
"tests/test_pulse_body.py",
|
|
"29a868bb3aa60bcdaf8e23f13a24f32eca1e433f"
|
|
]
|
|
],
|
|
"pv": "0.1.30+git",
|
|
"recipes": [
|
|
"gfcloud",
|
|
"gfhome",
|
|
"python3-ffmachine"
|
|
],
|
|
"source": "git://github.com/openglow-org/python3-gfhardware.git",
|
|
"srcrev": "6cc4f45d311ab451c7d72dee009103e55a749675"
|
|
},
|
|
"forgetest": {
|
|
"component": "forgetest",
|
|
"files": [
|
|
[
|
|
".pytest_cache/.gitignore",
|
|
"bc1a1f6167d09c909aad37280b760bb715d0f1da"
|
|
],
|
|
[
|
|
".pytest_cache/CACHEDIR.TAG",
|
|
"fce15ad7eaa74e5682b644c84efb75334c112f95"
|
|
],
|
|
[
|
|
".pytest_cache/README.md",
|
|
"b89018ced91c0a8af7f3f23ce8901870da89f3a0"
|
|
],
|
|
[
|
|
".pytest_cache/v/cache/nodeids",
|
|
"0637a088a01e8ddab3bf3fa98dbe804cbde1a0dc"
|
|
],
|
|
[
|
|
"__init__.py",
|
|
"b4d2c6eaad4cca91f8369c4ced3cb52e0bb3bb54"
|
|
],
|
|
[
|
|
"__main__.py",
|
|
"45688ce67145df1f155a5a14f52735fb44821ea9"
|
|
],
|
|
[
|
|
"artifact.py",
|
|
"e7d8cdaefe0679f8e091043a9849c95327178942"
|
|
],
|
|
[
|
|
"baseline.py",
|
|
"5366319ed9ee376c025a1ea99ae2c0acc20019ee"
|
|
],
|
|
[
|
|
"bench.py",
|
|
"8462d75fb5fcd8f20ac286d03f42eefcb1515dbf"
|
|
],
|
|
[
|
|
"campaign.py",
|
|
"0e937d9b600fe21651085dee8987dd7db9bdf2d7"
|
|
],
|
|
[
|
|
"catalog.py",
|
|
"4fcf183993efcfbfacb28189e39a8d23c0d7cf9d"
|
|
],
|
|
[
|
|
"coverage.py",
|
|
"343e3363a65cb5370d6c9231d1442c5b9d8861b1"
|
|
],
|
|
[
|
|
"fixture.py",
|
|
"e57aa917c9c6762ed5671b6f6c9979399e3dc146"
|
|
],
|
|
[
|
|
"hw.py",
|
|
"1259d46320d9adeb81e89f811e81a24959781a63"
|
|
],
|
|
[
|
|
"log.py",
|
|
"8df1445460358bca4027d1a4a49189ba13dbc0de"
|
|
],
|
|
[
|
|
"manifest.py",
|
|
"aecb3cfab5753c518f47dd13100300c22c2d49e7"
|
|
],
|
|
[
|
|
"page.py",
|
|
"c6c3579acd78578aebf7404cac589d07eaf4c55b"
|
|
],
|
|
[
|
|
"puls.py",
|
|
"07bf06dd7f119ad59b1ecbf4295e9d4c4ce92d0d"
|
|
],
|
|
[
|
|
"redact.py",
|
|
"f445da45df0e36c8dcb6b17d0a851610880e3ce3"
|
|
],
|
|
[
|
|
"runner.py",
|
|
"85b4f877cc10db500e00f4c1d0029bec57ba0272"
|
|
],
|
|
[
|
|
"server.py",
|
|
"70d3bc5bc1c2299264a5f4576e7d664ed71f860c"
|
|
],
|
|
[
|
|
"suite/__init__.py",
|
|
"74c793086c6ee42b02804ed4472af50e4792950b"
|
|
],
|
|
[
|
|
"suite/camera.py",
|
|
"997a4b1b9a04f390e2e9be2035f83eaaffc6623b"
|
|
],
|
|
[
|
|
"suite/cloud.py",
|
|
"3fe7c27a178cc348f8165ad511e3a8808cd6c0cd"
|
|
],
|
|
[
|
|
"suite/commission.py",
|
|
"96e3e11396ed56370d09dea874c2e3466fd3c4a4"
|
|
],
|
|
[
|
|
"suite/commission_dark.py",
|
|
"8f1a809b2bbdf9955e22815197a0c21d91e67d45"
|
|
],
|
|
[
|
|
"suite/commission_sheet.py",
|
|
"6725e92e0219e962ed9f2e89246308b2f4c1e2ef"
|
|
],
|
|
[
|
|
"suite/cooling.py",
|
|
"63bebe9e4679ba03b227e50918d5ec87a8af3c4f"
|
|
],
|
|
[
|
|
"suite/forgectrl.py",
|
|
"76b22f142b3858ffb87ec5381ef450377a6bb84d"
|
|
],
|
|
[
|
|
"suite/image.py",
|
|
"d1f7d824af9f9f5977baa9a3157daf943a5d0910"
|
|
],
|
|
[
|
|
"suite/kernel.py",
|
|
"3df2be14eea6020ca998ec3e624beeb0dcb8c855"
|
|
],
|
|
[
|
|
"suite/laser.py",
|
|
"783ce75ca8701172201dec108e82eac3aec5a1f8"
|
|
],
|
|
[
|
|
"suite/logs.py",
|
|
"bbea194ee2d39422cb7fdee2888da93cd1b08d63"
|
|
],
|
|
[
|
|
"suite/motion.py",
|
|
"6cfd1d12354c2f43608db7ef528dc26cf6b24f3f"
|
|
],
|
|
[
|
|
"suite/setup.py",
|
|
"a782d8f0ad31560b3c706f4647455dc936a63e3b"
|
|
],
|
|
[
|
|
"suite/setup_dark.py",
|
|
"64f4cf378dda21917d29d26cef22d67b14205b97"
|
|
],
|
|
[
|
|
"suite/setup_sheet.py",
|
|
"26e6d1a8066886243ec5b1eb1151129b1b6a01c5"
|
|
],
|
|
[
|
|
"suite/update.py",
|
|
"fc313a11e2b9806ef417d0f93fa54c21c60e2c5b"
|
|
],
|
|
[
|
|
"ui/app.js",
|
|
"fa9674b2ca941800907e93559825b42911152945"
|
|
],
|
|
[
|
|
"ui/help.js",
|
|
"761a503f2f50c1e519185dcfd47c1caa2de29fb4"
|
|
],
|
|
[
|
|
"ui/index.html",
|
|
"036e239f1196844ca2ac13df1dba59ca1c0bd060"
|
|
],
|
|
[
|
|
"ui/page.css",
|
|
"b76d4361af04596b79285a55cc205d05a0491a44"
|
|
],
|
|
[
|
|
"ui/theme.css",
|
|
"bdd2c9a0290b058d6b0e46cb665e0d2b03ba3002"
|
|
],
|
|
[
|
|
"ui/vendor/LICENSE",
|
|
"fa7c00bc4ebd5dc9c0b1e7f8c4b6a202fd9fa816"
|
|
],
|
|
[
|
|
"ui/vendor/bootstrap.bundle.min.js",
|
|
"881b51776c82ddd6bd7225fb03f6e9bb07f53c40"
|
|
],
|
|
[
|
|
"ui/vendor/bootstrap.min.css",
|
|
"c558c23e686c9473d35abc3aa3b16cec11b6f7d7"
|
|
]
|
|
],
|
|
"pv": "1.0",
|
|
"recipes": [
|
|
"forgetest"
|
|
],
|
|
"source": "files",
|
|
"srcrev": null
|
|
},
|
|
"grblhal-glowforge": {
|
|
"component": "grblhal-glowforge",
|
|
"files": [
|
|
[
|
|
".gitattributes",
|
|
"1b30e1b56dcc0411c10ee780053d04f1c9d862e1"
|
|
],
|
|
[
|
|
".github/workflows/build.yml",
|
|
"09c5ffbd0462a583b4156f2687ea0267fb73a211"
|
|
],
|
|
[
|
|
".gitignore",
|
|
"4bda5643103df4c29ca3dbad4c841a738cee1b1a"
|
|
],
|
|
[
|
|
".gitmodules",
|
|
"d5e7f2dead5cfb1b00fd67e4355991eb35658914"
|
|
],
|
|
[
|
|
"AGENTS.md",
|
|
"75527eaf3fd3299a9b504cf9d4765fd7519750a8"
|
|
],
|
|
[
|
|
"CMakeLists.txt",
|
|
"57d9090f5060ba41f958a20cb396001f7a4de295"
|
|
],
|
|
[
|
|
"CONTRIBUTING.md",
|
|
"ca2a98e7d617e1bca2b2f814a598e94f89186c6e"
|
|
],
|
|
[
|
|
"COPYING",
|
|
"96d5f44439ba4cecf32c1b46ed3a76fc7749488b"
|
|
],
|
|
[
|
|
"README.md",
|
|
"8441770a220eb2550ef1528df25f5cf7f52706e3"
|
|
],
|
|
[
|
|
"src/bind_addr.c",
|
|
"3ca3b27ed265c0c52e25eca97291c2e5f20a0b1d"
|
|
],
|
|
[
|
|
"src/bind_addr.h",
|
|
"2e3250924b9d757eea4872c6fac2d3830b11dc1b"
|
|
],
|
|
[
|
|
"src/boards/glowforge.h",
|
|
"dbb357c6ab412065e710ff5330b3a488a96e992d"
|
|
],
|
|
[
|
|
"src/build_info.h.in",
|
|
"9741f1b5f5c8efbd539dea783b0481339e88f0b2"
|
|
],
|
|
[
|
|
"src/driver.c",
|
|
"f1cfe4b286991e97cec846a77dee4e666218cc0f"
|
|
],
|
|
[
|
|
"src/driver.h",
|
|
"1e2e734779a8565c6b00e69c98d31134428cac5f"
|
|
],
|
|
[
|
|
"src/eeprom.c",
|
|
"eed4727a479c43704881b62659f6825eb514ebd1"
|
|
],
|
|
[
|
|
"src/eeprom.h",
|
|
"07be4c8c8b1e432824cb3c791915b18836c9997e"
|
|
],
|
|
[
|
|
"src/fflog.c",
|
|
"cdeb518386db022df74cbfff89008bf17f5a864c"
|
|
],
|
|
[
|
|
"src/fflog.h",
|
|
"905314b0d5be06487faecdf97720e23d2506bb4e"
|
|
],
|
|
[
|
|
"src/glowforge_cooling.c",
|
|
"144d6782d23d47edde5fc15da543e1bfe9a807fd"
|
|
],
|
|
[
|
|
"src/glowforge_cooling.h",
|
|
"1241c079c4d685bc3d51fa15517a5ad40be3354b"
|
|
],
|
|
[
|
|
"src/glowforge_homing.c",
|
|
"25e705a159afea0223a87183444eee4901d17848"
|
|
],
|
|
[
|
|
"src/glowforge_homing.h",
|
|
"080cd3d4fe7d071a5667ce4e63f3c9f6cdcb2beb"
|
|
],
|
|
[
|
|
"src/glowforge_io.c",
|
|
"5c82d8abdb1f18ce5bcb903843165c011e25b5de"
|
|
],
|
|
[
|
|
"src/glowforge_io.h",
|
|
"ddb4082c7a1949b33f1389e49aa801f8f5fc49ea"
|
|
],
|
|
[
|
|
"src/glowforge_laser.c",
|
|
"29767c8ff4579cfdd9a89667fd9e437010a3b6fe"
|
|
],
|
|
[
|
|
"src/glowforge_laser.h",
|
|
"bc500d8c8fc5d8cd851d3a4649342bbe83f67eee"
|
|
],
|
|
[
|
|
"src/glowforge_status.c",
|
|
"7b023cca48005d4522d6c8bc6968e4aeb60e4bd6"
|
|
],
|
|
[
|
|
"src/glowforge_status.h",
|
|
"fe2775d53d8cca766c6e82e68dbeb590a3fd1e67"
|
|
],
|
|
[
|
|
"src/glowforge_switch_map.h",
|
|
"ea33a30bd29a6945599023db3fd3858a21cefae7"
|
|
],
|
|
[
|
|
"src/glowforge_switches.c",
|
|
"cab12fb1f1877f2410037534a66d88f4264bbc42"
|
|
],
|
|
[
|
|
"src/glowforge_switches.h",
|
|
"1599275423c12be35c5afe79e21006bbc2efa005"
|
|
],
|
|
[
|
|
"src/grbl",
|
|
"362577d10ce2a4ec47b0a1ba0d5eefc3fbe0fd75"
|
|
],
|
|
[
|
|
"src/grbl/.gitattributes",
|
|
"eb84b66b54a17195a184d5533e31919eb25c591c"
|
|
],
|
|
[
|
|
"src/grbl/.gitignore",
|
|
"572825f878d3b06754a0d2de957b14d2e26936b5"
|
|
],
|
|
[
|
|
"src/grbl/CMakeLists.txt",
|
|
"c537b82256f2fff209d9f365e73ed1a9587b0c8c"
|
|
],
|
|
[
|
|
"src/grbl/COPYING",
|
|
"c7d0e6fe45d03d4e29d624028fc3b62290bfeed2"
|
|
],
|
|
[
|
|
"src/grbl/README.md",
|
|
"45d02b077e10751a55960dbde16bcc7211e428a2"
|
|
],
|
|
[
|
|
"src/grbl/alarms.c",
|
|
"15d0227bafbf82c4c1e8f25be7c4d443e3506fe8"
|
|
],
|
|
[
|
|
"src/grbl/alarms.h",
|
|
"155b9a554c29608fdbc8ccbe1aba2a1a0151f960"
|
|
],
|
|
[
|
|
"src/grbl/canbus.c",
|
|
"b6936088c468a206a9c9191c69eee6ce47264101"
|
|
],
|
|
[
|
|
"src/grbl/canbus.h",
|
|
"f402f267305362127bc404774979eae55cc5fc57"
|
|
],
|
|
[
|
|
"src/grbl/changelog.md",
|
|
"debb326e818ae169b69d444db793e91624578cd9"
|
|
],
|
|
[
|
|
"src/grbl/config.h",
|
|
"e8c5be6be125e1911c41d4357617e4390521c265"
|
|
],
|
|
[
|
|
"src/grbl/coolant_control.c",
|
|
"6855fabef299cf61bbbe4d5a74dba8642e6b855a"
|
|
],
|
|
[
|
|
"src/grbl/coolant_control.h",
|
|
"e7452e66b5fb2dbda5d1bbc1e8350ba90380d72c"
|
|
],
|
|
[
|
|
"src/grbl/core_handlers.h",
|
|
"5ef428f6418d121b3e4c036e8c02cd9dbfd58720"
|
|
],
|
|
[
|
|
"src/grbl/crc.c",
|
|
"09059d75ac2e079f12d5c702107352ec33448ca7"
|
|
],
|
|
[
|
|
"src/grbl/crc.h",
|
|
"c4ddda03c2db722060a5afa0706887669e8bca4d"
|
|
],
|
|
[
|
|
"src/grbl/crossbar.c",
|
|
"b92a6c5e9f362b1c58213195c73f9c0d101f4d66"
|
|
],
|
|
[
|
|
"src/grbl/crossbar.h",
|
|
"5ba1b7bbf936efcb16a9ecdd5bc1adfb4bfac238"
|
|
],
|
|
[
|
|
"src/grbl/driver_opts.h",
|
|
"bc90fa27f1050f7ec9d7a7e9e872eb9dd7d4137b"
|
|
],
|
|
[
|
|
"src/grbl/driver_opts2.h",
|
|
"5e35543175bb53b2e7d32e92e7681649c9931554"
|
|
],
|
|
[
|
|
"src/grbl/encoders.c",
|
|
"292be5e52b7939174b2e226c2e0a9be9362ea66d"
|
|
],
|
|
[
|
|
"src/grbl/encoders.h",
|
|
"45d7d21532fc1a8b143e422f49b9ffff3081ce15"
|
|
],
|
|
[
|
|
"src/grbl/errors.c",
|
|
"909f7ca912d94e133d222cae9b258b688c4706ca"
|
|
],
|
|
[
|
|
"src/grbl/errors.h",
|
|
"cd12203d318280cd60d4db977f972872a461b999"
|
|
],
|
|
[
|
|
"src/grbl/expanders_init.h",
|
|
"c222179163165b58d75316d297d48115a7f0069e"
|
|
],
|
|
[
|
|
"src/grbl/fs_device.c",
|
|
"837e297cbcbbf99e01c12cd3cbbb02074d25cc9c"
|
|
],
|
|
[
|
|
"src/grbl/fs_ram.c",
|
|
"4a7850772f5f413f179c6da4a34b4f01d4717e19"
|
|
],
|
|
[
|
|
"src/grbl/fs_ram.h",
|
|
"aa60ffe696bc9be08f73ea2a51bbb2369a27004e"
|
|
],
|
|
[
|
|
"src/grbl/gcode.c",
|
|
"63939a354baa5c79143ded10baadd03e788b197c"
|
|
],
|
|
[
|
|
"src/grbl/gcode.h",
|
|
"5cb6053923e3a51ac823f8b64573950636491102"
|
|
],
|
|
[
|
|
"src/grbl/grbl.h",
|
|
"2154bae75cdf34fa602b733495bb25917d99984c"
|
|
],
|
|
[
|
|
"src/grbl/grbllib.c",
|
|
"b1287a601bcc1fb1db215deadce36c495aa5fdc2"
|
|
],
|
|
[
|
|
"src/grbl/grbllib.h",
|
|
"380e32675936430ef728eb4db72fe9b3d6ead7f5"
|
|
],
|
|
[
|
|
"src/grbl/hal.h",
|
|
"f2f87c8db59be0b9e9aba51766b1c6206688e287"
|
|
],
|
|
[
|
|
"src/grbl/ioports.c",
|
|
"c2de5ebafeee4d3311bf94030061157a12aa1901"
|
|
],
|
|
[
|
|
"src/grbl/ioports.h",
|
|
"b107c34926df91a1e849475457ea43b1d1890c16"
|
|
],
|
|
[
|
|
"src/grbl/kinematics/asymmetric_ganging.c",
|
|
"cf1a108866839f22f65f627c998e778a72baf243"
|
|
],
|
|
[
|
|
"src/grbl/kinematics/corexy.c",
|
|
"6d39fc0812ab17f7cef4ad84d72779969867e998"
|
|
],
|
|
[
|
|
"src/grbl/kinematics/delta.c",
|
|
"926795d093fc9017912d8141d9c7ec5b1b569b96"
|
|
],
|
|
[
|
|
"src/grbl/kinematics/interface.h",
|
|
"e32cc37f4f7be95cd7153216d2a5e6f00e9f7b22"
|
|
],
|
|
[
|
|
"src/grbl/kinematics/polar.c",
|
|
"927fd41f744a4ec44d8d28c0c8f344751788cec6"
|
|
],
|
|
[
|
|
"src/grbl/kinematics/rtcp_ac.c",
|
|
"0446f8f158f40df7a991d99f752dadc606948646"
|
|
],
|
|
[
|
|
"src/grbl/kinematics/wall_plotter.c",
|
|
"749618e1c782f5a9c6012ae44deadf0099ff9634"
|
|
],
|
|
[
|
|
"src/grbl/machine_limits.c",
|
|
"804b1be42400937fedf149bbbc1750903bac0e5f"
|
|
],
|
|
[
|
|
"src/grbl/machine_limits.h",
|
|
"83296b6bad74cc6270ef0ec3f27c2333006ace5c"
|
|
],
|
|
[
|
|
"src/grbl/messages.c",
|
|
"4bb3e11469cfd3819a347c3024e4021e6835a63c"
|
|
],
|
|
[
|
|
"src/grbl/messages.h",
|
|
"2c59bf458f32f3bd95d205abd02ecdc001f648cd"
|
|
],
|
|
[
|
|
"src/grbl/modbus.c",
|
|
"6ea9e75842f92d2d9733ff2d07b1a1454f213f8f"
|
|
],
|
|
[
|
|
"src/grbl/modbus.h",
|
|
"2cd00dec5f9d98dac9765885388e6dd9813cae1c"
|
|
],
|
|
[
|
|
"src/grbl/modbus_rtu.c",
|
|
"68f29cf98d1e84c159acdc79a3a7687194f33e47"
|
|
],
|
|
[
|
|
"src/grbl/motion_control.c",
|
|
"f43ff0576adb2082ca50d34c35093c533c475767"
|
|
],
|
|
[
|
|
"src/grbl/motion_control.h",
|
|
"9a15b27dc50d98416bc87085740af03d38f187e4"
|
|
],
|
|
[
|
|
"src/grbl/motor_pins.h",
|
|
"c0897698eabf181b478631aac48007e10370b839"
|
|
],
|
|
[
|
|
"src/grbl/my_plugin.c",
|
|
"291b440fdbaecfd7ef854c2c134c839fcc44bbab"
|
|
],
|
|
[
|
|
"src/grbl/ngc_expr.c",
|
|
"0aa7b2dc3f913ddf2f08c04b9d20a63f5439ad90"
|
|
],
|
|
[
|
|
"src/grbl/ngc_expr.h",
|
|
"f0a18ebc1b4240221e463c021258d4d6877fd72e"
|
|
],
|
|
[
|
|
"src/grbl/ngc_flowctrl.c",
|
|
"738a1f0eb3a9bcf5e8841e397803bfbe16f3db9d"
|
|
],
|
|
[
|
|
"src/grbl/ngc_flowctrl.h",
|
|
"51c31a1f57b87530d66d2eeb75b3e069818ca9c0"
|
|
],
|
|
[
|
|
"src/grbl/ngc_params.c",
|
|
"e4d74b78d60eda9b95f885022b576f25b3c857ac"
|
|
],
|
|
[
|
|
"src/grbl/ngc_params.h",
|
|
"eaa16d160048eb0bb7f25210fe8285e7d75f1176"
|
|
],
|
|
[
|
|
"src/grbl/nuts_bolts.c",
|
|
"1613a23462ab966bb93d3a381238cb036f03fe58"
|
|
],
|
|
[
|
|
"src/grbl/nuts_bolts.h",
|
|
"7c591bb4b07266a32c2fe0fa3d580edb8b647dd4"
|
|
],
|
|
[
|
|
"src/grbl/nvs.h",
|
|
"e48fc898f79f83ef79040b265948ad986ddc9455"
|
|
],
|
|
[
|
|
"src/grbl/nvs_buffer.c",
|
|
"ff191cd9b28a22d3300ffd17d8724c884550d083"
|
|
],
|
|
[
|
|
"src/grbl/nvs_buffer.h",
|
|
"0d8423da2ba663aa1dc586dd8b7df0ac178ad0c4"
|
|
],
|
|
[
|
|
"src/grbl/override.c",
|
|
"3c6315704855b3fb2d88ecb4c222daf8d64190e4"
|
|
],
|
|
[
|
|
"src/grbl/override.h",
|
|
"165d9ec0a139afe92261cc99ac8ee97d066f7034"
|
|
],
|
|
[
|
|
"src/grbl/pid.c",
|
|
"fbc465a401e52715d2951e026443be7bcbee9536"
|
|
],
|
|
[
|
|
"src/grbl/pid.h",
|
|
"8cb4c3c1d13ea95d14f2a68944146243bd051f98"
|
|
],
|
|
[
|
|
"src/grbl/pin_bits_masks.h",
|
|
"ceb032c5f0b33a20246385cfa2c695a1608613c8"
|
|
],
|
|
[
|
|
"src/grbl/planner.c",
|
|
"a0dee55dce2252e077a992de14303f4519d7dd91"
|
|
],
|
|
[
|
|
"src/grbl/planner.h",
|
|
"717b188d05b691e7c92d660b5e72f99043dde539"
|
|
],
|
|
[
|
|
"src/grbl/platform.h",
|
|
"3862abbd721d8bcbd3dc6182a67d3d00a312f289"
|
|
],
|
|
[
|
|
"src/grbl/plugins.h",
|
|
"f822f56a79d7ba122ea3d01c787cf950e0735110"
|
|
],
|
|
[
|
|
"src/grbl/plugins_init.h",
|
|
"8b430a3d9463e1a03a48559e716875f4470c646e"
|
|
],
|
|
[
|
|
"src/grbl/probe.c",
|
|
"d96519a379de741c599bbd33de6b11197ae4a927"
|
|
],
|
|
[
|
|
"src/grbl/probe.h",
|
|
"27040f2f237411a279405ea7fde18783d3db1caf"
|
|
],
|
|
[
|
|
"src/grbl/protocol.c",
|
|
"e39cfd4b000d77321939f50c4f280ccd48ed5cf8"
|
|
],
|
|
[
|
|
"src/grbl/protocol.h",
|
|
"008b06d26be9aec97206b54e42cde855d4bf1e45"
|
|
],
|
|
[
|
|
"src/grbl/regex.c",
|
|
"bdf238c081286a98ba59bbac0b4ee8fc3908471d"
|
|
],
|
|
[
|
|
"src/grbl/regex.h",
|
|
"a975067dd09b511cc0c926a01f59b594b5284043"
|
|
],
|
|
[
|
|
"src/grbl/report.c",
|
|
"ac4465a797376a79f96ba344dbfb98e537ecdcf8"
|
|
],
|
|
[
|
|
"src/grbl/report.h",
|
|
"57dbf7fcdc05f3ddceaf0a5724353140f4ccfe94"
|
|
],
|
|
[
|
|
"src/grbl/rgb.h",
|
|
"d660bd016758a1c4c65b627ae6ee768da15f2d03"
|
|
],
|
|
[
|
|
"src/grbl/settings.c",
|
|
"e62f823a32370072615b33c3ec72207a874ab41a"
|
|
],
|
|
[
|
|
"src/grbl/settings.h",
|
|
"ee7df332488c47f535386cbd283f9c3d5e3fae8d"
|
|
],
|
|
[
|
|
"src/grbl/sleep.c",
|
|
"51dd18454cac5fce5afd3a0e23b72bf014f16eec"
|
|
],
|
|
[
|
|
"src/grbl/sleep.h",
|
|
"a2c943f6fcc04358b9d40af7f37a495a52a930b5"
|
|
],
|
|
[
|
|
"src/grbl/spindle_control.c",
|
|
"1a1b3143b87df825ef2a9beb5d4ea58b77cca719"
|
|
],
|
|
[
|
|
"src/grbl/spindle_control.h",
|
|
"8b1c89a0cc29473757243bc35b31d28b7387504e"
|
|
],
|
|
[
|
|
"src/grbl/spindle_sync.h",
|
|
"ea80e6a700c66391aa4efe915f5ffc4bcd3e065a"
|
|
],
|
|
[
|
|
"src/grbl/state_machine.c",
|
|
"d7d67196ccc3cb2d03cf7fef5eb9abee16d476a7"
|
|
],
|
|
[
|
|
"src/grbl/state_machine.h",
|
|
"a782fd24c9e41d042ca70e39e6db5b64aebd231b"
|
|
],
|
|
[
|
|
"src/grbl/stepdir_map.h",
|
|
"a890f616dde53bbe4b969670fad13e00d176b75b"
|
|
],
|
|
[
|
|
"src/grbl/stepper.c",
|
|
"cb8d89fa8f6ab343bcdedc0aa4bed0627ab95fd1"
|
|
],
|
|
[
|
|
"src/grbl/stepper.h",
|
|
"5fc8640502918bbd42224b07d65c944f6da4eb0e"
|
|
],
|
|
[
|
|
"src/grbl/stepper2.c",
|
|
"de9f0845eed8586c38d97a0dfc29b458ec880aa6"
|
|
],
|
|
[
|
|
"src/grbl/stepper2.h",
|
|
"08b7763c2eb711f36fc750066a09c21cd90d41cf"
|
|
],
|
|
[
|
|
"src/grbl/stream.c",
|
|
"eb7592dad64080b1488f906627be3388d2d07586"
|
|
],
|
|
[
|
|
"src/grbl/stream.h",
|
|
"2aaccefc0e265c2833814f425e4c0378a64ec2f9"
|
|
],
|
|
[
|
|
"src/grbl/stream_file.c",
|
|
"6bdbb3d58464b34388433d5ee436f85d034fdf2b"
|
|
],
|
|
[
|
|
"src/grbl/stream_file.h",
|
|
"d9dd6616eb376d86b0ee448bd05d421916b117fb"
|
|
],
|
|
[
|
|
"src/grbl/stream_json.c",
|
|
"3949892a568f4ec31bfe4e179695b6d0acdff410"
|
|
],
|
|
[
|
|
"src/grbl/stream_json.h",
|
|
"2e3d8e1a51b3781527669586a79ac4d6a4c0d691"
|
|
],
|
|
[
|
|
"src/grbl/stream_passthru.c",
|
|
"5c16649afc5d7e96a1469a64fdab7ab6898922d6"
|
|
],
|
|
[
|
|
"src/grbl/stream_passthru.h",
|
|
"e9caadde48e6457a27901d500681e7127608530b"
|
|
],
|
|
[
|
|
"src/grbl/strutils.c",
|
|
"7fc24d7e900f322049bffe207a234bdf0f124c54"
|
|
],
|
|
[
|
|
"src/grbl/strutils.h",
|
|
"fc77e5b99c09c062bb7c788fbd280f73c8260480"
|
|
],
|
|
[
|
|
"src/grbl/system.c",
|
|
"8e072e93a76f43673a96c0c1d48198d6a580fff0"
|
|
],
|
|
[
|
|
"src/grbl/system.h",
|
|
"e992f8306856498724d1773f4d389b66676f2ac7"
|
|
],
|
|
[
|
|
"src/grbl/task.h",
|
|
"6a19b1176032619cf449113aceebc555c3418bb7"
|
|
],
|
|
[
|
|
"src/grbl/tool_change.c",
|
|
"423585324d237cc92074098e299905b7a1760d52"
|
|
],
|
|
[
|
|
"src/grbl/tool_change.h",
|
|
"eb8ed7eb0810c12cd028686bacd6775fda959a69"
|
|
],
|
|
[
|
|
"src/grbl/utf8.c",
|
|
"804bba899d6a9b26a9b270e272d13cd4dab4f8ec"
|
|
],
|
|
[
|
|
"src/grbl/utf8.h",
|
|
"4e25c4ce43ca3fafe6f8a836ff07e9157e37b3fc"
|
|
],
|
|
[
|
|
"src/grbl/vfs.c",
|
|
"6ff15a7f243cb26b014e15412ae6ea02a5e854cf"
|
|
],
|
|
[
|
|
"src/grbl/vfs.h",
|
|
"248e14d2c709a0516d1ef06a96d5515c9429d453"
|
|
],
|
|
[
|
|
"src/grbl_eeprom_extensions.c",
|
|
"11ba85320531eb4b1ecc9f47b22a86af21ea884c"
|
|
],
|
|
[
|
|
"src/grbl_eeprom_extensions.h",
|
|
"cd0e146946314f4a9209d319b0444a652f6058ff"
|
|
],
|
|
[
|
|
"src/main.c",
|
|
"9afe8580374751a7209cc431a8dca532ce697629"
|
|
],
|
|
[
|
|
"src/my_machine.h",
|
|
"ddad566c397741ec66a25d38ef99aca9df643d5a"
|
|
],
|
|
[
|
|
"src/platform.h",
|
|
"25ee54c4a9c1094f4321c411ecc775753962ce6e"
|
|
],
|
|
[
|
|
"src/platform_linux.c",
|
|
"29e014ab05f488b37c218595d698358f6a48abba"
|
|
],
|
|
[
|
|
"src/serial.c",
|
|
"f4ca54884216fc4b3aae63c8fa0d38b736323340"
|
|
],
|
|
[
|
|
"src/serial.h",
|
|
"305ceb9f900cb0095f63e7531b85a82e9aa068c5"
|
|
],
|
|
[
|
|
"src/stepper_stream.c",
|
|
"cc3e4e87c6ce7cb8b04209d2c621cc2438315317"
|
|
],
|
|
[
|
|
"src/stepper_stream.h",
|
|
"342de940d3eb853d420e9fac087c17f80b54ecf4"
|
|
],
|
|
[
|
|
"tests/bind_addr_test.c",
|
|
"6e94126c0f7de57839d707c64f695abf6773d351"
|
|
],
|
|
[
|
|
"tests/cooling_test.c",
|
|
"b23762baf36da7a9fc17cfb5df00a6e66d7aef7d"
|
|
],
|
|
[
|
|
"tests/laser_arm_test.c",
|
|
"5c806eb77f84232568799273b3ce0d37032facd9"
|
|
],
|
|
[
|
|
"tests/latch_test.c",
|
|
"7740f4ed4e1cb10daaca6d4f3783f58c32f1a7fd"
|
|
],
|
|
[
|
|
"tests/lens_home_test.c",
|
|
"8ff717339b01a18f57e85eb7f2aa58dd748bc0fb"
|
|
],
|
|
[
|
|
"tests/serial_test.c",
|
|
"7a574239dca6bcda376c3786c068603d7738028a"
|
|
],
|
|
[
|
|
"tests/switch_map_test.c",
|
|
"6afe7e8a2839420045b181c1a770b204d29cb61e"
|
|
],
|
|
[
|
|
"tests/switches_test.c",
|
|
"884fb35bdd02e8104daf52ecccd09a58316774b6"
|
|
],
|
|
[
|
|
"tests/xy_scale_test.c",
|
|
"557832a29e7d33a4c75c9ef10d19c11699eee8ed"
|
|
]
|
|
],
|
|
"pv": "0.1.18",
|
|
"recipes": [
|
|
"grblhal-glowforge"
|
|
],
|
|
"source": "gitsm://github.com/openglow-org/grblHAL-glowforge.git",
|
|
"srcrev": "f93aca89821ae3bf8eee39d5948e53f1edbc20db"
|
|
},
|
|
"kernel-module-glowforge": {
|
|
"component": "kernel-module-glowforge",
|
|
"files": [
|
|
[
|
|
".gitattributes",
|
|
"1b30e1b56dcc0411c10ee780053d04f1c9d862e1"
|
|
],
|
|
[
|
|
".github/workflows/build.yml",
|
|
"2073e161c4686ed9a06ca211ea869ee3b60945b9"
|
|
],
|
|
[
|
|
".gitignore",
|
|
"9ade51c849fa44bc129ca7e4c07d7e8b6faf4107"
|
|
],
|
|
[
|
|
"AGENTS.md",
|
|
"b1ebe04b43be30c85ee80efc64e858c59336a313"
|
|
],
|
|
[
|
|
"CONTRIBUTING.md",
|
|
"ca2a98e7d617e1bca2b2f814a598e94f89186c6e"
|
|
],
|
|
[
|
|
"LICENSE",
|
|
"d159169d1050894d3ea3b98e1c965c4058208fe1"
|
|
],
|
|
[
|
|
"Makefile",
|
|
"b1cb12d2bc437a8de5a015b7f86f3c452ee58c3f"
|
|
],
|
|
[
|
|
"README",
|
|
"7d5f0f7761ccd4ded2e5e37b0013d73a52074565"
|
|
],
|
|
[
|
|
"asm/sdma.asm",
|
|
"34e14740ca57a743854b1a0229b61cda8f00d0e5"
|
|
],
|
|
[
|
|
"src/cnc.c",
|
|
"5c6df39dcafe20aa37fe63019ff12d8e6894082f"
|
|
],
|
|
[
|
|
"src/cnc.h",
|
|
"fdc00c9d5259cf97bec90da3396308f00c1acbab"
|
|
],
|
|
[
|
|
"src/cnc_api.c",
|
|
"988a3658ef3885bbf0c32e98e12ffeaadf20eab9"
|
|
],
|
|
[
|
|
"src/cnc_backtrack.h",
|
|
"55652dfda3cd381b20be269bfd79e2c7e923227a"
|
|
],
|
|
[
|
|
"src/cnc_buffer.c",
|
|
"8c84c37557e38adafc0b0af7ab7966414946a023"
|
|
],
|
|
[
|
|
"src/cnc_interlock.c",
|
|
"534f77c8260c309d8bd84f3899c4f3d632b542fb"
|
|
],
|
|
[
|
|
"src/cnc_interlock.h",
|
|
"9924eead9eb5885f46e82b064795f3c0d4d5aede"
|
|
],
|
|
[
|
|
"src/cnc_pins.c",
|
|
"408787d5d33da596c22ed3f23ed6cbaeb9299091"
|
|
],
|
|
[
|
|
"src/cnc_pins.h",
|
|
"590c3eb676effbf67a4668c6507eb26785a5e2f5"
|
|
],
|
|
[
|
|
"src/cnc_private.h",
|
|
"772b642e7651341f432f4f51ca3898aeddf21ab0"
|
|
],
|
|
[
|
|
"src/device_attr.h",
|
|
"7a8ed5fcb76b5d0a8173eac98b898b588fb930ab"
|
|
],
|
|
[
|
|
"src/glowforge.c",
|
|
"6be21c2bca751362c47e435f13c48a7d0cff696b"
|
|
],
|
|
[
|
|
"src/head.c",
|
|
"d065d401ecddabe3b4b5dbc349802f5ebf8a2c5c"
|
|
],
|
|
[
|
|
"src/head.h",
|
|
"334cb8005b2b3de8eee799702d2eefc923ca724c"
|
|
],
|
|
[
|
|
"src/head_api.c",
|
|
"36e4bd7774b96d0869fa17335b49b08d778ab247"
|
|
],
|
|
[
|
|
"src/head_private.h",
|
|
"7ca4e193e1120df591772df2320bc5b0df65f628"
|
|
],
|
|
[
|
|
"src/io.c",
|
|
"27d5f80bf8eceaec73831bdc026cb77228c42736"
|
|
],
|
|
[
|
|
"src/io.h",
|
|
"6efabf89f7ba7664d168440912b98a7c9243ccad"
|
|
],
|
|
[
|
|
"src/ledtrig_smooth.c",
|
|
"0bc91005f0e7945bd446166112e289fb0090acc7"
|
|
],
|
|
[
|
|
"src/ledtrig_smooth.h",
|
|
"35f34da961d4ee6ffb3a46c8644ce589485422cf"
|
|
],
|
|
[
|
|
"src/notifiers.h",
|
|
"34beea3fbae5ea8d1bbced04b37c65f496d2c1bb"
|
|
],
|
|
[
|
|
"src/pic.c",
|
|
"d7948deeec31630b3b407c22803c852031c1007c"
|
|
],
|
|
[
|
|
"src/pic.h",
|
|
"b98990cc24da324aa4d4f479c0f21f9bff0ddc13"
|
|
],
|
|
[
|
|
"src/pic_api.c",
|
|
"fdc109405d05be86ab9d3615ef676aba3be03a05"
|
|
],
|
|
[
|
|
"src/pic_leds.c",
|
|
"f924f89818d58a877015c59e1250a1b5d97affaf"
|
|
],
|
|
[
|
|
"src/pic_private.h",
|
|
"f0166df6bae29f90e1769f11c93122db75a80cd8"
|
|
],
|
|
[
|
|
"src/sdma_macros.h",
|
|
"d2e6ded41d03f7d1c1c5f9bd8ec12bb7811a50a2"
|
|
],
|
|
[
|
|
"src/thermal.c",
|
|
"93c493bc64643f7a71dd11c8b270f8ea9238a575"
|
|
],
|
|
[
|
|
"src/thermal.h",
|
|
"ac1d96d0a63d4ba2743e52417866e12dbff21657"
|
|
],
|
|
[
|
|
"src/thermal_private.h",
|
|
"5d2b537cd8c4aecee44b9e173829a36f3dadb835"
|
|
],
|
|
[
|
|
"src/uapi/glowforge.h",
|
|
"8dfaccc6429f53b3304405faf7d86a901ed91da0"
|
|
],
|
|
[
|
|
"tests/.gitignore",
|
|
"ac0ef50598381333a202c0b4648aebc535684f6d"
|
|
],
|
|
[
|
|
"tests/Makefile",
|
|
"ed7c6275194be55bf0842a15fd105abe07ddb1c1"
|
|
],
|
|
[
|
|
"tests/backtrack_test.c",
|
|
"509449f7d59a55f6634ed040c70f9e2eeb594220"
|
|
],
|
|
[
|
|
"tests/interlock_test.c",
|
|
"c4834dd119167672e0b6cc17f2ac745991cfccdc"
|
|
],
|
|
[
|
|
"tools/mx51_sdma_set.pm",
|
|
"34379246106cca3bd2aab4c8475fcadbd48848f9"
|
|
],
|
|
[
|
|
"tools/sdma_asm.pl",
|
|
"003c76c9b2e7f7b6103ce288a53af82bb9bf5885"
|
|
]
|
|
],
|
|
"pv": "0.0.6",
|
|
"recipes": [
|
|
"kernel-module-glowforge"
|
|
],
|
|
"source": "git://github.com/openglow-org/kernel-module-glowforge.git",
|
|
"srcrev": "1860ff501cb9dd6f9b562469e303318fd802916a"
|
|
},
|
|
"linux-fslc": {
|
|
"component": "linux-fslc",
|
|
"config_sha256": "438fc04568282bbffb17b86c35e56d091198ff98ecb8fd638e87bb89b8bfc425",
|
|
"files": [
|
|
[
|
|
"@config",
|
|
"438fc04568282bbffb17b86c35e56d091198ff98ecb8fd638e87bb89b8bfc425"
|
|
],
|
|
[
|
|
"@srcrev",
|
|
"844aa3471b97053b0a59f68d36dc6f796338b562"
|
|
]
|
|
],
|
|
"linux_version": "6.12.20",
|
|
"pv": "6.12.20+git",
|
|
"recipes": [
|
|
"linux-fslc"
|
|
],
|
|
"source": "git://github.com/Freescale/linux-fslc.git",
|
|
"srcrev": "844aa3471b97053b0a59f68d36dc6f796338b562"
|
|
},
|
|
"python3-gfhardware": {
|
|
"component": "python3-gfhardware",
|
|
"files": [
|
|
[
|
|
".gitattributes",
|
|
"1b30e1b56dcc0411c10ee780053d04f1c9d862e1"
|
|
],
|
|
[
|
|
".github/workflows/host-tests.yml",
|
|
"58584524c1d484feb3ca9e4b3f1cc8bc1b4e6516"
|
|
],
|
|
[
|
|
".gitignore",
|
|
"2d6f9ccefa02c61cfd5cabc2d8b171025eadce09"
|
|
],
|
|
[
|
|
"AGENTS.md",
|
|
"620fcc0024033e662602ff361b45ce164bed2ff6"
|
|
],
|
|
[
|
|
"CONTRIBUTING.md",
|
|
"ca2a98e7d617e1bca2b2f814a598e94f89186c6e"
|
|
],
|
|
[
|
|
"LICENSE",
|
|
"d80cdb21e95685fdf696b2e01895bae8114ff927"
|
|
],
|
|
[
|
|
"LICENSE.LGPL-2.1",
|
|
"04bb156e77d5714dc2ee29bd0a37f16532ec741c"
|
|
],
|
|
[
|
|
"MANIFEST.in",
|
|
"e88a5f7bb02d90ece462ac8f196691fc5f1a61b6"
|
|
],
|
|
[
|
|
"README.md",
|
|
"d730969bc812a458c370bede7a23213a3c57499a"
|
|
],
|
|
[
|
|
"forgefirm-app/ffmachine.py",
|
|
"f12e15645decdbdbc95f9b5297704a440d205d27"
|
|
],
|
|
[
|
|
"forgefirm-app/gfcloud.init",
|
|
"0eb7c8d367315510ab492a13d6b28cbbb6fa860d"
|
|
],
|
|
[
|
|
"forgefirm-app/gfcloud.py",
|
|
"0a0d9868078df5c20f0234efdd3d111efa628436"
|
|
],
|
|
[
|
|
"forgefirm-app/gfhome.conf.sample",
|
|
"d00bf0e00c8a795443f95c6f227c8d8df3291869"
|
|
],
|
|
[
|
|
"forgefirm-app/gfhome.py",
|
|
"d6d925b5560875b29fe78b1da072488b61d9cf3a"
|
|
],
|
|
[
|
|
"gfhardware/__init__.py",
|
|
"d4145850379d8919241f1de6d5148f275146987d"
|
|
],
|
|
[
|
|
"gfhardware/_common.py",
|
|
"d431911c90c0fea6bf3d8d869c8fbd23c3ff398c"
|
|
],
|
|
[
|
|
"gfhardware/cam.py",
|
|
"dd082c7c91e5ce5a1932585d454185d1558863f7"
|
|
],
|
|
[
|
|
"gfhardware/cnc.py",
|
|
"63f3d5a5544bb602ae8efd2b11c69c4ae84fc502"
|
|
],
|
|
[
|
|
"gfhardware/cooling.py",
|
|
"418a689e7958efbb39606848436b2c63dbec476d"
|
|
],
|
|
[
|
|
"gfhardware/coolsvc.py",
|
|
"0345354b46e1680ea0911969b72752d3db3525ff"
|
|
],
|
|
[
|
|
"gfhardware/feeder.py",
|
|
"1387fd8f640d91bb58dc4ddfe9134c8d1335a240"
|
|
],
|
|
[
|
|
"gfhardware/id.py",
|
|
"3ad32e9a32a097dd5b916621ca70f4813effe2c1"
|
|
],
|
|
[
|
|
"gfhardware/input/__init__.py",
|
|
"02c064daf4e04ace8c8f318dc0254b9cbe22a610"
|
|
],
|
|
[
|
|
"gfhardware/leds.py",
|
|
"354d71cef35bcb714129fd216fa38951ddedb97f"
|
|
],
|
|
[
|
|
"gfhardware/machine.py",
|
|
"dcea1652c678af140d309b65c7aa85b2120f1f6e"
|
|
],
|
|
[
|
|
"gfhardware/src/bayer.c",
|
|
"61a1b9d54b8a4e718b4c55af7ae601a8840876ce"
|
|
],
|
|
[
|
|
"gfhardware/src/bayer.h",
|
|
"499f91dd8f22d21f6e91da2f7d3f13b55a88cbf5"
|
|
],
|
|
[
|
|
"gfhardware/src/evdev.c",
|
|
"723630aee75f46995aee59552e5ef48d08ee5a18"
|
|
],
|
|
[
|
|
"gfhardware/src/gfcam.c",
|
|
"b0900f0e1ca94ecd30c922f2459011b1729f0227"
|
|
],
|
|
[
|
|
"gfhardware/switches.py",
|
|
"80fd05df3f629f246eb480bd7d9c03bd9c9eb6ec"
|
|
],
|
|
[
|
|
"gfhardware/utils/__init__.py",
|
|
"e69de29bb2d1d6434b8b29ae775ad8c2e48c5391"
|
|
],
|
|
[
|
|
"gfhardware/utils/capture.py",
|
|
"ebf94278b686f9838e82d8024a9bf9511f91a951"
|
|
],
|
|
[
|
|
"gfhardware/z_axis.py",
|
|
"2a27d0f3bbd2f3fb45ba67a65f9b861455dc3900"
|
|
],
|
|
[
|
|
"requirements.txt",
|
|
"1e3c0f0dc607867f671e470f039971a81e4a6c47"
|
|
],
|
|
[
|
|
"setup.py",
|
|
"3ef5a500f23461b0ad9ed86388f009edafb1fcac"
|
|
],
|
|
[
|
|
"tests/test_cam_lid_gate.py",
|
|
"d97dc1af7d46d3c1c2ee1861ea44e344063423dc"
|
|
],
|
|
[
|
|
"tests/test_feeder.py",
|
|
"8dd86655b52495a9247b5ae968ae777b5e7365a6"
|
|
],
|
|
[
|
|
"tests/test_ffmachine_agent.py",
|
|
"79e0927955c7b5f00b9032f72f9fab9284e5b4f6"
|
|
],
|
|
[
|
|
"tests/test_ffmachine_emulator.py",
|
|
"5de6c0f6359616f1e253f9c3c047180a9f106440"
|
|
],
|
|
[
|
|
"tests/test_ffmachine_park.py",
|
|
"e83d97622e8807657374c87ea443f4ba1ef7ba58"
|
|
],
|
|
[
|
|
"tests/test_gfhome_exit.py",
|
|
"d78d5def849e143687558d4e53931cd4c3549584"
|
|
],
|
|
[
|
|
"tests/test_limits.py",
|
|
"25966007bac504ff75c8e5c19339c231ca43af51"
|
|
],
|
|
[
|
|
"tests/test_machine_lid_button.py",
|
|
"c7dc110f5e4c77b854b4903d8102dbfa9c156dae"
|
|
],
|
|
[
|
|
"tests/test_pulse_body.py",
|
|
"29a868bb3aa60bcdaf8e23f13a24f32eca1e433f"
|
|
]
|
|
],
|
|
"pv": "1.0",
|
|
"recipes": [
|
|
"python3-gfhardware"
|
|
],
|
|
"source": "git://github.com/openglow-org/python3-gfhardware.git",
|
|
"srcrev": "6cc4f45d311ab451c7d72dee009103e55a749675"
|
|
},
|
|
"python3-gfutilities": {
|
|
"component": "python3-gfutilities",
|
|
"files": [
|
|
[
|
|
".gitattributes",
|
|
"b5fe1536d1689e8526dae30678ac352ee0d8a3ff"
|
|
],
|
|
[
|
|
".github/workflows/host-tests.yml",
|
|
"c51a26d023751d891d3fc5a492cafba9978970ce"
|
|
],
|
|
[
|
|
".github/workflows/release.yml",
|
|
"4d56756fafce28ced411807fd054f781962a46ec"
|
|
],
|
|
[
|
|
".gitignore",
|
|
"c55e64f1e292b91b593c9b55fb6bb6dc8f0245ab"
|
|
],
|
|
[
|
|
"AGENTS.md",
|
|
"18ae1f92aa9412a4ed7cffeb6aac153e90253340"
|
|
],
|
|
[
|
|
"CONTRIBUTING.md",
|
|
"ca2a98e7d617e1bca2b2f814a598e94f89186c6e"
|
|
],
|
|
[
|
|
"LICENSE",
|
|
"fbb95a82e4ea499c872b8967022ed2c8308ee345"
|
|
],
|
|
[
|
|
"MANIFEST.in",
|
|
"277aa5cbd57a6176bee925d8e96e00543732f336"
|
|
],
|
|
[
|
|
"README.md",
|
|
"523315d081830235abcaf83230a4554c7bf7eead"
|
|
],
|
|
[
|
|
"examples/_RESOURCES/FW/README.md",
|
|
"21e56eb42ba942b423c2d81fa59d580b5795173b"
|
|
],
|
|
[
|
|
"examples/_RESOURCES/IMG/HEAD_LASER_.230.jpg",
|
|
"227999645a7e581163d6121c26eda574403d88da"
|
|
],
|
|
[
|
|
"examples/_RESOURCES/IMG/HEAD_NO_LASER_.230.jpg",
|
|
"e0b429256d2b2c0e0fab34f39234b9dfac7ee7e0"
|
|
],
|
|
[
|
|
"examples/_RESOURCES/IMG/HOME_1.jpg",
|
|
"3f5ed57eaf40b7c5494de33fc9c47e1c62d2c564"
|
|
],
|
|
[
|
|
"examples/_RESOURCES/IMG/HOME_2.jpg",
|
|
"842c6f929d5600c9b3528c66e4e075494b56363e"
|
|
],
|
|
[
|
|
"examples/_RESOURCES/IMG/HOME_3.jpg",
|
|
"2ab3eb05b7b4e4dac28da5e53f110b6f948989c5"
|
|
],
|
|
[
|
|
"examples/_RESOURCES/IMG/HOME_4.jpg",
|
|
"85a8c108eaea4745424c13116fafcb93d95df2d1"
|
|
],
|
|
[
|
|
"examples/_RESOURCES/LOG/README.md",
|
|
"c49674cffe1be0e2130d562f84dd8bf129ba2cd6"
|
|
],
|
|
[
|
|
"examples/_RESOURCES/MOTION/1234567890-nooptions-xxxxx.puls",
|
|
"7e272e1ef07edf32635f7687f35d37b02cb56b38"
|
|
],
|
|
[
|
|
"examples/_RESOURCES/MOTION/README.md",
|
|
"cdb3bfccc30ec653d612be49faa6acebd05fd371"
|
|
],
|
|
[
|
|
"examples/_RESOURCES/MOTION/hunt-signed-offset--8-step-size-0.35306.puls",
|
|
"33008608176c44ebbf4f9fa1a61be3552e9f0154"
|
|
],
|
|
[
|
|
"examples/_RESOURCES/MOTION/motions_xxxxx.puls",
|
|
"4363f395aa4aaa9789e48da506ac1b3d270cd44d"
|
|
],
|
|
[
|
|
"examples/_RESOURCES/README.md",
|
|
"472e2165e1f5584fbf1ee32f1e7389eeadb2f50b"
|
|
],
|
|
[
|
|
"examples/gf-machine-emulator.cfg.sample",
|
|
"2107a29984f9dad19e397c05b6084c159bfc768e"
|
|
],
|
|
[
|
|
"examples/gf-machine-emulator.py",
|
|
"e23655abd4df294a110be56ebca7c9dfac48fc7b"
|
|
],
|
|
[
|
|
"gfutilities/__init__.py",
|
|
"c84aa7dedaca7c16bccd8ddb046163fdf8e4d241"
|
|
],
|
|
[
|
|
"gfutilities/_common.py",
|
|
"5f93dc7452beb801688dfc5c1c3162fd9ed3b94e"
|
|
],
|
|
[
|
|
"gfutilities/configuration.py",
|
|
"fb5035b443097a682533cfb13b90ab247352ac41"
|
|
],
|
|
[
|
|
"gfutilities/device/__init__.py",
|
|
"2b0dfe14eb8753468f0c7e12d2d104d5cf06cbcb"
|
|
],
|
|
[
|
|
"gfutilities/device/basemachine.py",
|
|
"02dc0b0ec6528e19fdd1fdd1d6f1bc64c8411f0b"
|
|
],
|
|
[
|
|
"gfutilities/device/emulator.py",
|
|
"4d8a14b2b0cc87e3a6272c38de0fa3718588d9be"
|
|
],
|
|
[
|
|
"gfutilities/device/settings.py",
|
|
"5e43b0b0658dfc35c4bffc3b7e6dafc065a602d9"
|
|
],
|
|
[
|
|
"gfutilities/puls/__init__.py",
|
|
"dc4922fcd65d81c45b64b087bd39f4e0342b627e"
|
|
],
|
|
[
|
|
"gfutilities/puls/pulsedata.py",
|
|
"a6aad2c980e317a4d81298728ab68883b5b3f6e9"
|
|
],
|
|
[
|
|
"gfutilities/puls/source.py",
|
|
"2b0afc7156415af187fdd9acddb7dfe5c6309eaf"
|
|
],
|
|
[
|
|
"gfutilities/service/__init__.py",
|
|
"2b0dfe14eb8753468f0c7e12d2d104d5cf06cbcb"
|
|
],
|
|
[
|
|
"gfutilities/service/authentication.py",
|
|
"ca8e6e5555ff282c044c19a7ce4c1289f105730e"
|
|
],
|
|
[
|
|
"gfutilities/service/dispatch.py",
|
|
"5725145546e893a155cee5168849ac140fdcd42e"
|
|
],
|
|
[
|
|
"gfutilities/service/gfuiservice.py",
|
|
"8f44c5a92000d102f7de5759cf39cc150189545f"
|
|
],
|
|
[
|
|
"gfutilities/service/offline.py",
|
|
"8c14a18b39b9815e116a1c50e92a48cf43cb42f5"
|
|
],
|
|
[
|
|
"gfutilities/service/websocket.py",
|
|
"7a3611939b729e73af02758d944a9cbc466dd24b"
|
|
],
|
|
[
|
|
"requirements.txt",
|
|
"6408a4e749a2c4011916373f3c35279f61a80442"
|
|
],
|
|
[
|
|
"setup.py",
|
|
"89a704ba9939195fd8a222f094877e05a223502b"
|
|
],
|
|
[
|
|
"tests/test_basemachine.py",
|
|
"9ec98c7ec28f18e43e9cd624ace4111d94805606"
|
|
],
|
|
[
|
|
"tests/test_dispatch.py",
|
|
"451d94cdc2233cde10f8566be4f96582db348562"
|
|
],
|
|
[
|
|
"tests/test_firmware_policy.py",
|
|
"07ac6a9b98ad808ef04da300ecf6d1ef703a4972"
|
|
],
|
|
[
|
|
"tests/test_frame.py",
|
|
"82c130bb666f05109325d931b15239ab7d675de9"
|
|
],
|
|
[
|
|
"tests/test_lifecycle.py",
|
|
"6b8efce087ca2479d05487c1a6a98e935b800774"
|
|
],
|
|
[
|
|
"tests/test_offline.py",
|
|
"722d5be142182a8421b6008044bba5a083f9a054"
|
|
],
|
|
[
|
|
"tests/test_puls_header.py",
|
|
"3d60b6ac21d461cc6cc3c1918e4de12fb7203562"
|
|
],
|
|
[
|
|
"tests/test_pulse_source.py",
|
|
"2065a943cd1a06f9b02c89c2aaba73b6755472f9"
|
|
],
|
|
[
|
|
"tests/test_pulsedata.py",
|
|
"ba9ce1993e253962a6315809f61bb0b83070ade8"
|
|
],
|
|
[
|
|
"tests/test_user_agent.py",
|
|
"e3629ffc4acb1063a5443e0bb700b414bd54e5b3"
|
|
]
|
|
],
|
|
"pv": "0.9.19+git",
|
|
"recipes": [
|
|
"python3-gfutilities"
|
|
],
|
|
"source": "git://github.com/openglow-org/Glowforge-Utilities.git",
|
|
"srcrev": "0a93ebf30b409dc43bd42240216c4d389904a7f4"
|
|
}
|
|
},
|
|
"content_sha256": "58495afe066c6964484fb07d5664895a4e742e65509c81c10056d9303570f182",
|
|
"format": 1,
|
|
"image": {
|
|
"name": "forgefirm-image-dev",
|
|
"version": "20260919221704 (dev)"
|
|
},
|
|
"platform": {
|
|
"dtb": {
|
|
"glowforge.dtb": "47b59c57312fd7b251ed194a820eb79d4f61312b2fdb8adac58b04ca415f228a",
|
|
"imx6dl-glowforge-v2.dtb": "47b59c57312fd7b251ed194a820eb79d4f61312b2fdb8adac58b04ca415f228a",
|
|
"imx6dl-glowforge-v20.dtb": "47b59c57312fd7b251ed194a820eb79d4f61312b2fdb8adac58b04ca415f228a"
|
|
},
|
|
"kernel_modules": [
|
|
"6.12.20-fslc-fslc"
|
|
],
|
|
"layers": {
|
|
"meta": {
|
|
"rev": "70ed6f677234d32198371a030178d2f272cf2d94"
|
|
},
|
|
"meta-forgefirm": {
|
|
"content_sha256": "69f2bd4d536389df62b4021c17501e1b876b1d0d58cf0981ca2341d783f15b53"
|
|
},
|
|
"meta-freescale": {
|
|
"rev": "b699d026506a6fc402e03afb432dcabd3d81c7ab"
|
|
},
|
|
"meta-freescale-distro": {
|
|
"rev": "b9d6a5d9931922558046d230c1f5f4ef6ee72345"
|
|
},
|
|
"meta-glowforge-bsp": {
|
|
"content_sha256": "9fccf9465a2158b226b3356cf15faee44e31455e46009804a9c9b2702fc0252d"
|
|
},
|
|
"meta-networking": {
|
|
"rev": "b0c2c648a1af89e7a8dd4c2ec841f3bc0ed0ccb9"
|
|
},
|
|
"meta-oe": {
|
|
"rev": "b0c2c648a1af89e7a8dd4c2ec841f3bc0ed0ccb9"
|
|
},
|
|
"meta-openglow-core": {
|
|
"content_sha256": "d708115282670cb9907ff08e62b3a0c06a912d218941b989a00ff85c0b7d4716"
|
|
},
|
|
"meta-poky": {
|
|
"rev": "70ed6f677234d32198371a030178d2f272cf2d94"
|
|
},
|
|
"meta-python": {
|
|
"rev": "b0c2c648a1af89e7a8dd4c2ec841f3bc0ed0ccb9"
|
|
}
|
|
},
|
|
"machine": "glowforge"
|
|
}
|
|
},
|
|
"manifest_sha": "58495afe066c6964484fb07d5664895a4e742e65509c81c10056d9303570f182",
|
|
"sha256": "74f10b1e46fb0097199b179607546fb9964252915c74fcb6c09c23d81b421972",
|
|
"tests": [
|
|
{
|
|
"always": true,
|
|
"covers": [
|
|
[
|
|
"forgectrl",
|
|
"init/**"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/main.c"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/auth.c"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"CMakeLists.txt"
|
|
],
|
|
[
|
|
"grblhal-glowforge",
|
|
"src/boards/**"
|
|
],
|
|
[
|
|
"grblhal-glowforge",
|
|
"CMakeLists.txt"
|
|
],
|
|
[
|
|
"kernel-module-glowforge",
|
|
"**"
|
|
],
|
|
[
|
|
"linux-fslc",
|
|
"**"
|
|
]
|
|
],
|
|
"fingerprint": "b5d9ba88523860d30fb224992359e85ae0c38e97b6be86c04592512b70fe9a6b",
|
|
"hardware": "api",
|
|
"id": "image.health",
|
|
"inherited": false,
|
|
"kind": "auto",
|
|
"record": {
|
|
"answers": [],
|
|
"campaign": "c-20260919222216-7903",
|
|
"duration_s": 0,
|
|
"evidence": {
|
|
"/data/forgefirm/forgefirm.conf": "600",
|
|
"/data/forgefirm/panel.token": "600",
|
|
"/etc/issue": "\n \u001b[1;31m \u273a\u2508\u2508\u2508\u2508\u2508\u2508\n \u001b[1;39mOpen\u001b[0mGlow\n ___ \u001b[1;39m___ ___ ___ __ __\u001b[0m\n | __|__ _ _ __ _ ___\u001b[1;39m| __|_ _| _ \\\\ \\\\/ |\u001b[0m\n | _/ _ \\\\ '_/ _` / -_) \u001b[1;39m_| | || / |\\\\/| |\u001b[0m\n |_|\\\\___/_| \\\\__, \\\\___|\u001b[1;39m_| |___|_|_\\\\_| |_|\u001b[0m\n |___/ 20260919221704 (dev)\n\nControl panel:\n https://<IP-1>/\n\n",
|
|
"/etc/motd": "\n \u001b[1;31m \u273a\u2508\u2508\u2508\u2508\u2508\u2508\n \u001b[1;39mOpen\u001b[0mGlow\n ___ \u001b[1;39m___ ___ ___ __ __\u001b[0m\n | __|__ _ _ __ _ ___\u001b[1;39m| __|_ _| _ \\ \\/ |\u001b[0m\n | _/ _ \\ '_/ _` / -_) \u001b[1;39m_| | || / |\\/| |\u001b[0m\n |_|\\___/_| \\__, \\___|\u001b[1;39m_| |___|_|_\\_| |_|\u001b[0m\n |___/ 20260919221704 (dev)\n\n",
|
|
"CONFIG_IMX2_WDT": "y",
|
|
"CONFIG_PANIC_ON_OOPS": "y",
|
|
"CONFIG_PREEMPT": "y",
|
|
"baseline": {
|
|
"post": [],
|
|
"pre": []
|
|
},
|
|
"batch": {
|
|
"group": "unattended",
|
|
"ts": "2026-09-19T22:23:01Z"
|
|
},
|
|
"cnc_free": 33521664,
|
|
"cnc_pool_bytes": 33554432,
|
|
"cnc_ring_bytes": 33554432,
|
|
"cnc_state": "idle",
|
|
"data_free_mb": 2762,
|
|
"dev_image": true,
|
|
"factory_mounts": [
|
|
"/factory/img1",
|
|
"/factory/img2"
|
|
],
|
|
"fixture": {
|
|
"channels": [
|
|
"lid",
|
|
"interlock",
|
|
"button"
|
|
],
|
|
"hostname": "<REDACTED-1>",
|
|
"ip": "<IP-2>",
|
|
"released": []
|
|
},
|
|
"forgectrl_pids": [
|
|
467
|
|
],
|
|
"forgefirm_version": "20260919221704 (dev)",
|
|
"kernel_release": "6.12.20-fslc-fslc-g0fdffb09caf6",
|
|
"logging_init": [
|
|
"forgefirm-logging"
|
|
],
|
|
"mode": {
|
|
"controller": "running",
|
|
"gated": false,
|
|
"local": false,
|
|
"mode": "grbl",
|
|
"motion": "verified",
|
|
"pid": 559,
|
|
"why": ""
|
|
},
|
|
"motd_columns": [
|
|
41,
|
|
41
|
|
],
|
|
"mounts": {
|
|
"/": {
|
|
"opts": [
|
|
"ro",
|
|
"relatime"
|
|
],
|
|
"source": "/dev/root",
|
|
"type": "ext4"
|
|
},
|
|
"/data": {
|
|
"opts": [
|
|
"rw",
|
|
"relatime"
|
|
],
|
|
"source": "/dev/mmcblk2p3",
|
|
"type": "ext4"
|
|
},
|
|
"/etc/hostname": {
|
|
"opts": [
|
|
"rw",
|
|
"nosuid",
|
|
"nodev",
|
|
"mode=755"
|
|
],
|
|
"source": "tmpfs",
|
|
"type": "tmpfs"
|
|
},
|
|
"/etc/issue": {
|
|
"opts": [
|
|
"rw",
|
|
"nosuid",
|
|
"nodev",
|
|
"mode=755"
|
|
],
|
|
"source": "tmpfs",
|
|
"type": "tmpfs"
|
|
},
|
|
"/etc/passwd": {
|
|
"opts": [
|
|
"rw",
|
|
"nosuid",
|
|
"nodev",
|
|
"mode=755"
|
|
],
|
|
"source": "tmpfs",
|
|
"type": "tmpfs"
|
|
},
|
|
"/var/lib": {
|
|
"opts": [
|
|
"rw",
|
|
"relatime"
|
|
],
|
|
"source": "tmpfs",
|
|
"type": "tmpfs"
|
|
}
|
|
},
|
|
"pulse_device_holders": [
|
|
467
|
|
],
|
|
"rc6_kill": [
|
|
"K09sshd",
|
|
"K20dbus-1",
|
|
"K20hwclock.sh",
|
|
"K20ntpd",
|
|
"K31umountnfs.sh",
|
|
"K70forgetest",
|
|
"K80gfcloud",
|
|
"K80grblhal",
|
|
"K80networking",
|
|
"K90forgectrl",
|
|
"K95syslog"
|
|
],
|
|
"record_accounts": [
|
|
"scott"
|
|
],
|
|
"sdma_clk_enable_count": "1",
|
|
"userspace_watchdog_pids": [],
|
|
"watchdog": {
|
|
"bootstatus": "0",
|
|
"identity": "imx2+ watchdog",
|
|
"period_s": 60.0,
|
|
"state": "inactive",
|
|
"timeout": "60",
|
|
"wcr": "0x771f",
|
|
"wde": true
|
|
}
|
|
},
|
|
"fingerprint": "b5d9ba88523860d30fb224992359e85ae0c38e97b6be86c04592512b70fe9a6b",
|
|
"image": "20260919221704 (dev)",
|
|
"log": [
|
|
"22:23:01 start image.health (auto, api) in campaign c-20260919222216-7903",
|
|
"22:23:01 fixture up: <REDACTED-1> at <IP-2>, v1.0.0, covers lid, interlock, button",
|
|
"22:23:01 fixture: <REDACTED-1> at <IP-2> covers lid, interlock, button",
|
|
"22:23:01 queued by the unattended queue opened 2026-09-19T22:23:01Z",
|
|
"22:23:01 baseline: pre: clean",
|
|
"22:23:01 forgefirm-version: 20260919221704 (dev) (manifest: 20260919221704 (dev))",
|
|
"22:23:01 CONFIG_PREEMPT=y",
|
|
"22:23:01 CONFIG_IMX2_WDT=y",
|
|
"22:23:01 CONFIG_PANIC_ON_OOPS=y",
|
|
"22:23:01 watchdog0: {'identity': 'imx2+ watchdog', 'state': 'inactive', 'timeout': '60', 'bootstatus': '0', 'wcr': '0x771f', 'wde': True, 'period_s': 60.0}",
|
|
"22:23:01 kernel release 6.12.20-fslc-fslc-g0fdffb09caf6 (manifest modules dirs: 6.12.20-fslc-fslc)",
|
|
"22:23:01 cnc/state: idle",
|
|
"22:23:01 cnc/free: 33521664 bytes",
|
|
"22:23:01 cnc-pulsebuf pool: 33554432 bytes, ring_mb: 33554432 bytes",
|
|
"22:23:01 sdma clk_enable_count: 1",
|
|
"22:23:01 forgectrl pids [467], holding /dev/glowforge: [467]",
|
|
"22:23:01 mode: {'mode': 'grbl', 'controller': 'running', 'pid': 559, 'motion': 'verified', 'gated': False, 'local': False, 'why': ''}",
|
|
"22:23:01 rc6.d: K09sshd K20dbus-1 K20hwclock.sh K20ntpd K31umountnfs.sh K70forgetest K80gfcloud K80grblhal K80networking K90forgectrl K95syslog",
|
|
"22:23:01 /data/forgefirm/panel.token mode 600",
|
|
"22:23:01 /data/forgefirm/forgefirm.conf mode 600",
|
|
"22:23:01 /data free: 2762 MiB",
|
|
"22:23:01 / mounted ro,relatime; /data rw,relatime; /var/lib rw,relatime",
|
|
"22:23:01 dev image True; /factory mounts: ['/factory/img1', '/factory/img2']",
|
|
"22:23:01 manifest 58495afe066c: 9 components",
|
|
"22:23:01 baseline: post: clean",
|
|
"22:23:01 result PASS"
|
|
],
|
|
"manifest_sha": "58495afe066c6964484fb07d5664895a4e742e65509c81c10056d9303570f182",
|
|
"message": "",
|
|
"result": "PASS",
|
|
"test": "image.health",
|
|
"ts": "2026-09-19T22:23:01Z"
|
|
},
|
|
"requires": [],
|
|
"satisfied": true,
|
|
"source_sha": "db2644384971ea88e443d1aafa4cc01073e73f270536677bd0ce0a5b02cb20a9",
|
|
"subsystem": "image",
|
|
"title": "Post-flash image health"
|
|
},
|
|
{
|
|
"always": false,
|
|
"covers": [
|
|
[
|
|
"forgectrl",
|
|
"src/main.c"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/ui/index.html"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/ui/wizard.html"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/ui/login.html"
|
|
]
|
|
],
|
|
"fingerprint": "e65403bc81b923135113f682b716c72c198db1972030c174dda15c0bfde990b2",
|
|
"hardware": "api",
|
|
"id": "image.license-bundle",
|
|
"inherited": true,
|
|
"kind": "auto",
|
|
"record": {
|
|
"answers": [],
|
|
"campaign": "c-20260919202934-3d3a",
|
|
"duration_s": 3,
|
|
"evidence": {
|
|
"baseline": {
|
|
"post": [],
|
|
"pre": []
|
|
},
|
|
"batch": {
|
|
"group": "unattended",
|
|
"ts": "2026-09-19T20:29:34Z"
|
|
},
|
|
"bundle_bytes": 682237,
|
|
"fixture": {
|
|
"channels": [
|
|
"lid",
|
|
"interlock",
|
|
"button"
|
|
],
|
|
"hostname": "<REDACTED-1>",
|
|
"ip": "<IP-1>",
|
|
"released": []
|
|
},
|
|
"generic_texts": 406,
|
|
"packages": 261
|
|
},
|
|
"fingerprint": "e65403bc81b923135113f682b716c72c198db1972030c174dda15c0bfde990b2",
|
|
"image": "20260919202327 (dev)",
|
|
"log": [
|
|
"20:29:37 start image.license-bundle (auto, api) in campaign c-20260919202934-3d3a",
|
|
"20:29:37 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
|
|
"20:29:37 fixture: <REDACTED-1> at <IP-1> covers lid, interlock, button",
|
|
"20:29:37 queued by the unattended queue opened 2026-09-19T20:29:34Z",
|
|
"20:29:38 baseline: pre: clean",
|
|
"20:29:38 /usr/share/forgefirm/licenses.tar.gz: 682237 bytes",
|
|
"20:29:39 manifest lists 261 packages; 406 generic license entries",
|
|
"20:29:40 baseline: post: clean",
|
|
"20:29:40 result PASS"
|
|
],
|
|
"manifest_sha": "2d41354cdfb037d942fbe328e2ae0594efadd92e976d1c4512ca461b5f864a7e",
|
|
"message": "",
|
|
"result": "PASS",
|
|
"test": "image.license-bundle",
|
|
"ts": "2026-09-19T20:29:40Z"
|
|
},
|
|
"requires": [
|
|
"forgectrl.panel-serves"
|
|
],
|
|
"satisfied": true,
|
|
"source_sha": "b991ef1556725f2fafe6d71607200a4bf6cfd0d5dd8f8a3dfa037b339c4bb70e",
|
|
"subsystem": "image",
|
|
"title": "The license texts travel with the image"
|
|
},
|
|
{
|
|
"always": false,
|
|
"covers": [],
|
|
"fingerprint": "e57e9f3d605290af1d1c816d985bca3a42bd49a197cbbf01db504507a9cfccde",
|
|
"hardware": "api",
|
|
"id": "image.network-boot",
|
|
"inherited": true,
|
|
"kind": "auto",
|
|
"record": {
|
|
"answers": [],
|
|
"campaign": "c-20260919202934-3d3a",
|
|
"duration_s": 0,
|
|
"evidence": {
|
|
"accept_ra": "1",
|
|
"baseline": {
|
|
"post": [],
|
|
"pre": []
|
|
},
|
|
"batch": {
|
|
"group": "unattended",
|
|
"ts": "2026-09-19T20:29:34Z"
|
|
},
|
|
"dhcp6_running": [],
|
|
"disable_ipv6": "0",
|
|
"fixture": {
|
|
"channels": [
|
|
"lid",
|
|
"interlock",
|
|
"button"
|
|
],
|
|
"hostname": "<REDACTED-1>",
|
|
"ip": "<IP-1>",
|
|
"released": []
|
|
},
|
|
"getty": [
|
|
"/sbin/getty -L 115200 ttymxc0 vt102"
|
|
],
|
|
"global": [],
|
|
"ifstate": [
|
|
"lo",
|
|
"wlan0"
|
|
],
|
|
"ifup_running": [],
|
|
"interfaces_dhcp6": [],
|
|
"link_local": [
|
|
"<HEX-1>"
|
|
],
|
|
"udhcpc": [
|
|
"udhcpc -R -b -p /var/run/udhcpc.wlan0.pid -i wlan0 -x hostname:forgefirm-b00a"
|
|
]
|
|
},
|
|
"fingerprint": "e57e9f3d605290af1d1c816d985bca3a42bd49a197cbbf01db504507a9cfccde",
|
|
"image": "20260919202327 (dev)",
|
|
"log": [
|
|
"20:29:40 start image.network-boot (auto, api) in campaign c-20260919202934-3d3a",
|
|
"20:29:41 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
|
|
"20:29:41 fixture: <REDACTED-1> at <IP-1> covers lid, interlock, button",
|
|
"20:29:41 queued by the unattended queue opened 2026-09-19T20:29:34Z",
|
|
"20:29:41 baseline: pre: clean",
|
|
"20:29:41 wlan0: 1 link-local, 0 global IPv6 address(es)",
|
|
"20:29:41 baseline: post: clean",
|
|
"20:29:41 result PASS"
|
|
],
|
|
"manifest_sha": "2d41354cdfb037d942fbe328e2ae0594efadd92e976d1c4512ca461b5f864a7e",
|
|
"message": "",
|
|
"result": "PASS",
|
|
"test": "image.network-boot",
|
|
"ts": "2026-09-19T20:29:41Z"
|
|
},
|
|
"requires": [],
|
|
"satisfied": true,
|
|
"source_sha": "e36268995e8598c3a568eef2f838aa144c8976508ba348a5ac7fae6c58697daf",
|
|
"subsystem": "image",
|
|
"title": "The boot does not wait on the network"
|
|
},
|
|
{
|
|
"always": true,
|
|
"covers": [
|
|
[
|
|
"kernel-module-glowforge",
|
|
"**"
|
|
],
|
|
[
|
|
"linux-fslc",
|
|
"**"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/super.c"
|
|
],
|
|
[
|
|
"grblhal-glowforge",
|
|
"src/glowforge_laser.c"
|
|
],
|
|
[
|
|
"grblhal-glowforge",
|
|
"src/driver.c"
|
|
]
|
|
],
|
|
"fingerprint": "06511edda6ef4b1ff9afbdd3d1b777074cd012ac0e71397e760dee1e602c9454",
|
|
"hardware": "api",
|
|
"id": "kernel.latch-locked-idle",
|
|
"inherited": false,
|
|
"kind": "auto",
|
|
"record": {
|
|
"answers": [],
|
|
"campaign": "c-20260919222216-7903",
|
|
"duration_s": 0,
|
|
"evidence": {
|
|
"baseline": {
|
|
"post": [],
|
|
"pre": []
|
|
},
|
|
"batch": {
|
|
"group": "unattended",
|
|
"ts": "2026-09-19T22:23:01Z"
|
|
},
|
|
"cnc_state": "idle",
|
|
"faults": 0,
|
|
"fixture": {
|
|
"channels": [
|
|
"lid",
|
|
"interlock",
|
|
"button"
|
|
],
|
|
"hostname": "<REDACTED-1>",
|
|
"ip": "<IP-1>",
|
|
"released": []
|
|
},
|
|
"forgectrl_laser_locked": true,
|
|
"interlock_circuit": 45,
|
|
"laser_enable": 0,
|
|
"laser_on": 0,
|
|
"laser_on_sampled": 0
|
|
},
|
|
"fingerprint": "06511edda6ef4b1ff9afbdd3d1b777074cd012ac0e71397e760dee1e602c9454",
|
|
"image": "20260919221704 (dev)",
|
|
"log": [
|
|
"22:23:02 start kernel.latch-locked-idle (auto, api) in campaign c-20260919222216-7903",
|
|
"22:23:02 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
|
|
"22:23:02 fixture: <REDACTED-1> at <IP-1> covers lid, interlock, button",
|
|
"22:23:02 queued by the unattended queue opened 2026-09-19T22:23:01Z",
|
|
"22:23:02 baseline: pre: clean",
|
|
"22:23:02 cnc/state: idle",
|
|
"22:23:02 interlock_circuit: 45 (0x2d)",
|
|
"22:23:02 laser_enable (FIRE line): 0",
|
|
"22:23:02 laser_on: 0, laser_on_sampled: 0",
|
|
"22:23:02 faults: 0",
|
|
"22:23:02 forgectrl /status laser_locked=True state=idle",
|
|
"22:23:02 baseline: post: clean",
|
|
"22:23:02 result PASS"
|
|
],
|
|
"manifest_sha": "58495afe066c6964484fb07d5664895a4e742e65509c81c10056d9303570f182",
|
|
"message": "",
|
|
"result": "PASS",
|
|
"test": "kernel.latch-locked-idle",
|
|
"ts": "2026-09-19T22:23:02Z"
|
|
},
|
|
"requires": [],
|
|
"satisfied": true,
|
|
"source_sha": "1788ae024ad871dcb952cacf773e71aa7f7312ceccf8eaf07019ef080a2e6df4",
|
|
"subsystem": "kernel",
|
|
"title": "Laser latch locked at idle"
|
|
},
|
|
{
|
|
"always": true,
|
|
"covers": [
|
|
[
|
|
"kernel-module-glowforge",
|
|
"**"
|
|
],
|
|
[
|
|
"linux-fslc",
|
|
"**"
|
|
]
|
|
],
|
|
"fingerprint": "abc10fb6ec17e69bb25bc63b4415c7c55e12ac57bb6cbd2f510f0db62309b370",
|
|
"hardware": "takeover",
|
|
"id": "kernel.k1-k2",
|
|
"inherited": false,
|
|
"kind": "auto",
|
|
"record": {
|
|
"answers": [],
|
|
"campaign": "c-20260919222216-7903",
|
|
"duration_s": 22,
|
|
"evidence": {
|
|
"baseline": {
|
|
"post": [],
|
|
"pre": []
|
|
},
|
|
"batch": {
|
|
"group": "unattended",
|
|
"ts": "2026-09-19T22:23:01Z"
|
|
},
|
|
"fixture": {
|
|
"channels": [
|
|
"lid",
|
|
"interlock",
|
|
"button"
|
|
],
|
|
"hostname": "<REDACTED-1>",
|
|
"ip": "<IP-1>",
|
|
"released": []
|
|
},
|
|
"k1": {
|
|
"faults": "0",
|
|
"state": "idle",
|
|
"stop_to_idle_s": 0.0906
|
|
},
|
|
"k2": {
|
|
"end_state": "idle",
|
|
"faults": "0",
|
|
"hits": [],
|
|
"laser_on_sampled": "0",
|
|
"pos_after": [
|
|
0,
|
|
0,
|
|
0,
|
|
55001,
|
|
55001
|
|
],
|
|
"pos_before": [
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
55001
|
|
],
|
|
"underruns": "0"
|
|
}
|
|
},
|
|
"fingerprint": "abc10fb6ec17e69bb25bc63b4415c7c55e12ac57bb6cbd2f510f0db62309b370",
|
|
"image": "20260919221704 (dev)",
|
|
"log": [
|
|
"22:23:02 start kernel.k1-k2 (auto, takeover) in campaign c-20260919222216-7903",
|
|
"22:23:03 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
|
|
"22:23:03 fixture: <REDACTED-1> at <IP-1> covers lid, interlock, button",
|
|
"22:23:03 queued by the unattended queue opened 2026-09-19T22:23:01Z",
|
|
"22:23:03 baseline: pre: clean",
|
|
"22:23:03 takeover: waiting for forgectrl to be settled",
|
|
"22:23:03 baseline: /mode controller=running motion=verified",
|
|
"22:23:03 takeover: preserving cnc/motor_lock=0, cnc/step_freq=112640, cnc/ramp_rate=500000, cnc/streaming=0, cnc/x_mode=32, cnc/y_mode=32, cnc/x_decay=1, cnc/y_decay=1, pic/x_step_current=33, pic/y_step_current=5",
|
|
"22:23:03 takeover: stopping the controller through forgectrl",
|
|
"22:23:03 takeover: POST /controller/stop -> 200",
|
|
"22:23:03 takeover: forgectrl stop -> rc 0",
|
|
"22:23:04 takeover: pulse device free",
|
|
"22:23:04 K1: 60001 bytes = 6.0 s of pads at 10000 Hz, ramp 125000 Hz/s",
|
|
"22:23:04 K1 pre: state=idle laser_enable=0 laser_on=0 laser_on_sampled=0 interlock=45",
|
|
"22:23:06 K1 controlled stop: state=idle after 0.0906 s, faults=0",
|
|
"22:23:11 K1 PASS: decelerating tail 0.0906 s, no burst, no fault",
|
|
"22:23:11 K2: 55001 bytes = 5.5 s; latch stays LOCKED; waypoint +200; motor_lock=15",
|
|
"22:23:11 K2 pre: state=idle laser_enable=0 laser_on=0 laser_on_sampled=0 interlock=13",
|
|
"22:23:12 K2: paused inside the pads; resuming with waypoint +200 (latch LOCKED)",
|
|
"22:23:17 K2 post: state=idle laser_enable=0 laser_on=0 laser_on_sampled=0 interlock=13",
|
|
"22:23:17 K2 done: state=idle pos before=(0, 0, 0, 0, 55001) after=(0, 0, 0, 55001, 55001)",
|
|
"22:23:17 K2 PASS: FIRE window replayed after the resume waypoint with laser_enable/laser_on at 0 throughout",
|
|
"22:23:17 takeover: forgectrl start -> rc 0",
|
|
"22:23:19 baseline: /mode controller=stopped motion=unverified",
|
|
"22:23:24 baseline: /mode controller=running motion=verified",
|
|
"22:23:24 baseline: post: clean",
|
|
"22:23:24 result PASS"
|
|
],
|
|
"manifest_sha": "58495afe066c6964484fb07d5664895a4e742e65509c81c10056d9303570f182",
|
|
"message": "",
|
|
"result": "PASS",
|
|
"test": "kernel.k1-k2",
|
|
"ts": "2026-09-19T22:23:24Z"
|
|
},
|
|
"requires": [
|
|
"kernel.latch-locked-idle"
|
|
],
|
|
"satisfied": true,
|
|
"source_sha": "4e4100cbb67b89b32ce61c730efb01e5b3f113443625de26c0aae5c737a8b75d",
|
|
"subsystem": "kernel",
|
|
"title": "Controlled-stop floor and resume honors the locked latch"
|
|
},
|
|
{
|
|
"always": true,
|
|
"covers": [
|
|
[
|
|
"kernel-module-glowforge",
|
|
"**"
|
|
],
|
|
[
|
|
"linux-fslc",
|
|
"**"
|
|
]
|
|
],
|
|
"fingerprint": "668e0587ece7df869b56c169ee8b2538090a3b6169a867a04eb211debb8ec513",
|
|
"hardware": "takeover",
|
|
"id": "kernel.deadman-close",
|
|
"inherited": false,
|
|
"kind": "auto",
|
|
"record": {
|
|
"answers": [],
|
|
"campaign": "c-20260919222216-7903",
|
|
"duration_s": 10,
|
|
"evidence": {
|
|
"baseline": {
|
|
"post": [],
|
|
"pre": []
|
|
},
|
|
"batch": {
|
|
"group": "unattended",
|
|
"ts": "2026-09-19T22:23:01Z"
|
|
},
|
|
"close": {
|
|
"faults": "0",
|
|
"halt_s": 0.0363,
|
|
"interlock_circuit": 13,
|
|
"state": "idle"
|
|
},
|
|
"fixture": {
|
|
"channels": [
|
|
"lid",
|
|
"interlock",
|
|
"button"
|
|
],
|
|
"hostname": "<REDACTED-1>",
|
|
"ip": "<IP-1>",
|
|
"released": []
|
|
},
|
|
"head_after": {
|
|
"measure_laser": "0",
|
|
"uv_led": "0",
|
|
"z_current": "1",
|
|
"z_enable": "1"
|
|
},
|
|
"head_before": {
|
|
"z_current": "1",
|
|
"z_enable": "0"
|
|
}
|
|
},
|
|
"fingerprint": "668e0587ece7df869b56c169ee8b2538090a3b6169a867a04eb211debb8ec513",
|
|
"image": "20260919221704 (dev)",
|
|
"log": [
|
|
"22:23:24 start kernel.deadman-close (auto, takeover) in campaign c-20260919222216-7903",
|
|
"22:23:25 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
|
|
"22:23:25 fixture: <REDACTED-1> at <IP-1> covers lid, interlock, button",
|
|
"22:23:25 queued by the unattended queue opened 2026-09-19T22:23:01Z",
|
|
"22:23:25 baseline: pre: clean",
|
|
"22:23:25 takeover: waiting for forgectrl to be settled",
|
|
"22:23:25 baseline: /mode controller=running motion=verified",
|
|
"22:23:25 takeover: preserving cnc/motor_lock=0, cnc/step_freq=112640, cnc/ramp_rate=500000, cnc/streaming=0, cnc/x_mode=32, cnc/y_mode=32, cnc/x_decay=1, cnc/y_decay=1, pic/x_step_current=33, pic/y_step_current=5",
|
|
"22:23:25 takeover: stopping the controller through forgectrl",
|
|
"22:23:25 takeover: POST /controller/stop -> 200",
|
|
"22:23:25 takeover: forgectrl stop -> rc 0",
|
|
"22:23:26 takeover: pulse device free",
|
|
"22:23:26 deadman pre: state=idle laser_enable=0 laser_on=0 laser_on_sampled=0 interlock=45",
|
|
"22:23:27 deadman post: state=idle laser_enable=0 laser_on=0 laser_on_sampled=0 interlock=13",
|
|
"22:23:27 final close: state=idle after 0.0363 s; head {'z_enable': '1', 'z_current': '1', 'measure_laser': '0', 'uv_led': '0'}",
|
|
"22:23:27 PASS: the final close halted the engine in 0.036 s, latch locked, head safed",
|
|
"22:23:28 takeover: forgectrl start -> rc 0",
|
|
"22:23:30 baseline: /mode controller=stopped motion=unverified",
|
|
"22:23:35 baseline: /mode controller=running motion=verified",
|
|
"22:23:35 baseline: post: clean",
|
|
"22:23:35 result PASS"
|
|
],
|
|
"manifest_sha": "58495afe066c6964484fb07d5664895a4e742e65509c81c10056d9303570f182",
|
|
"message": "",
|
|
"result": "PASS",
|
|
"test": "kernel.deadman-close",
|
|
"ts": "2026-09-19T22:23:35Z"
|
|
},
|
|
"requires": [
|
|
"kernel.k1-k2"
|
|
],
|
|
"satisfied": true,
|
|
"source_sha": "7e3c2a86d9b58643a71d96561b2095a72289d970c398ae08c3da20c2a30c4fea",
|
|
"subsystem": "kernel",
|
|
"title": "The final close of a running pulse device halts the engine and safes the head"
|
|
},
|
|
{
|
|
"always": true,
|
|
"covers": [
|
|
[
|
|
"kernel-module-glowforge",
|
|
"**"
|
|
],
|
|
[
|
|
"linux-fslc",
|
|
"**"
|
|
]
|
|
],
|
|
"fingerprint": "a2b506d96aaf2d1afdb30c4707985d70c4fa4f7b64307ac7ce10391a66a275a2",
|
|
"hardware": "takeover",
|
|
"id": "kernel.backtrack-bounds",
|
|
"inherited": false,
|
|
"kind": "auto",
|
|
"record": {
|
|
"answers": [],
|
|
"campaign": "c-20260919222216-7903",
|
|
"duration_s": 19,
|
|
"evidence": {
|
|
"after": {
|
|
"faults": "0",
|
|
"max_backtrack": 0,
|
|
"state": "idle",
|
|
"underruns": "0"
|
|
},
|
|
"baseline": {
|
|
"post": [],
|
|
"pre": []
|
|
},
|
|
"batch": {
|
|
"group": "unattended",
|
|
"ts": "2026-09-19T22:23:01Z"
|
|
},
|
|
"fixture": {
|
|
"channels": [
|
|
"lid",
|
|
"interlock",
|
|
"button"
|
|
],
|
|
"hostname": "<REDACTED-1>",
|
|
"ip": "<IP-1>",
|
|
"released": []
|
|
},
|
|
"max_backtrack": 15064,
|
|
"over_long_errno": 1,
|
|
"played": 15464
|
|
},
|
|
"fingerprint": "a2b506d96aaf2d1afdb30c4707985d70c4fa4f7b64307ac7ce10391a66a275a2",
|
|
"image": "20260919221704 (dev)",
|
|
"log": [
|
|
"22:23:35 start kernel.backtrack-bounds (auto, takeover) in campaign c-20260919222216-7903",
|
|
"22:23:35 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
|
|
"22:23:35 fixture: <REDACTED-1> at <IP-1> covers lid, interlock, button",
|
|
"22:23:35 queued by the unattended queue opened 2026-09-19T22:23:01Z",
|
|
"22:23:35 baseline: pre: clean",
|
|
"22:23:35 takeover: waiting for forgectrl to be settled",
|
|
"22:23:35 baseline: /mode controller=running motion=verified",
|
|
"22:23:35 takeover: preserving cnc/motor_lock=0, cnc/step_freq=112640, cnc/ramp_rate=500000, cnc/streaming=0, cnc/x_mode=32, cnc/y_mode=32, cnc/x_decay=1, cnc/y_decay=1, pic/x_step_current=33, pic/y_step_current=5",
|
|
"22:23:35 takeover: stopping the controller through forgectrl",
|
|
"22:23:36 takeover: POST /controller/stop -> 200",
|
|
"22:23:36 takeover: forgectrl stop -> rc 0",
|
|
"22:23:37 takeover: pulse device free",
|
|
"22:23:37 60001 bytes = 6.0 s of pads at 10000 Hz; decel tail 400 steps",
|
|
"22:23:37 pre: state=idle laser_enable=0 laser_on=0 laser_on_sampled=0 interlock=45",
|
|
"22:23:39 played 15464 bytes; max_backtrack 15064",
|
|
"22:23:41 backtrack of 15064 done: state=idle max_backtrack now 0",
|
|
"22:23:47 PASS: max_backtrack tracks the played history, the boundary is enforced, and the run at it plays out clean",
|
|
"22:23:47 takeover: forgectrl start -> rc 0",
|
|
"22:23:49 baseline: /mode controller=stopped motion=unverified",
|
|
"22:23:54 baseline: /mode controller=running motion=verified",
|
|
"22:23:54 baseline: post: clean",
|
|
"22:23:54 result PASS"
|
|
],
|
|
"manifest_sha": "58495afe066c6964484fb07d5664895a4e742e65509c81c10056d9303570f182",
|
|
"message": "",
|
|
"result": "PASS",
|
|
"test": "kernel.backtrack-bounds",
|
|
"ts": "2026-09-19T22:23:54Z"
|
|
},
|
|
"requires": [
|
|
"kernel.k1-k2"
|
|
],
|
|
"satisfied": true,
|
|
"source_sha": "b1be3c6320f448c80593a33582e3a1ed6bf287e9bf327e9c3440ea31b7b4c60d",
|
|
"subsystem": "kernel",
|
|
"title": "A backward run is bounded by the history the ring still holds"
|
|
},
|
|
{
|
|
"always": true,
|
|
"covers": [
|
|
[
|
|
"kernel-module-glowforge",
|
|
"**"
|
|
],
|
|
[
|
|
"linux-fslc",
|
|
"**"
|
|
]
|
|
],
|
|
"fingerprint": "dae7f2ff1ea977897b54395e9f47efa63a619da516a011f8dbf2b5bcd8076cf4",
|
|
"hardware": "takeover",
|
|
"id": "kernel.fire-line",
|
|
"inherited": false,
|
|
"kind": "auto",
|
|
"record": {
|
|
"answers": [],
|
|
"campaign": "c-20260919222216-7903",
|
|
"duration_s": 43,
|
|
"evidence": {
|
|
"A": {
|
|
"any_fire_driven": false,
|
|
"any_laser_on": false,
|
|
"faults": "0",
|
|
"mid": {
|
|
"interlock": "13",
|
|
"laser_enable": "0",
|
|
"laser_on": "0",
|
|
"laser_on_sampled": "0",
|
|
"t": 1.5
|
|
},
|
|
"moved": false,
|
|
"tail": {
|
|
"after_s": 6.01,
|
|
"laser_enable": "0",
|
|
"laser_on": "0",
|
|
"state": "idle"
|
|
},
|
|
"underruns_after": 0,
|
|
"underruns_before": 0
|
|
},
|
|
"B": {
|
|
"any_fire_driven": true,
|
|
"any_laser_on": false,
|
|
"faults": "0",
|
|
"mid": {
|
|
"interlock": "7",
|
|
"laser_enable": "1",
|
|
"laser_on": "0",
|
|
"laser_on_sampled": "0",
|
|
"t": 1.53
|
|
},
|
|
"moved": false,
|
|
"tail": {
|
|
"after_s": 6.02,
|
|
"laser_enable": "0",
|
|
"laser_on": "0",
|
|
"state": "idle"
|
|
},
|
|
"underruns_after": 0,
|
|
"underruns_before": 0
|
|
},
|
|
"U": {
|
|
"any_fire_driven": true,
|
|
"any_laser_on": false,
|
|
"faults": "0",
|
|
"mid": {
|
|
"interlock": "7",
|
|
"laser_enable": "1",
|
|
"laser_on": "0",
|
|
"laser_on_sampled": "0",
|
|
"t": 1.51
|
|
},
|
|
"moved": false,
|
|
"tail": {
|
|
"acked_state": "idle",
|
|
"after_s": 6.02,
|
|
"laser_enable": "0",
|
|
"laser_on": "0",
|
|
"state": "underrun"
|
|
},
|
|
"underruns_after": 1,
|
|
"underruns_before": 0
|
|
},
|
|
"baseline": {
|
|
"post": [],
|
|
"pre": []
|
|
},
|
|
"batch": {
|
|
"group": "unattended",
|
|
"ts": "2026-09-19T22:23:01Z"
|
|
},
|
|
"charge_pump_alive": "0",
|
|
"fixture": {
|
|
"channels": [
|
|
"lid",
|
|
"interlock",
|
|
"button"
|
|
],
|
|
"hostname": "<REDACTED-1>",
|
|
"ip": "<IP-1>",
|
|
"released": []
|
|
},
|
|
"hv_release_s": [
|
|
0.0,
|
|
0.41,
|
|
0.41,
|
|
0.41
|
|
],
|
|
"k3": {
|
|
"end_state": "idle",
|
|
"faults": "0",
|
|
"hits": [],
|
|
"interlock_after_unlock": "5",
|
|
"laser_on_sampled": "0",
|
|
"underruns": "1"
|
|
},
|
|
"kernel_state": "idle"
|
|
},
|
|
"fingerprint": "dae7f2ff1ea977897b54395e9f47efa63a619da516a011f8dbf2b5bcd8076cf4",
|
|
"image": "20260919221704 (dev)",
|
|
"log": [
|
|
"22:23:54 start kernel.fire-line (auto, takeover) in campaign c-20260919222216-7903",
|
|
"22:23:54 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
|
|
"22:23:54 fixture: <REDACTED-1> at <IP-1> covers lid, interlock, button",
|
|
"22:23:54 queued by the unattended queue opened 2026-09-19T22:23:01Z",
|
|
"22:23:54 baseline: pre: clean",
|
|
"22:23:54 takeover: waiting for forgectrl to be settled",
|
|
"22:23:54 baseline: /mode controller=running motion=verified",
|
|
"22:23:54 takeover: preserving cnc/motor_lock=0, cnc/step_freq=112640, cnc/ramp_rate=500000, cnc/streaming=0, cnc/x_mode=32, cnc/y_mode=32, cnc/x_decay=1, cnc/y_decay=1, pic/x_step_current=33, pic/y_step_current=5",
|
|
"22:23:54 takeover: stopping the controller through forgectrl",
|
|
"22:23:55 takeover: POST /controller/stop -> 200",
|
|
"22:23:55 takeover: forgectrl stop -> rc 0",
|
|
"22:23:55 takeover: pulse device free",
|
|
"22:23:55 fire A: stream 60001 bytes = 6.000 s",
|
|
"22:23:55 fire A pre: state=idle laser_enable=0 laser_on=0 laser_on_sampled=0 interlock=45",
|
|
"22:23:57 fire A mid (inside FIRE window): laser_enable=0 laser_on=0 laser_on_sampled=0 interlock=13",
|
|
"22:24:02 fire A done: state=idle after 6.0 s (laser_enable=0)",
|
|
"22:24:02 fire A post: state=idle laser_enable=0 laser_on=0 laser_on_sampled=0 interlock=13",
|
|
"22:24:02 fire A: moved=False underruns 0->0 faults=0",
|
|
"22:24:02 fire A PASS: latch locked, no FIRE drive, no LASER_ON",
|
|
"22:24:02 fire B: stream 60001 bytes = 6.000 s",
|
|
"22:24:02 hv off: released after 0.41 s",
|
|
"22:24:02 fire B pre: state=idle laser_enable=0 laser_on=0 laser_on_sampled=0 interlock=45",
|
|
"22:24:03 fire B: latch UNLOCKED for this run",
|
|
"22:24:04 fire B mid (inside FIRE window): laser_enable=1 laser_on=0 laser_on_sampled=0 interlock=7",
|
|
"22:24:09 fire B done: state=idle after 6.0 s (laser_enable=0)",
|
|
"22:24:09 fire B post: state=idle laser_enable=0 laser_on=0 laser_on_sampled=0 interlock=13",
|
|
"22:24:09 fire B: moved=False underruns 0->0 faults=0",
|
|
"22:24:09 fire B PASS: FIRE driven mid-window, LASER_ON off, FIRE clear at end-of-data",
|
|
"22:24:09 fire U: stream 60001 bytes = 6.000 s",
|
|
"22:24:09 hv off: released after 0.41 s",
|
|
"22:24:09 fire U pre: state=idle laser_enable=0 laser_on=0 laser_on_sampled=0 interlock=45",
|
|
"22:24:10 fire U: streaming=1, the terminal end-of-data will be a TRUE UNDERRUN",
|
|
"22:24:10 fire U: latch UNLOCKED for this run",
|
|
"22:24:11 fire U mid (inside FIRE window): laser_enable=1 laser_on=0 laser_on_sampled=0 interlock=7",
|
|
"22:24:16 fire U done: state=underrun after 6.0 s (laser_enable=0)",
|
|
"22:24:16 fire U: underrun state reached as EXPECTED; acking via stop",
|
|
"22:24:16 fire U: acked: state=idle",
|
|
"22:24:16 fire U post: state=idle laser_enable=0 laser_on=0 laser_on_sampled=0 interlock=13",
|
|
"22:24:16 fire U: moved=False underruns 0->1 faults=0",
|
|
"22:24:16 fire U PASS: true underrun, backstop dropped FIRE, stop acked",
|
|
"22:24:16 hv off: released after 0.41 s",
|
|
"22:24:16 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",
|
|
"22:24:16 K3 pre: state=idle laser_enable=0 laser_on=0 laser_on_sampled=0 interlock=45",
|
|
"22:24:17 K3: latch UNLOCKED mid-ramp; interlock=5 (bit 3 should read 0)",
|
|
"22:24:20 K3 post: state=idle laser_enable=0 laser_on=0 laser_on_sampled=0 interlock=5",
|
|
"22:24:20 K3 PASS: laser_enable stayed 0 for the entire run after the mid-ramp unlock",
|
|
"22:24:20 safe state restored: state=disabled latch=LOCKED",
|
|
"22:24:20 takeover: forgectrl start -> rc 0",
|
|
"22:24:22 baseline: /mode controller=stopped motion=unverified",
|
|
"22:24:25 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
|
|
"22:24:36 baseline: /mode controller=stopped motion=verified",
|
|
"22:24:37 baseline: /mode controller=running motion=verified",
|
|
"22:24:38 baseline: post: clean",
|
|
"22:24:38 result PASS"
|
|
],
|
|
"manifest_sha": "58495afe066c6964484fb07d5664895a4e742e65509c81c10056d9303570f182",
|
|
"message": "",
|
|
"result": "PASS",
|
|
"test": "kernel.fire-line",
|
|
"ts": "2026-09-19T22:24:38Z"
|
|
},
|
|
"requires": [
|
|
"kernel.k1-k2"
|
|
],
|
|
"satisfied": true,
|
|
"source_sha": "5dba915328877d4fbd8158b8c4a5ec0292453fdb4c029f735894d600c861e461",
|
|
"subsystem": "kernel",
|
|
"title": "FIRE line: latch locked, unlocked-unarmed, true underrun, and a mid-run unlock"
|
|
},
|
|
{
|
|
"always": false,
|
|
"covers": [
|
|
[
|
|
"kernel-module-glowforge",
|
|
"**"
|
|
],
|
|
[
|
|
"linux-fslc",
|
|
"**"
|
|
]
|
|
],
|
|
"fingerprint": "001acf3b216390f4969868ac2469c64f94a2cd451e3fdbd2afbc52073ee748fc",
|
|
"hardware": "takeover",
|
|
"id": "kernel.resume-lead",
|
|
"inherited": true,
|
|
"kind": "auto",
|
|
"record": {
|
|
"answers": [],
|
|
"campaign": "c-20260919202934-3d3a",
|
|
"duration_s": 21,
|
|
"evidence": {
|
|
"E": {
|
|
"data_s": 0.501,
|
|
"faults": "0",
|
|
"run_to_idle_s": 0.505,
|
|
"state": "idle",
|
|
"underruns_after": 1,
|
|
"underruns_before": 1
|
|
},
|
|
"L": {
|
|
"any_laser_on": false,
|
|
"driven_samples": 890,
|
|
"end_state": "idle",
|
|
"faults": "0",
|
|
"first_driven_s": 1.0035,
|
|
"inside_lead": [],
|
|
"laser_on_sampled": "0",
|
|
"last_driven_s": 2.0035,
|
|
"samples": 1969
|
|
},
|
|
"baseline": {
|
|
"post": [],
|
|
"pre": []
|
|
},
|
|
"batch": {
|
|
"group": "unattended",
|
|
"ts": "2026-09-19T20:29:34Z"
|
|
},
|
|
"charge_pump_alive": "0",
|
|
"fixture": {
|
|
"channels": [
|
|
"lid",
|
|
"interlock",
|
|
"button"
|
|
],
|
|
"hostname": "<REDACTED-1>",
|
|
"ip": "<IP-1>",
|
|
"released": []
|
|
},
|
|
"hv_release_s": [
|
|
0.0,
|
|
0.36
|
|
],
|
|
"kernel_state": "idle"
|
|
},
|
|
"fingerprint": "001acf3b216390f4969868ac2469c64f94a2cd451e3fdbd2afbc52073ee748fc",
|
|
"image": "20260919202327 (dev)",
|
|
"log": [
|
|
"20:31:15 start kernel.resume-lead (auto, takeover) in campaign c-20260919202934-3d3a",
|
|
"20:31:15 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
|
|
"20:31:15 fixture: <REDACTED-1> at <IP-1> covers lid, interlock, button",
|
|
"20:31:15 queued by the unattended queue opened 2026-09-19T20:29:34Z",
|
|
"20:31:16 baseline: pre: clean",
|
|
"20:31:16 takeover: waiting for forgectrl to be settled",
|
|
"20:31:16 baseline: /mode controller=running motion=verified",
|
|
"20:31:16 takeover: preserving cnc/motor_lock=0, cnc/step_freq=112640, cnc/ramp_rate=500000, cnc/streaming=0, cnc/x_mode=32, cnc/y_mode=32, cnc/x_decay=1, cnc/y_decay=1, pic/x_step_current=33, pic/y_step_current=5",
|
|
"20:31:16 takeover: stopping the controller through forgectrl",
|
|
"20:31:16 takeover: POST /controller/stop -> 200",
|
|
"20:31:16 takeover: forgectrl stop -> rc 0",
|
|
"20:31:17 takeover: pulse device free",
|
|
"20:31:17 E: 501 bytes = 0.5 s of pads at 1000 Hz; resume with a 10000-byte lead (never reached)",
|
|
"20:31:17 E pre: state=idle laser_enable=0 laser_on=0 laser_on_sampled=0 interlock=45",
|
|
"20:31:18 E: idle after 0.505 s (the data is 0.501 s; a lost end-of-data would add 0.255 s)",
|
|
"20:31:18 E PASS: end-of-data before the waypoint ended the run on time",
|
|
"20:31:18 hv off: released after 0.36 s",
|
|
"20:31:18 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:31:18 L pre: state=idle laser_enable=0 laser_on=0 laser_on_sampled=0 interlock=45",
|
|
"20:31:21 L post: state=idle laser_enable=0 laser_on=0 laser_on_sampled=0 interlock=13",
|
|
"20:31:21 L: 1969 samples, FIRE driven in 890, first at 1.0035 s, last at 2.0035 s, end state idle",
|
|
"20:31:21 L PASS: FIRE low through the 1.0 s lead, driven from the waypoint on, LASER_ON off",
|
|
"20:31:21 safe state restored: state=disabled latch=LOCKED",
|
|
"20:31:21 takeover: forgectrl start -> rc 0",
|
|
"20:31:23 baseline: /mode controller=stopped motion=unverified",
|
|
"20:31:37 baseline: /mode controller=running motion=verified",
|
|
"20:31:37 baseline: post: clean",
|
|
"20:31:37 result PASS"
|
|
],
|
|
"manifest_sha": "2d41354cdfb037d942fbe328e2ae0594efadd92e976d1c4512ca461b5f864a7e",
|
|
"message": "",
|
|
"result": "PASS",
|
|
"test": "kernel.resume-lead",
|
|
"ts": "2026-09-19T20:31:37Z"
|
|
},
|
|
"requires": [
|
|
"kernel.k1-k2"
|
|
],
|
|
"satisfied": true,
|
|
"source_sha": "3864aec6824da0e2787412e12220e2f53888934a283a30a25634bcd9d1af19f2",
|
|
"subsystem": "kernel",
|
|
"title": "A resume's laser-off lead, and an end-of-data before the waypoint"
|
|
},
|
|
{
|
|
"always": false,
|
|
"covers": [
|
|
[
|
|
"kernel-module-glowforge",
|
|
"**"
|
|
],
|
|
[
|
|
"linux-fslc",
|
|
"**"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/diag.c"
|
|
]
|
|
],
|
|
"fingerprint": "48707a5ee89410534023c0a514ec1025147757e8d960783e989b489be043a9f4",
|
|
"hardware": "api",
|
|
"id": "kernel.pic-soc-load",
|
|
"inherited": true,
|
|
"kind": "auto",
|
|
"record": {
|
|
"answers": [],
|
|
"campaign": "c-20260919202934-3d3a",
|
|
"duration_s": 3,
|
|
"evidence": {
|
|
"baseline": {
|
|
"post": [],
|
|
"pre": []
|
|
},
|
|
"batch": {
|
|
"group": "unattended",
|
|
"ts": "2026-09-19T20:29:34Z"
|
|
},
|
|
"control": {
|
|
"busy": {
|
|
"iqr": 2,
|
|
"max": 649,
|
|
"mean": 642.02,
|
|
"med": 642,
|
|
"min": 639,
|
|
"n": 200
|
|
},
|
|
"idle": {
|
|
"iqr": 4,
|
|
"max": 656,
|
|
"mean": 638.21,
|
|
"med": 636,
|
|
"min": 628,
|
|
"n": 200
|
|
}
|
|
},
|
|
"control_split": 6,
|
|
"fixture": {
|
|
"channels": [
|
|
"lid",
|
|
"interlock",
|
|
"button"
|
|
],
|
|
"hostname": "<REDACTED-1>",
|
|
"ip": "<IP-1>",
|
|
"released": []
|
|
},
|
|
"pic_settle_us_after": "500",
|
|
"pic_settle_us_before": "500",
|
|
"settled": {
|
|
"busy": {
|
|
"iqr": 2,
|
|
"max": 648,
|
|
"mean": 639.79,
|
|
"med": 640,
|
|
"min": 631,
|
|
"n": 200
|
|
},
|
|
"idle": {
|
|
"iqr": 2,
|
|
"max": 644,
|
|
"mean": 639.0,
|
|
"med": 639,
|
|
"min": 630,
|
|
"n": 200
|
|
}
|
|
},
|
|
"settled_idle_moved": 3,
|
|
"settled_split": 1
|
|
},
|
|
"fingerprint": "48707a5ee89410534023c0a514ec1025147757e8d960783e989b489be043a9f4",
|
|
"image": "20260919202327 (dev)",
|
|
"log": [
|
|
"20:31:37 start kernel.pic-soc-load (auto, api) in campaign c-20260919202934-3d3a",
|
|
"20:31:37 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
|
|
"20:31:37 fixture: <REDACTED-1> at <IP-1> covers lid, interlock, button",
|
|
"20:31:37 queued by the unattended queue opened 2026-09-19T20:29:34Z",
|
|
"20:31:38 baseline: pre: clean",
|
|
"20:31:41 control (settle off): after sleep median 636 (iqr 4, 628..656); after spin median 642 (iqr 2, 639..649)",
|
|
"20:31:41 settled (500 us): after sleep median 639 (iqr 2, 630..644); after spin median 640 (iqr 2, 631..648)",
|
|
"20:31:41 split busy minus idle: control +6, settled +1",
|
|
"20:31:41 PASS: settled, an idle reader and a busy reader read the same (split +1); control split +6",
|
|
"20:31:41 baseline: post: clean",
|
|
"20:31:41 result PASS"
|
|
],
|
|
"manifest_sha": "2d41354cdfb037d942fbe328e2ae0594efadd92e976d1c4512ca461b5f864a7e",
|
|
"message": "",
|
|
"result": "PASS",
|
|
"test": "kernel.pic-soc-load",
|
|
"ts": "2026-09-19T20:31:41Z"
|
|
},
|
|
"requires": [],
|
|
"satisfied": true,
|
|
"source_sha": "a491099cc280ddaee55a303b0ee375cb72f207055b73dc89ebe5d39f9c50875c",
|
|
"subsystem": "kernel",
|
|
"title": "A PIC reading does not depend on what the reader was doing"
|
|
},
|
|
{
|
|
"always": false,
|
|
"covers": [
|
|
[
|
|
"forgectrl",
|
|
"src/auth.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/peer.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/main.c"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/session.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/users.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/ui/login.js"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/ui/wizard.js"
|
|
]
|
|
],
|
|
"fingerprint": "870584a1095b28f26c9cb2aede595dcc7320bf5d393c32e38419f7b64d77523c",
|
|
"hardware": "api",
|
|
"id": "forgectrl.auth",
|
|
"inherited": true,
|
|
"kind": "auto",
|
|
"record": {
|
|
"answers": [],
|
|
"campaign": "c-20260919202934-3d3a",
|
|
"duration_s": 1,
|
|
"evidence": {
|
|
"alive_after_oversize": 200,
|
|
"baseline": {
|
|
"post": [],
|
|
"pre": []
|
|
},
|
|
"batch": {
|
|
"group": "unattended",
|
|
"ts": "2026-09-19T20:29:34Z"
|
|
},
|
|
"cool_state_from_lan": 403,
|
|
"cool_state_from_lan_http": {
|
|
"location": "https://<IP-1>/cool/state",
|
|
"status": 302
|
|
},
|
|
"cool_state_from_loopback": 200,
|
|
"fixture": {
|
|
"channels": [
|
|
"lid",
|
|
"interlock",
|
|
"button"
|
|
],
|
|
"hostname": "<REDACTED-1>",
|
|
"ip": "<IP-2>",
|
|
"released": []
|
|
},
|
|
"fuse_noauth": 403,
|
|
"fuse_token_no_button": 403,
|
|
"host_name": 403,
|
|
"host_own_name": 200,
|
|
"host_own_name_domain": 403,
|
|
"lan_ip": "<IP-1>",
|
|
"noauth /boot": 403,
|
|
"noauth /controller/start": 403,
|
|
"noauth /controller/stop": 403,
|
|
"noauth /diag/abort": 403,
|
|
"noauth /diag/flow-verify": 403,
|
|
"noauth /mode": 403,
|
|
"noauth /restore/factory": 403,
|
|
"noauth /restore/factory-return": 403,
|
|
"noauth /settings": 403,
|
|
"noauth /system/reboot": 403,
|
|
"noauth /system/ssh": 403,
|
|
"noauth /update/apply": 403,
|
|
"noauth /update/check": 403,
|
|
"noauth /update/dismiss": 403,
|
|
"noauth /update/upload": 403,
|
|
"noauth /wiz/account": 403,
|
|
"noauth /wiz/advisories/accept": 403,
|
|
"noauth /wiz/complete": 403,
|
|
"origin_name": 403,
|
|
"oversize_body_status": 403,
|
|
"setup_from_lan": {
|
|
"location": "/login?next=/setup%3Fstep%3Dlaser.focus",
|
|
"status": 302
|
|
},
|
|
"sfs_cross": 403
|
|
},
|
|
"fingerprint": "870584a1095b28f26c9cb2aede595dcc7320bf5d393c32e38419f7b64d77523c",
|
|
"image": "20260919202327 (dev)",
|
|
"log": [
|
|
"20:31:41 start forgectrl.auth (auto, api) in campaign c-20260919202934-3d3a",
|
|
"20:31:41 fixture up: <REDACTED-1> at <IP-2>, v1.0.0, covers lid, interlock, button",
|
|
"20:31:41 fixture: <REDACTED-1> at <IP-2> covers lid, interlock, button",
|
|
"20:31:41 queued by the unattended queue opened 2026-09-19T20:29:34Z",
|
|
"20:31:41 baseline: pre: clean",
|
|
"20:31:41 GET /status -> 200",
|
|
"20:31:41 POST /controller/stop (no token) -> 403 {'error': 'authentication required'}",
|
|
"20:31:41 POST /controller/start (no token) -> 403 {'error': 'authentication required'}",
|
|
"20:31:41 POST /mode (no token) -> 403 {'error': 'authentication required'}",
|
|
"20:31:41 POST /settings (no token) -> 403 {'error': 'authentication required'}",
|
|
"20:31:41 POST /diag/flow-verify (no token) -> 403 {'error': 'authentication required'}",
|
|
"20:31:41 POST /diag/abort (no token) -> 403 {'error': 'authentication required'}",
|
|
"20:31:41 POST /update/apply (no token) -> 403 {'error': 'authentication required'}",
|
|
"20:31:41 POST /boot (no token) -> 403 {'error': 'authentication required'}",
|
|
"20:31:41 POST /update/check (no token) -> 403 {'error': 'authentication required'}",
|
|
"20:31:41 POST /update/dismiss (no token) -> 403 {'error': 'authentication required'}",
|
|
"20:31:41 POST /system/reboot (no token) -> 403 {'error': 'authentication required'}",
|
|
"20:31:41 POST /restore/factory (no token) -> 403 {'error': 'authentication required'}",
|
|
"20:31:41 POST /restore/factory-return (no token) -> 403 {'error': 'authentication required'}",
|
|
"20:31:41 POST /system/ssh (no token) -> 403 {'error': 'authentication required'}",
|
|
"20:31:41 POST /wiz/advisories/accept (no token) -> 403 {'error': 'authentication required'}",
|
|
"20:31:41 POST /wiz/account (no token) -> 403 {'error': 'authentication required'}",
|
|
"20:31:41 POST /wiz/complete (no token) -> 403 {'error': 'authentication required'}",
|
|
"20:31:41 POST /update/upload (no token) -> 403",
|
|
"20:31:42 POST /settings (no token, 4 MiB body) -> 403",
|
|
"20:31:42 GET /status after the oversized body -> 200",
|
|
"20:31:42 GET /status Host=evil.example.net -> 403",
|
|
"20:31:42 GET /status Host=forgefirm-b00a -> 200",
|
|
"20:31:42 GET /status Host=forgefirm-b00a.example.net -> 403",
|
|
"20:31:42 GET /status Origin=http://evil.example.net -> 403",
|
|
"20:31:42 GET /status Sec-Fetch-Site=cross-site -> 403",
|
|
"20:31:42 GET /fuse-identity (no token) -> 403 {'error': 'authentication required'}",
|
|
"20:31:42 GET /fuse-identity (token, button not held) -> 403 ",
|
|
"20:31:42 POST /cool/state from loopback -> 200 {'ok': True}",
|
|
"20:31:42 POST http://<IP-1>/cool/state -> 302 https://<IP-1>/cool/state",
|
|
"20:31:42 POST https://<IP-1>/cool/state -> 403 {'error': 'loopback only'}",
|
|
"20:31:42 GET https://<IP-1>/setup?step=laser.focus (no session) -> 302 /login?next=/setup%3Fstep%3Dlaser.focus",
|
|
"20:31:42 baseline: post: clean",
|
|
"20:31:42 result PASS"
|
|
],
|
|
"manifest_sha": "2d41354cdfb037d942fbe328e2ae0594efadd92e976d1c4512ca461b5f864a7e",
|
|
"message": "",
|
|
"result": "PASS",
|
|
"test": "forgectrl.auth",
|
|
"ts": "2026-09-19T20:31:42Z"
|
|
},
|
|
"requires": [],
|
|
"satisfied": true,
|
|
"source_sha": "57adde106107846efeb8002722cd32fb99971f267ffbbec6dfd8129aecb0372f",
|
|
"subsystem": "forgectrl",
|
|
"title": "API access control"
|
|
},
|
|
{
|
|
"always": false,
|
|
"covers": [
|
|
[
|
|
"forgectrl",
|
|
"src/settings.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/main.c"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/cam.c"
|
|
]
|
|
],
|
|
"fingerprint": "a2c7f89075bdc61d2a83b40fa83a38296fc5b81d7e2905136f4f5722ebb85bea",
|
|
"hardware": "api",
|
|
"id": "forgectrl.settings-bounds",
|
|
"inherited": true,
|
|
"kind": "auto",
|
|
"record": {
|
|
"answers": [],
|
|
"campaign": "c-20260919202934-3d3a",
|
|
"duration_s": 0,
|
|
"evidence": {
|
|
"accepted": {
|
|
"key": "<REDACTED-1>",
|
|
"status": 200,
|
|
"value": "imperial"
|
|
},
|
|
"baseline": {
|
|
"post": [],
|
|
"pre": []
|
|
},
|
|
"batch": {
|
|
"group": "unattended",
|
|
"ts": "2026-09-19T20:29:34Z"
|
|
},
|
|
"fixture": {
|
|
"channels": [
|
|
"lid",
|
|
"interlock",
|
|
"button"
|
|
],
|
|
"hostname": "<REDACTED-2>",
|
|
"ip": "<IP-1>",
|
|
"released": []
|
|
},
|
|
"keys": 81,
|
|
"lid_lamp": {
|
|
"applied": "100",
|
|
"resting": "236",
|
|
"restored": "236",
|
|
"setting": ""
|
|
},
|
|
"out_of_range": 400,
|
|
"overlong": 400,
|
|
"pulse_bytes_out_of_range": 400,
|
|
"unknown_key": 400
|
|
},
|
|
"fingerprint": "a2c7f89075bdc61d2a83b40fa83a38296fc5b81d7e2905136f4f5722ebb85bea",
|
|
"image": "20260919202327 (dev)",
|
|
"log": [
|
|
"20:31:42 start forgectrl.settings-bounds (auto, api) in campaign c-20260919202934-3d3a",
|
|
"20:31:42 fixture up: <REDACTED-2> at <IP-1>, v1.0.0, covers lid, interlock, button",
|
|
"20:31:42 fixture: <REDACTED-2> at <IP-1> covers lid, interlock, button",
|
|
"20:31:42 queued by the unattended queue opened 2026-09-19T20:29:34Z",
|
|
"20:31:43 baseline: pre: clean",
|
|
"20:31:43 POST /settings gf_serial=<300 chars> -> 400 ",
|
|
"20:31:43 POST /settings laser_disarm_s=99999 -> 400",
|
|
"20:31:43 POST /settings pulse_reject_threshold_bytes=2000000000 -> 400",
|
|
"20:31:43 POST /settings no_such_key_forgetest=1 -> 400",
|
|
"20:31:43 settings unchanged after the refused writes",
|
|
"20:31:43 POST /settings <REDACTED-1>=imperial -> 200",
|
|
"20:31:43 lid lamp: setting '', pic/lid_led=236 (expected 236)",
|
|
"20:31:43 lid_lamp_idle 256 / -1 / bright refused",
|
|
"20:31:43 lid_lamp_idle=100 -> pic/lid_led=100 after 0.0 s",
|
|
"20:31:43 lid lamp follows the setting live and returns to 236",
|
|
"20:31:43 baseline: post: clean",
|
|
"20:31:43 result PASS"
|
|
],
|
|
"manifest_sha": "2d41354cdfb037d942fbe328e2ae0594efadd92e976d1c4512ca461b5f864a7e",
|
|
"message": "",
|
|
"result": "PASS",
|
|
"test": "forgectrl.settings-bounds",
|
|
"ts": "2026-09-19T20:31:43Z"
|
|
},
|
|
"requires": [],
|
|
"satisfied": true,
|
|
"source_sha": "92a10adbcafb6687595d84ea1de0880dbe8ab3fa04ccc9542570f4d4ed8d870c",
|
|
"subsystem": "forgectrl",
|
|
"title": "Settings validation and restore"
|
|
},
|
|
{
|
|
"always": false,
|
|
"covers": [
|
|
[
|
|
"forgectrl",
|
|
"src/ui.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/ui/**"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/status.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/cam.c"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/main.c"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/super.c"
|
|
],
|
|
[
|
|
"grblhal-glowforge",
|
|
"src/glowforge_status.c"
|
|
],
|
|
[
|
|
"grblhal-glowforge",
|
|
"src/serial.c"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/curverec.*"
|
|
]
|
|
],
|
|
"fingerprint": "f47469738ff1b909685831402aba8805140c8c19d83c62d886fae5a6e476915b",
|
|
"hardware": "api",
|
|
"id": "forgectrl.panel-serves",
|
|
"inherited": true,
|
|
"kind": "auto",
|
|
"record": {
|
|
"answers": [],
|
|
"campaign": "c-20260919202934-3d3a",
|
|
"duration_s": 1,
|
|
"evidence": {
|
|
"baseline": {
|
|
"post": [],
|
|
"pre": []
|
|
},
|
|
"batch": {
|
|
"group": "unattended",
|
|
"ts": "2026-09-19T20:29:34Z"
|
|
},
|
|
"cam_status": 200,
|
|
"curve_status": {
|
|
"curve": "",
|
|
"elapsed_s": 0,
|
|
"points": [],
|
|
"reason": "",
|
|
"samples": 0,
|
|
"state": "idle"
|
|
},
|
|
"fixture": {
|
|
"channels": [
|
|
"lid",
|
|
"interlock",
|
|
"button"
|
|
],
|
|
"hostname": "<REDACTED-1>",
|
|
"ip": "<IP-1>",
|
|
"released": []
|
|
},
|
|
"grbl": {
|
|
"age_s": 4.9,
|
|
"report": {
|
|
"alarm": 0,
|
|
"driver": "f93aca8",
|
|
"laser": {
|
|
"armed": false,
|
|
"arming": false,
|
|
"curve": "custom",
|
|
"floor_pct": 14,
|
|
"gamma": 1.5,
|
|
"model": "density"
|
|
},
|
|
"modals": "[GC:G0 G54 G17 G21 G90 G94 G40 G49 G98 G50 M5 M9 T0 F0 S0.]",
|
|
"overrides": {
|
|
"feed": 100,
|
|
"rapid": 100
|
|
},
|
|
"sender": {
|
|
"connected": false,
|
|
"for_s": 0,
|
|
"generation": 0,
|
|
"peer": ""
|
|
},
|
|
"state": "Idle",
|
|
"ts_mono": 82.63
|
|
}
|
|
},
|
|
"grbl_nvs": true,
|
|
"grbl_settings_status": 200,
|
|
"homed_axes": 4,
|
|
"panel_status": 200,
|
|
"state": "idle",
|
|
"switches": {
|
|
"button": false,
|
|
"head": true,
|
|
"hv_enable": false,
|
|
"interlock_ok": true,
|
|
"lid": true
|
|
},
|
|
"sys": {
|
|
"cpu_pct": 6.6,
|
|
"mem_pct": 20.4
|
|
}
|
|
},
|
|
"fingerprint": "f47469738ff1b909685831402aba8805140c8c19d83c62d886fae5a6e476915b",
|
|
"image": "20260919202327 (dev)",
|
|
"log": [
|
|
"20:29:35 start forgectrl.panel-serves (auto, api) in campaign c-20260919202934-3d3a",
|
|
"20:29:35 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
|
|
"20:29:35 fixture: <REDACTED-1> at <IP-1> covers lid, interlock, button",
|
|
"20:29:35 queued by the unattended queue opened 2026-09-19T20:29:34Z",
|
|
"20:29:36 baseline: pre: clean",
|
|
"20:29:36 GET / -> 200 (483591 bytes)",
|
|
"20:29:36 /status state=idle switches={'lid': True, 'button': False, 'interlock_ok': True, 'head': True, 'hv_enable': False}",
|
|
"20:29:37 /status sys={'cpu_pct': 6.6, 'mem_pct': 20.4}",
|
|
"20:29:37 /status homed_axes=4 pos.z=4.45 reach=-0.28..11.35",
|
|
"20:29: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': 'cached', 'sensor': 'OV5648', 'stream': {'width': 1296, 'height': 972}, 'snapshot': {'width': 2592, 'height': 1944}, 'h264': {'active': False, 'clients': 0}, 'health': {'captured': 155, 'corrupt': 0, 'restarts': 0}, 'capture_allowed': True, 'stopped_by_lid': False}",
|
|
"20:29:37 /status grbl={'age_s': 4.9, 'report': {'ts_mono': 82.63, 'state': 'Idle', 'alarm': 0, 'sender': {'connected': False, 'generation': 0, 'for_s': 0, 'peer': ''}, 'laser': {'armed': False, 'arming': False, 'model': 'density', 'floor_pct': 14, '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': 'f93aca8'}}",
|
|
"20:29:37 baseline: post: clean",
|
|
"20:29:37 result PASS"
|
|
],
|
|
"manifest_sha": "2d41354cdfb037d942fbe328e2ae0594efadd92e976d1c4512ca461b5f864a7e",
|
|
"message": "",
|
|
"result": "PASS",
|
|
"test": "forgectrl.panel-serves",
|
|
"ts": "2026-09-19T20:29:37Z"
|
|
},
|
|
"requires": [],
|
|
"satisfied": true,
|
|
"source_sha": "8e41c5a901f219dbc8466dfbb24d0e1f773c136849c49c47e18b3b9df1421e50",
|
|
"subsystem": "forgectrl",
|
|
"title": "Control panel and status endpoints"
|
|
},
|
|
{
|
|
"always": false,
|
|
"covers": [
|
|
[
|
|
"forgectrl",
|
|
"src/setup.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/super.c"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/main.c"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/paths.h"
|
|
]
|
|
],
|
|
"fingerprint": "1f2c5c648882dd22f880d9ca630816427eecdf092f198e445def4be0652c8f8d",
|
|
"hardware": "takeover",
|
|
"id": "setup.gate-blocks-controllers",
|
|
"inherited": true,
|
|
"kind": "auto",
|
|
"record": {
|
|
"answers": [],
|
|
"campaign": "c-20260919202934-3d3a",
|
|
"duration_s": 17,
|
|
"evidence": {
|
|
"after": {
|
|
"acceptance_done": true,
|
|
"account": true,
|
|
"advisories_complete": true,
|
|
"completed": true,
|
|
"first_run": false,
|
|
"gate": "open",
|
|
"override": true,
|
|
"required": [],
|
|
"versions": {
|
|
"account": 1,
|
|
"advisories": 1,
|
|
"airflow": 1,
|
|
"cameras": 1,
|
|
"cloud": 1,
|
|
"cloud.header": 1,
|
|
"cooling.aa-offset": 1,
|
|
"cooling.flow": 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,
|
|
"preferences": 1,
|
|
"sensors": 1,
|
|
"sheet.frame": 1,
|
|
"sheet.place": 1,
|
|
"switches": 1
|
|
},
|
|
"why": ""
|
|
},
|
|
"after_mode": {
|
|
"controller": "running",
|
|
"gated": false,
|
|
"local": false,
|
|
"mode": "grbl",
|
|
"motion": "verified",
|
|
"pid": 1381,
|
|
"why": ""
|
|
},
|
|
"baseline": {
|
|
"post": [],
|
|
"pre": []
|
|
},
|
|
"batch": {
|
|
"group": "unattended",
|
|
"ts": "2026-09-19T20:29:34Z"
|
|
},
|
|
"before": {
|
|
"acceptance_done": true,
|
|
"account": true,
|
|
"advisories_complete": true,
|
|
"completed": true,
|
|
"first_run": false,
|
|
"gate": "open",
|
|
"override": true,
|
|
"required": [],
|
|
"versions": {
|
|
"account": 1,
|
|
"advisories": 1,
|
|
"airflow": 1,
|
|
"cameras": 1,
|
|
"cloud": 1,
|
|
"cloud.header": 1,
|
|
"cooling.aa-offset": 1,
|
|
"cooling.flow": 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,
|
|
"preferences": 1,
|
|
"sensors": 1,
|
|
"sheet.frame": 1,
|
|
"sheet.place": 1,
|
|
"switches": 1
|
|
},
|
|
"why": ""
|
|
},
|
|
"controller_pids_gated": [],
|
|
"fixture": {
|
|
"channels": [
|
|
"lid",
|
|
"interlock",
|
|
"button"
|
|
],
|
|
"hostname": "<REDACTED-1>",
|
|
"ip": "<IP-1>",
|
|
"released": []
|
|
},
|
|
"gated_mode": {
|
|
"controller": "gated",
|
|
"gated": true,
|
|
"local": false,
|
|
"mode": "grbl",
|
|
"motion": "unverified",
|
|
"pid": 0,
|
|
"why": "setup required: advisories, account, preferences, machine, cloud, switches, sensors, airflow, cooling.aa-offset, cooling.flow, motion, cameras, cloud.header, sheet.place, shee"
|
|
},
|
|
"gated_wiz": {
|
|
"acceptance_done": true,
|
|
"account": true,
|
|
"advisories_complete": true,
|
|
"completed": true,
|
|
"first_run": false,
|
|
"gate": "closed",
|
|
"override": false,
|
|
"required": [
|
|
"advisories",
|
|
"account",
|
|
"preferences",
|
|
"machine",
|
|
"cloud",
|
|
"switches",
|
|
"sensors",
|
|
"airflow",
|
|
"cooling.aa-offset",
|
|
"cooling.flow",
|
|
"motion",
|
|
"cameras",
|
|
"cloud.header",
|
|
"sheet.place",
|
|
"sheet.frame",
|
|
"laser.focus",
|
|
"laser.floor",
|
|
"laser.dose-curve",
|
|
"laser.corner",
|
|
"cooling.flow-load"
|
|
],
|
|
"versions": {},
|
|
"why": "setup required: advisories, account, preferences, machine, cloud, switches, sensors, airflow, cooling.aa-offset, cooling.flow, motion, cameras, cloud.header, sheet.place, shee"
|
|
},
|
|
"mode": {
|
|
"detail": "already in grbl mode",
|
|
"found": "grbl",
|
|
"needs": "grbl",
|
|
"ok": true,
|
|
"switched": false
|
|
},
|
|
"override_before": true,
|
|
"override_mode": {
|
|
"controller": "running",
|
|
"gated": false,
|
|
"local": false,
|
|
"mode": "grbl",
|
|
"motion": "verified",
|
|
"pid": 1335,
|
|
"why": ""
|
|
},
|
|
"override_wiz": {
|
|
"acceptance_done": true,
|
|
"account": true,
|
|
"advisories_complete": true,
|
|
"completed": true,
|
|
"first_run": false,
|
|
"gate": "open",
|
|
"override": true,
|
|
"required": [
|
|
"advisories",
|
|
"account",
|
|
"preferences",
|
|
"machine",
|
|
"cloud",
|
|
"switches",
|
|
"sensors",
|
|
"airflow",
|
|
"cooling.aa-offset",
|
|
"cooling.flow",
|
|
"motion",
|
|
"cameras",
|
|
"cloud.header",
|
|
"sheet.place",
|
|
"sheet.frame",
|
|
"laser.focus",
|
|
"laser.floor",
|
|
"laser.dose-curve",
|
|
"laser.corner",
|
|
"cooling.flow-load"
|
|
],
|
|
"versions": {},
|
|
"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": "1f2c5c648882dd22f880d9ca630816427eecdf092f198e445def4be0652c8f8d",
|
|
"image": "20260919202327 (dev)",
|
|
"log": [
|
|
"20:31:43 start setup.gate-blocks-controllers (auto, takeover) in campaign c-20260919202934-3d3a",
|
|
"20:31:43 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
|
|
"20:31:43 fixture: <REDACTED-1> at <IP-1> covers lid, interlock, button",
|
|
"20:31:43 queued by the unattended queue opened 2026-09-19T20:29:34Z",
|
|
"20:31:43 baseline: pre: clean",
|
|
"20:31:44 mode: test needs grbl - already in grbl mode",
|
|
"20:31:44 before: gate open, override True, required []",
|
|
"20:31:44 takeover: waiting for forgectrl to be settled",
|
|
"20:31:44 baseline: /mode controller=running motion=verified",
|
|
"20:31:44 takeover: preserving cnc/motor_lock=0, cnc/step_freq=112640, cnc/ramp_rate=500000, cnc/streaming=0, cnc/x_mode=32, cnc/y_mode=32, cnc/x_decay=1, cnc/y_decay=1, pic/x_step_current=33, pic/y_step_current=5",
|
|
"20:31:44 takeover: stopping the controller through forgectrl",
|
|
"20:31:44 takeover: POST /controller/stop -> 200",
|
|
"20:31:44 takeover: forgectrl stop -> rc 0",
|
|
"20:31:45 takeover: pulse device free",
|
|
"20:31:45 takeover: forgectrl start -> rc 0",
|
|
"20:31:47 baseline: /mode controller=gated motion=unverified",
|
|
"20:31:47 installed under a restart: setup.json=1205 B, setup-override=removed",
|
|
"20:31:47 /mode after the restart: {'mode': 'grbl', 'controller': 'gated', 'pid': 0, 'motion': 'unverified', 'gated': True, 'local': False, 'why': 'setup required: advisories, account, preferences, machine, cloud, switches, sensors, airflow, cooling.aa-offset, cooling.flow, motion, cameras, cloud.header, sheet.place, shee'} (after 0.004485607147216797 s)",
|
|
"20:31:47 gated: no controller process, the Grbl port is closed",
|
|
"20:31:53 the controller spawned under the override (6.112579822540283 s)",
|
|
"20:31:53 baseline: /mode controller=running motion=verified",
|
|
"20:31:53 override: the controller is back ({'mode': 'grbl', 'controller': 'running', 'pid': 1335, 'motion': 'verified', 'gated': False, 'local': False, 'why': ''})",
|
|
"20:31:53 takeover: waiting for forgectrl to be settled",
|
|
"20:31:53 baseline: /mode controller=running motion=verified",
|
|
"20:31:53 takeover: preserving cnc/motor_lock=0, cnc/step_freq=112640, cnc/ramp_rate=500000, cnc/streaming=0, cnc/x_mode=32, cnc/y_mode=32, cnc/x_decay=1, cnc/y_decay=1, pic/x_step_current=33, pic/y_step_current=5",
|
|
"20:31:53 takeover: stopping the controller through forgectrl",
|
|
"20:31:53 takeover: POST /controller/stop -> 200",
|
|
"20:31:53 takeover: forgectrl stop -> rc 0",
|
|
"20:31:54 takeover: pulse device free",
|
|
"20:31:54 takeover: forgectrl start -> rc 0",
|
|
"20:31:56 baseline: /mode controller=stopped motion=unverified",
|
|
"20:32:00 baseline: /mode controller=running motion=verified",
|
|
"20:32:00 restored under a restart: setup.json, setup-override",
|
|
"20:32:00 restored: gate open, controller running",
|
|
"20:32:00 baseline: post: clean",
|
|
"20:32:00 result PASS"
|
|
],
|
|
"manifest_sha": "2d41354cdfb037d942fbe328e2ae0594efadd92e976d1c4512ca461b5f864a7e",
|
|
"message": "",
|
|
"result": "PASS",
|
|
"test": "setup.gate-blocks-controllers",
|
|
"ts": "2026-09-19T20:32:00Z"
|
|
},
|
|
"requires": [
|
|
"forgectrl.auth"
|
|
],
|
|
"satisfied": true,
|
|
"source_sha": "0a390d20bb42b256bf8e33f54a2d01e58bdb5acfa0b7107aa9f2bde4a509cbc7",
|
|
"subsystem": "setup",
|
|
"title": "The setup gate spawns no controller"
|
|
},
|
|
{
|
|
"always": false,
|
|
"covers": [
|
|
[
|
|
"forgectrl",
|
|
"src/setup.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/super.c"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/main.c"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/paths.h"
|
|
]
|
|
],
|
|
"fingerprint": "5b457f10351f030219e3257564cde48bedcba6689e095682c967573da341e814",
|
|
"hardware": "api",
|
|
"id": "setup.override-until-reboot",
|
|
"inherited": true,
|
|
"kind": "auto",
|
|
"record": {
|
|
"answers": [],
|
|
"campaign": "c-20260919202934-3d3a",
|
|
"duration_s": 0,
|
|
"evidence": {
|
|
"baseline": {
|
|
"post": [],
|
|
"pre": []
|
|
},
|
|
"batch": {
|
|
"group": "unattended",
|
|
"ts": "2026-09-19T20:29:34Z"
|
|
},
|
|
"fixture": {
|
|
"channels": [
|
|
"lid",
|
|
"interlock",
|
|
"button"
|
|
],
|
|
"hostname": "<REDACTED-1>",
|
|
"ip": "<IP-1>",
|
|
"released": []
|
|
},
|
|
"mode": {
|
|
"controller": "running",
|
|
"gated": false,
|
|
"local": false,
|
|
"mode": "grbl",
|
|
"motion": "verified",
|
|
"pid": 1381,
|
|
"why": ""
|
|
},
|
|
"mount": {
|
|
"fstype": "tmpfs",
|
|
"point": "/run"
|
|
},
|
|
"wiz": {
|
|
"acceptance_done": true,
|
|
"account": true,
|
|
"advisories_complete": true,
|
|
"completed": true,
|
|
"first_run": false,
|
|
"gate": "open",
|
|
"override": true,
|
|
"required": [],
|
|
"versions": {
|
|
"account": 1,
|
|
"advisories": 1,
|
|
"airflow": 1,
|
|
"cameras": 1,
|
|
"cloud": 1,
|
|
"cloud.header": 1,
|
|
"cooling.aa-offset": 1,
|
|
"cooling.flow": 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,
|
|
"preferences": 1,
|
|
"sensors": 1,
|
|
"sheet.frame": 1,
|
|
"sheet.place": 1,
|
|
"switches": 1
|
|
},
|
|
"why": ""
|
|
}
|
|
},
|
|
"fingerprint": "5b457f10351f030219e3257564cde48bedcba6689e095682c967573da341e814",
|
|
"image": "20260919202327 (dev)",
|
|
"log": [
|
|
"20:32:00 start setup.override-until-reboot (auto, api) in campaign c-20260919202934-3d3a",
|
|
"20:32:01 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
|
|
"20:32:01 fixture: <REDACTED-1> at <IP-1> covers lid, interlock, button",
|
|
"20:32:01 queued by the unattended queue opened 2026-09-19T20:29:34Z",
|
|
"20:32:01 baseline: pre: clean",
|
|
"20:32:01 /run/forgefirm/setup-override is on /run (tmpfs)",
|
|
"20:32:01 GET /wiz: {'first_run': False, 'gate': 'open', 'override': True, 'why': '', 'required': [], '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.aa-offset': 1, 'cooling.flow': 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, 'preferences': 1, 'sensors': 1, 'sheet.frame': 1, 'sheet.place': 1, 'switches': 1}}",
|
|
"20:32:01 every required wizard is complete; the override lifts nothing today",
|
|
"20:32:01 baseline: post: clean",
|
|
"20:32:01 result PASS"
|
|
],
|
|
"manifest_sha": "2d41354cdfb037d942fbe328e2ae0594efadd92e976d1c4512ca461b5f864a7e",
|
|
"message": "",
|
|
"result": "PASS",
|
|
"test": "setup.override-until-reboot",
|
|
"ts": "2026-09-19T20:32:01Z"
|
|
},
|
|
"requires": [
|
|
"forgectrl.auth"
|
|
],
|
|
"satisfied": true,
|
|
"source_sha": "6e288e0d5a1d218912ce5d4ec2784240cdf1e943c93c076b0558f07f7d3e1806",
|
|
"subsystem": "setup",
|
|
"title": "The override stands until the next reboot"
|
|
},
|
|
{
|
|
"always": false,
|
|
"covers": [
|
|
[
|
|
"forgectrl",
|
|
"src/advisories.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/setup.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/wiz.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/sha256.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/main.c"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/ui/md.js"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/ui/embed_docs.cmake"
|
|
]
|
|
],
|
|
"fingerprint": "d9f7ea6adeb7db553dcaa43f3f4753e02628799af97aabc7ef2ce17975552bd1",
|
|
"hardware": "takeover",
|
|
"id": "setup.advisories-rehash",
|
|
"inherited": true,
|
|
"kind": "auto",
|
|
"record": {
|
|
"answers": [],
|
|
"campaign": "c-20260919202934-3d3a",
|
|
"duration_s": 8,
|
|
"evidence": {
|
|
"accept": 200,
|
|
"after_accept": {
|
|
"acceptance_done": false,
|
|
"account": true,
|
|
"advisories_complete": true,
|
|
"completed": true,
|
|
"first_run": false,
|
|
"gate": "closed",
|
|
"override": true,
|
|
"required": [],
|
|
"versions": {
|
|
"account": 1,
|
|
"advisories": 1,
|
|
"airflow": 1,
|
|
"cameras": 1,
|
|
"cloud": 1,
|
|
"cloud.header": 1,
|
|
"cooling.aa-offset": 1,
|
|
"cooling.flow": 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,
|
|
"preferences": 1,
|
|
"sensors": 1,
|
|
"sheet.frame": 1,
|
|
"sheet.place": 1,
|
|
"switches": 1
|
|
},
|
|
"why": "the advisories are not accepted"
|
|
},
|
|
"after_restore": {
|
|
"acceptance_done": true,
|
|
"account": true,
|
|
"advisories_complete": true,
|
|
"completed": true,
|
|
"first_run": false,
|
|
"gate": "open",
|
|
"override": true,
|
|
"required": [],
|
|
"versions": {
|
|
"account": 1,
|
|
"advisories": 1,
|
|
"airflow": 1,
|
|
"cameras": 1,
|
|
"cloud": 1,
|
|
"cloud.header": 1,
|
|
"cooling.aa-offset": 1,
|
|
"cooling.flow": 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,
|
|
"preferences": 1,
|
|
"sensors": 1,
|
|
"sheet.frame": 1,
|
|
"sheet.place": 1,
|
|
"switches": 1
|
|
},
|
|
"why": ""
|
|
},
|
|
"baseline": {
|
|
"post": [],
|
|
"pre": []
|
|
},
|
|
"batch": {
|
|
"group": "unattended",
|
|
"ts": "2026-09-19T20:29:34Z"
|
|
},
|
|
"before": {
|
|
"acceptance_done": true,
|
|
"account": true,
|
|
"advisories_complete": true,
|
|
"completed": true,
|
|
"first_run": false,
|
|
"gate": "open",
|
|
"override": true,
|
|
"required": [],
|
|
"versions": {
|
|
"account": 1,
|
|
"advisories": 1,
|
|
"airflow": 1,
|
|
"cameras": 1,
|
|
"cloud": 1,
|
|
"cloud.header": 1,
|
|
"cooling.aa-offset": 1,
|
|
"cooling.flow": 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,
|
|
"preferences": 1,
|
|
"sensors": 1,
|
|
"sheet.frame": 1,
|
|
"sheet.place": 1,
|
|
"switches": 1
|
|
},
|
|
"why": ""
|
|
},
|
|
"content_type": "text/markdown; charset=utf-8",
|
|
"etag": "<HEX-1>",
|
|
"fixture": {
|
|
"channels": [
|
|
"lid",
|
|
"interlock",
|
|
"button"
|
|
],
|
|
"hostname": "<REDACTED-1>",
|
|
"ip": "<IP-1>",
|
|
"released": []
|
|
},
|
|
"no_phrase": 400,
|
|
"stale_hash": 409,
|
|
"unknown_doc": 400
|
|
},
|
|
"fingerprint": "d9f7ea6adeb7db553dcaa43f3f4753e02628799af97aabc7ef2ce17975552bd1",
|
|
"image": "20260919202327 (dev)",
|
|
"log": [
|
|
"20:32:01 start setup.advisories-rehash (auto, takeover) in campaign c-20260919202934-3d3a",
|
|
"20:32:01 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
|
|
"20:32:01 fixture: <REDACTED-1> at <IP-1> covers lid, interlock, button",
|
|
"20:32:01 queued by the unattended queue opened 2026-09-19T20:29:34Z",
|
|
"20:32:01 baseline: pre: clean",
|
|
"20:32:02 GET /advisories/safety-and-risk -> 200, 6868 bytes, ETag <HEX-1>",
|
|
"20:32:02 accept with a stale hash -> 409 {'error': 'the document changed; read it again'}",
|
|
"20:32:02 accept at the current hash with the phrase -> 200",
|
|
"20:32:02 acceptance_done cleared, gate closed: the advisories are not accepted",
|
|
"20:32:02 takeover: waiting for forgectrl to be settled",
|
|
"20:32:02 baseline: /mode controller=running motion=verified",
|
|
"20:32:02 takeover: preserving cnc/motor_lock=0, cnc/step_freq=112640, cnc/ramp_rate=500000, cnc/streaming=0, cnc/x_mode=32, cnc/y_mode=32, cnc/x_decay=1, cnc/y_decay=1, pic/x_step_current=33, pic/y_step_current=5",
|
|
"20:32:02 takeover: stopping the controller through forgectrl",
|
|
"20:32:02 takeover: POST /controller/stop -> 200",
|
|
"20:32:02 takeover: forgectrl stop -> rc 0",
|
|
"20:32:03 takeover: pulse device free",
|
|
"20:32:03 takeover: forgectrl start -> rc 0",
|
|
"20:32:05 baseline: /mode controller=stopped motion=unverified",
|
|
"20:32:10 baseline: /mode controller=running motion=verified",
|
|
"20:32:10 the previous record is back under a restart",
|
|
"20:32:10 baseline: post: clean",
|
|
"20:32:10 result PASS"
|
|
],
|
|
"manifest_sha": "2d41354cdfb037d942fbe328e2ae0594efadd92e976d1c4512ca461b5f864a7e",
|
|
"message": "",
|
|
"result": "PASS",
|
|
"test": "setup.advisories-rehash",
|
|
"ts": "2026-09-19T20:32:10Z"
|
|
},
|
|
"requires": [
|
|
"forgectrl.auth"
|
|
],
|
|
"satisfied": true,
|
|
"source_sha": "1f2c6f0e213bf05e674a1d208ad956b0e661ec0d1b65d8e71a0c4f5806c78afd",
|
|
"subsystem": "setup",
|
|
"title": "An advisory is accepted at its current hash only"
|
|
},
|
|
{
|
|
"always": false,
|
|
"covers": [
|
|
[
|
|
"forgectrl",
|
|
"src/auth.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/session.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/users.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/tls.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/peer.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/main.c"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/ui/login.*"
|
|
]
|
|
],
|
|
"fingerprint": "783d47f6f1e838b9bfa72ba7d6cd685cda032f6b90c0ae2a65d6dde37f25eb06",
|
|
"hardware": "takeover",
|
|
"id": "setup.account-login",
|
|
"inherited": true,
|
|
"kind": "auto",
|
|
"record": {
|
|
"answers": [],
|
|
"campaign": "c-20260919202934-3d3a",
|
|
"duration_s": 49,
|
|
"evidence": {
|
|
"account_before": "scott",
|
|
"baseline": {
|
|
"post": [],
|
|
"pre": []
|
|
},
|
|
"batch": {
|
|
"group": "unattended",
|
|
"ts": "2026-09-19T20:29:34Z"
|
|
},
|
|
"cookie_flags": [
|
|
"httponly",
|
|
"max-age",
|
|
"path",
|
|
"samesite",
|
|
"secure"
|
|
],
|
|
"fixture": {
|
|
"channels": [
|
|
"lid",
|
|
"interlock",
|
|
"button"
|
|
],
|
|
"hostname": "<REDACTED-1>",
|
|
"ip": "<IP-1>",
|
|
"released": []
|
|
},
|
|
"login": 200,
|
|
"logout": 200,
|
|
"right_inside_lock": 429,
|
|
"tls_fingerprint": "<MAC-1>:<MAC-2>:<MAC-3>:<MAC-4>:<MAC-5>:1C:2D",
|
|
"users_reload_rc": 0,
|
|
"wait": 30,
|
|
"wrong_codes": [
|
|
401,
|
|
401,
|
|
401,
|
|
401,
|
|
401,
|
|
429
|
|
],
|
|
"wrong_name": 401
|
|
},
|
|
"fingerprint": "783d47f6f1e838b9bfa72ba7d6cd685cda032f6b90c0ae2a65d6dde37f25eb06",
|
|
"image": "20260919202327 (dev)",
|
|
"log": [
|
|
"20:32:10 start setup.account-login (auto, takeover) in campaign c-20260919202934-3d3a",
|
|
"20:32:10 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
|
|
"20:32:10 fixture: <REDACTED-1> at <IP-1> covers lid, interlock, button",
|
|
"20:32:10 queued by the unattended queue opened 2026-09-19T20:29:34Z",
|
|
"20:32:10 baseline: pre: clean",
|
|
"20:32:10 takeover: waiting for forgectrl to be settled",
|
|
"20:32:10 baseline: /mode controller=running motion=verified",
|
|
"20:32:10 takeover: preserving cnc/motor_lock=0, cnc/step_freq=112640, cnc/ramp_rate=500000, cnc/streaming=0, cnc/x_mode=32, cnc/y_mode=32, cnc/x_decay=1, cnc/y_decay=1, pic/x_step_current=33, pic/y_step_current=5",
|
|
"20:32:10 takeover: stopping the controller through forgectrl",
|
|
"20:32:11 takeover: POST /controller/stop -> 200",
|
|
"20:32:11 takeover: forgectrl stop -> rc 0",
|
|
"20:32:12 takeover: pulse device free",
|
|
"20:32:12 takeover: forgectrl start -> rc 0",
|
|
"20:32:14 baseline: /mode controller=stopped motion=unverified",
|
|
"20:32:19 baseline: /mode controller=running motion=verified",
|
|
"20:32:19 installed under a restart: users=removed",
|
|
"20:32:20 POST /wiz/account (temporary 'forgetest') -> 200 {'ok': True, 'name': 'forgetest'}",
|
|
"20:32:20 GET https://127.0.0.1/wiz -> 200",
|
|
"20:32:20 wrong password attempts -> [401, 401, 401, 401, 401, 429]",
|
|
"20:32:20 locked for 30 s; the right password is refused inside the lock",
|
|
"20:32:42 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
|
|
"20:32:51 POST /login (right) -> 200, cookie flags ['httponly', 'max-age', 'path', 'samesite', 'secure']",
|
|
"20:32:52 session set by the login, seen by GET /wiz, ended by the logout",
|
|
"20:32:52 takeover: waiting for forgectrl to be settled",
|
|
"20:32:52 baseline: /mode controller=running motion=verified",
|
|
"20:32:52 takeover: preserving cnc/motor_lock=0, cnc/step_freq=112640, cnc/ramp_rate=500000, cnc/streaming=0, cnc/x_mode=32, cnc/y_mode=32, cnc/x_decay=1, cnc/y_decay=1, pic/x_step_current=33, pic/y_step_current=5",
|
|
"20:32:52 takeover: stopping the controller through forgectrl",
|
|
"20:32:52 takeover: POST /controller/stop -> 200",
|
|
"20:32:52 takeover: forgectrl stop -> rc 0",
|
|
"20:32:52 takeover: pulse device free",
|
|
"20:32:53 takeover: forgectrl start -> rc 0",
|
|
"20:32:55 baseline: /mode controller=stopped motion=unverified",
|
|
"20:33:00 baseline: /mode controller=running motion=verified",
|
|
"20:33:00 restored under a restart: users",
|
|
"20:33:00 forgefirm-users reload -> rc 0 forgefirm-users: account scott created\nforgefirm-users: removing account forgetest (not in the record)",
|
|
"20:33:00 baseline: post: clean",
|
|
"20:33:00 result PASS"
|
|
],
|
|
"manifest_sha": "2d41354cdfb037d942fbe328e2ae0594efadd92e976d1c4512ca461b5f864a7e",
|
|
"message": "",
|
|
"result": "PASS",
|
|
"test": "setup.account-login",
|
|
"ts": "2026-09-19T20:33:00Z"
|
|
},
|
|
"requires": [
|
|
"forgectrl.auth"
|
|
],
|
|
"satisfied": true,
|
|
"source_sha": "067378ef517a59fee61531b1f86bfcab8edfff0c6ac88044bb742cd1c2eba106",
|
|
"subsystem": "setup",
|
|
"title": "The panel login over HTTPS"
|
|
},
|
|
{
|
|
"always": false,
|
|
"covers": [
|
|
[
|
|
"forgectrl",
|
|
"src/auth.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/tls.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/peer.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/main.c"
|
|
]
|
|
],
|
|
"fingerprint": "56301f722d671716d50c953995285a2d8e1bbae25071571dd62cfcd625c58738",
|
|
"hardware": "api",
|
|
"id": "setup.https-only-writes",
|
|
"inherited": true,
|
|
"kind": "auto",
|
|
"record": {
|
|
"answers": [],
|
|
"campaign": "c-20260919202934-3d3a",
|
|
"duration_s": 0,
|
|
"evidence": {
|
|
"account": true,
|
|
"baseline": {
|
|
"post": [],
|
|
"pre": []
|
|
},
|
|
"batch": {
|
|
"group": "unattended",
|
|
"ts": "2026-09-19T20:29:34Z"
|
|
},
|
|
"dev_image": true,
|
|
"fixture": {
|
|
"channels": [
|
|
"lid",
|
|
"interlock",
|
|
"button"
|
|
],
|
|
"hostname": "<REDACTED-1>",
|
|
"ip": "<IP-1>",
|
|
"released": []
|
|
},
|
|
"lan_http GET /logs": {
|
|
"location": "https://<IP-2>/logs",
|
|
"status": 302
|
|
},
|
|
"lan_http GET /system/ssh": {
|
|
"location": "https://<IP-2>/system/ssh",
|
|
"status": 302
|
|
},
|
|
"lan_http POST /settings": {
|
|
"location": "https://<IP-2>/settings",
|
|
"status": 302
|
|
},
|
|
"lan_http_read": 200,
|
|
"lan_https_read": 200,
|
|
"lan_https_write": 200,
|
|
"lan_ip": "<IP-2>",
|
|
"loopback_http_write": 200
|
|
},
|
|
"fingerprint": "56301f722d671716d50c953995285a2d8e1bbae25071571dd62cfcd625c58738",
|
|
"image": "20260919202327 (dev)",
|
|
"log": [
|
|
"20:33:00 start setup.https-only-writes (auto, api) in campaign c-20260919202934-3d3a",
|
|
"20:33:00 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
|
|
"20:33:00 fixture: <REDACTED-1> at <IP-1> covers lid, interlock, button",
|
|
"20:33:00 queued by the unattended queue opened 2026-09-19T20:29:34Z",
|
|
"20:33:00 baseline: pre: clean",
|
|
"20:33:00 GET https://<IP-2>/status -> 200",
|
|
"20:33:00 GET http://<IP-2>/status -> 200",
|
|
"20:33:00 POST http://<IP-2>/settings (token) -> 302 Location https://<IP-2>/settings",
|
|
"20:33:00 GET http://<IP-2>/system/ssh (token) -> 302 Location https://<IP-2>/system/ssh",
|
|
"20:33:00 GET http://<IP-2>/logs (token) -> 302 Location https://<IP-2>/logs",
|
|
"20:33:01 POST https://<IP-2>/settings (token, no session) -> 200 (dev image True, account True)",
|
|
"20:33:01 baseline: post: clean",
|
|
"20:33:01 result PASS"
|
|
],
|
|
"manifest_sha": "2d41354cdfb037d942fbe328e2ae0594efadd92e976d1c4512ca461b5f864a7e",
|
|
"message": "",
|
|
"result": "PASS",
|
|
"test": "setup.https-only-writes",
|
|
"ts": "2026-09-19T20:33:01Z"
|
|
},
|
|
"requires": [
|
|
"forgectrl.auth"
|
|
],
|
|
"satisfied": true,
|
|
"source_sha": "a6c433030e0207c2595d133c86b26ed581fc5c887c910c805151f0170dd5761a",
|
|
"subsystem": "setup",
|
|
"title": "Writes from the LAN go to HTTPS"
|
|
},
|
|
{
|
|
"always": false,
|
|
"covers": [
|
|
[
|
|
"forgectrl",
|
|
"src/main.c"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/paths.h"
|
|
]
|
|
],
|
|
"fingerprint": "e93573c1d52a6d919a9811dd77cf78b4472cfb0b2e3d9c25aff2209ade2e7750",
|
|
"hardware": "api",
|
|
"id": "setup.ssh-until-reboot",
|
|
"inherited": true,
|
|
"kind": "auto",
|
|
"record": {
|
|
"answers": [],
|
|
"campaign": "c-20260919202934-3d3a",
|
|
"duration_s": 1,
|
|
"evidence": {
|
|
"after": {
|
|
"dev_image": true,
|
|
"enabled": false,
|
|
"running": true
|
|
},
|
|
"baseline": {
|
|
"post": [],
|
|
"pre": []
|
|
},
|
|
"batch": {
|
|
"group": "unattended",
|
|
"ts": "2026-09-19T20:29:34Z"
|
|
},
|
|
"before": {
|
|
"dev_image": true,
|
|
"enabled": false,
|
|
"running": true
|
|
},
|
|
"enable": {
|
|
"dev_image": true,
|
|
"enabled": true,
|
|
"running": true
|
|
},
|
|
"final": {
|
|
"dev_image": true,
|
|
"enabled": false,
|
|
"running": true
|
|
},
|
|
"fixture": {
|
|
"channels": [
|
|
"lid",
|
|
"interlock",
|
|
"button"
|
|
],
|
|
"hostname": "<REDACTED-1>",
|
|
"ip": "<IP-1>",
|
|
"released": []
|
|
},
|
|
"sshd_policy": {
|
|
"banner": "none",
|
|
"passwordauthentication": "yes",
|
|
"permitemptypasswords": "yes",
|
|
"permitrootlogin": "yes"
|
|
}
|
|
},
|
|
"fingerprint": "e93573c1d52a6d919a9811dd77cf78b4472cfb0b2e3d9c25aff2209ade2e7750",
|
|
"image": "20260919202327 (dev)",
|
|
"log": [
|
|
"20:33:01 start setup.ssh-until-reboot (auto, api) in campaign c-20260919202934-3d3a",
|
|
"20:33:01 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
|
|
"20:33:01 fixture: <REDACTED-1> at <IP-1> covers lid, interlock, button",
|
|
"20:33:01 queued by the unattended queue opened 2026-09-19T20:29:34Z",
|
|
"20:33:01 baseline: pre: clean",
|
|
"20:33:01 GET /system/ssh -> 200 {'enabled': False, 'running': True, 'dev_image': True}",
|
|
"20:33:02 POST /system/ssh enable=1 -> 200 {'enabled': True, 'running': True, 'dev_image': True}",
|
|
"20:33:02 sshd listens on 22 (0.0 s)",
|
|
"20:33:02 sshd -T: {'permitrootlogin': 'yes', 'passwordauthentication': 'yes', 'permitemptypasswords': 'yes', 'banner': 'none'}",
|
|
"20:33:02 dev image: flag removed by hand; GET /system/ssh -> 200 {'enabled': False, 'running': True, 'dev_image': True}",
|
|
"20:33:02 baseline: post: clean",
|
|
"20:33:02 result PASS"
|
|
],
|
|
"manifest_sha": "2d41354cdfb037d942fbe328e2ae0594efadd92e976d1c4512ca461b5f864a7e",
|
|
"message": "",
|
|
"result": "PASS",
|
|
"test": "setup.ssh-until-reboot",
|
|
"ts": "2026-09-19T20:33:02Z"
|
|
},
|
|
"requires": [
|
|
"forgectrl.auth"
|
|
],
|
|
"satisfied": true,
|
|
"source_sha": "6f5029a29985d7599993920cbca74b14389c949f236d237719fbb9464a84d96c",
|
|
"subsystem": "setup",
|
|
"title": "SSH is switched from the panel until the next reboot"
|
|
},
|
|
{
|
|
"always": false,
|
|
"covers": [
|
|
[
|
|
"forgectrl",
|
|
"src/main.c"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/super.c"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/settings.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/wiz.c"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/hooks.h"
|
|
]
|
|
],
|
|
"fingerprint": "c8f3d5f00dbf71a50ac5b5a07fe5cd50af94d21659ae8ebc246e4ba02628f903",
|
|
"hardware": "api",
|
|
"id": "setup.cloud-disabled-surface",
|
|
"inherited": true,
|
|
"kind": "auto",
|
|
"record": {
|
|
"answers": [],
|
|
"campaign": "c-20260919202934-3d3a",
|
|
"duration_s": 0,
|
|
"evidence": {
|
|
"baseline": {
|
|
"post": [],
|
|
"pre": []
|
|
},
|
|
"batch": {
|
|
"group": "unattended",
|
|
"ts": "2026-09-19T20:29:34Z"
|
|
},
|
|
"fixture": {
|
|
"channels": [
|
|
"lid",
|
|
"interlock",
|
|
"button"
|
|
],
|
|
"hostname": "<REDACTED-1>",
|
|
"ip": "<IP-1>",
|
|
"released": []
|
|
},
|
|
"found": {
|
|
"cloud_enabled": "1",
|
|
"controller_mode": "grbl",
|
|
"homing_mode": "gfcloud"
|
|
},
|
|
"mode": {
|
|
"detail": "already in grbl mode",
|
|
"found": "grbl",
|
|
"needs": "grbl",
|
|
"ok": true,
|
|
"switched": false
|
|
},
|
|
"mode_cloud": {
|
|
"body": "cloud mode is not enabled on this machine",
|
|
"status": 409
|
|
},
|
|
"settings cloud_enabled=1 no phrase": 400,
|
|
"settings controller_mode=cloud": 409,
|
|
"settings homing_mode=gfcloud": 409
|
|
},
|
|
"fingerprint": "c8f3d5f00dbf71a50ac5b5a07fe5cd50af94d21659ae8ebc246e4ba02628f903",
|
|
"image": "20260919202327 (dev)",
|
|
"log": [
|
|
"20:33:02 start setup.cloud-disabled-surface (auto, api) in campaign c-20260919202934-3d3a",
|
|
"20:33:02 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
|
|
"20:33:02 fixture: <REDACTED-1> at <IP-1> covers lid, interlock, button",
|
|
"20:33:02 queued by the unattended queue opened 2026-09-19T20:29:34Z",
|
|
"20:33:03 baseline: pre: clean",
|
|
"20:33:03 mode: test needs grbl - already in grbl mode",
|
|
"20:33:03 cloud mode turned off for the test (found {'cloud_enabled': '1', 'homing_mode': 'gfcloud', 'controller_mode': 'grbl'})",
|
|
"20:33:03 POST /settings controller_mode=cloud -> 409 cloud mode is not enabled on this machine",
|
|
"20:33:03 POST /settings homing_mode=gfcloud -> 409 cloud homing needs cloud mode enabled",
|
|
"20:33:03 POST /settings cloud_enabled=1 (no phrase) -> 400 type I UNDERSTAND to turn cloud mode on",
|
|
"20:33:03 POST /mode controller=cloud -> 409 cloud mode is not enabled on this machine",
|
|
"20:33:03 restore cloud_enabled='1' -> 200",
|
|
"20:33:03 restore homing_mode='gfcloud' -> 200",
|
|
"20:33:03 baseline: post: clean",
|
|
"20:33:03 result PASS"
|
|
],
|
|
"manifest_sha": "2d41354cdfb037d942fbe328e2ae0594efadd92e976d1c4512ca461b5f864a7e",
|
|
"message": "",
|
|
"result": "PASS",
|
|
"test": "setup.cloud-disabled-surface",
|
|
"ts": "2026-09-19T20:33:03Z"
|
|
},
|
|
"requires": [
|
|
"forgectrl.settings-bounds"
|
|
],
|
|
"satisfied": true,
|
|
"source_sha": "c9ac065d825683d441ee71255235b3a37442f14b9a1c258f00476344487a9c14",
|
|
"subsystem": "setup",
|
|
"title": "Nothing points at the cloud while it is off"
|
|
},
|
|
{
|
|
"always": false,
|
|
"covers": [
|
|
[
|
|
"forgectrl",
|
|
"src/update.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/main.c"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/ui/wizard.js"
|
|
]
|
|
],
|
|
"fingerprint": "ac27ab35c4b29cff0a4b8139c1cbdd3f52f36648430908468c793caf9fbcea3a",
|
|
"hardware": "api",
|
|
"id": "setup.factory-return",
|
|
"inherited": true,
|
|
"kind": "auto",
|
|
"record": {
|
|
"answers": [],
|
|
"campaign": "c-20260919202934-3d3a",
|
|
"duration_s": 0,
|
|
"evidence": {
|
|
"archives": [],
|
|
"baseline": {
|
|
"post": [],
|
|
"pre": []
|
|
},
|
|
"batch": {
|
|
"group": "unattended",
|
|
"ts": "2026-09-19T20:29:34Z"
|
|
},
|
|
"fixture": {
|
|
"channels": [
|
|
"lid",
|
|
"interlock",
|
|
"button"
|
|
],
|
|
"hostname": "<REDACTED-1>",
|
|
"ip": "<IP-1>",
|
|
"released": []
|
|
},
|
|
"no_confirm": {
|
|
"body": {
|
|
"error": "confirm=1 required"
|
|
},
|
|
"status": 400
|
|
},
|
|
"setup_page": {
|
|
"bytes": 412942,
|
|
"status": 200
|
|
}
|
|
},
|
|
"fingerprint": "ac27ab35c4b29cff0a4b8139c1cbdd3f52f36648430908468c793caf9fbcea3a",
|
|
"image": "20260919202327 (dev)",
|
|
"log": [
|
|
"20:33:05 start setup.factory-return (auto, api) in campaign c-20260919202934-3d3a",
|
|
"20:33:05 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
|
|
"20:33:05 fixture: <REDACTED-1> at <IP-1> covers lid, interlock, button",
|
|
"20:33:05 queued by the unattended queue opened 2026-09-19T20:29:34Z",
|
|
"20:33:05 baseline: pre: clean",
|
|
"20:33:06 POST /restore/factory-return (no confirm) -> 400 {'error': 'confirm=1 required'}",
|
|
"20:33:06 GET /slots archives: []",
|
|
"20:33:06 no archived factory image on this machine: the return would be refused (409) and the factory recovery mode is the way back",
|
|
"20:33:06 PASS: the return is refused without confirm=1; the page confirms before it calls",
|
|
"20:33:06 baseline: post: clean",
|
|
"20:33:06 result PASS"
|
|
],
|
|
"manifest_sha": "2d41354cdfb037d942fbe328e2ae0594efadd92e976d1c4512ca461b5f864a7e",
|
|
"message": "",
|
|
"result": "PASS",
|
|
"test": "setup.factory-return",
|
|
"ts": "2026-09-19T20:33:06Z"
|
|
},
|
|
"requires": [
|
|
"update.slots-and-signature"
|
|
],
|
|
"satisfied": true,
|
|
"source_sha": "81e3d959ab2f1d2c06aaf06365cb627380a09c36941cc1994c40d85f0eac49f8",
|
|
"subsystem": "setup",
|
|
"title": "The return to the factory firmware is guarded"
|
|
},
|
|
{
|
|
"always": false,
|
|
"covers": [],
|
|
"fingerprint": "f8205196a8138928fcd7a2f16bc9a447690f759a5604ee80ce91ee6722ba3958",
|
|
"hardware": "api",
|
|
"id": "setup.machine-name",
|
|
"inherited": true,
|
|
"kind": "auto",
|
|
"record": {
|
|
"answers": [],
|
|
"campaign": "c-20260919202934-3d3a",
|
|
"duration_s": 0,
|
|
"evidence": {
|
|
"avahi_pids": [],
|
|
"banner_urls": [
|
|
"<IP-1>"
|
|
],
|
|
"baseline": {
|
|
"post": [],
|
|
"pre": []
|
|
},
|
|
"batch": {
|
|
"group": "unattended",
|
|
"ts": "2026-09-19T20:29:34Z"
|
|
},
|
|
"fixture": {
|
|
"channels": [
|
|
"lid",
|
|
"interlock",
|
|
"button"
|
|
],
|
|
"hostname": "<REDACTED-1>",
|
|
"ip": "<IP-2>",
|
|
"released": []
|
|
},
|
|
"hostname": "<REDACTED-2>",
|
|
"hostname_file": "<REDACTED-2>",
|
|
"issue": "\n \u001b[1;31m \u273a\u2508\u2508\u2508\u2508\u2508\u2508\n \u001b[1;39mOpen\u001b[0mGlow\n ___ \u001b[1;39m___ ___ ___ __ __\u001b[0m\n | __|__ _ _ __ _ ___\u001b[1;39m| __|_ _| _ \\\\ \\\\/ |\u001b[0m\n | _/ _ \\\\ '_/ _` / -_) \u001b[1;39m_| | || / |\\\\/| |\u001b[0m\n |_|\\\\___/_| \\\\__, \\\\___|\u001b[1;39m_| |___|_|_\\\\_| |_|\u001b[0m\n |___/ 20260919202327 (dev)\n\nControl panel:\n https://<IP-1>/\n\n",
|
|
"lan_ip": "<IP-1>",
|
|
"mac_suffix": "<REDACTED-3>",
|
|
"udhcpc": [
|
|
"udhcpc -R -b -p /var/run/udhcpc.wlan0.pid -i wlan0 -x hostname:<REDACTED-2>"
|
|
]
|
|
},
|
|
"fingerprint": "f8205196a8138928fcd7a2f16bc9a447690f759a5604ee80ce91ee6722ba3958",
|
|
"image": "20260919202327 (dev)",
|
|
"log": [
|
|
"20:33:06 start setup.machine-name (auto, api) in campaign c-20260919202934-3d3a",
|
|
"20:33:06 fixture up: <REDACTED-1> at <IP-2>, v1.0.0, covers lid, interlock, button",
|
|
"20:33:06 fixture: <REDACTED-1> at <IP-2> covers lid, interlock, button",
|
|
"20:33:06 queued by the unattended queue opened 2026-09-19T20:29:34Z",
|
|
"20:33:06 baseline: pre: clean",
|
|
"20:33:06 hostname '<REDACTED-2>' (MAC suffix <REDACTED-3>)",
|
|
"20:33:07 baseline: post: clean",
|
|
"20:33:07 result PASS"
|
|
],
|
|
"manifest_sha": "2d41354cdfb037d942fbe328e2ae0594efadd92e976d1c4512ca461b5f864a7e",
|
|
"message": "",
|
|
"result": "PASS",
|
|
"test": "setup.machine-name",
|
|
"ts": "2026-09-19T20:33:07Z"
|
|
},
|
|
"requires": [
|
|
"forgectrl.auth"
|
|
],
|
|
"satisfied": true,
|
|
"source_sha": "359f2df924fee93c3ef5273be2493fc2542cf10834b57e2e0ef068952a594600",
|
|
"subsystem": "setup",
|
|
"title": "The machine names itself from its MAC address"
|
|
},
|
|
{
|
|
"always": false,
|
|
"covers": [
|
|
[
|
|
"forgectrl",
|
|
"src/wiz.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/setup.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/users.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/session.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/button.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/led.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/sheetid.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/advisories.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/hooks.h"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/main.c"
|
|
]
|
|
],
|
|
"fingerprint": "1c695919214a1e39f19fe5bd0f7c48818ae74f6d8e7fd75e1ed903a8f063b33c",
|
|
"hardware": "takeover",
|
|
"id": "setup.first-run-flow",
|
|
"inherited": true,
|
|
"kind": "operator",
|
|
"record": {
|
|
"answers": [],
|
|
"campaign": "c-20260919202934-3d3a",
|
|
"duration_s": 21,
|
|
"evidence": {
|
|
"account": {
|
|
"cookie": true,
|
|
"status": 200
|
|
},
|
|
"account_before": "scott",
|
|
"actions": [
|
|
{
|
|
"by": "fixture",
|
|
"channel": "button",
|
|
"state": "press",
|
|
"took_s": 0.3,
|
|
"ts": "2026-09-19T20:33:11Z"
|
|
}
|
|
],
|
|
"after": {
|
|
"acceptance_done": true,
|
|
"account": true,
|
|
"advisories_complete": true,
|
|
"completed": true,
|
|
"first_run": false,
|
|
"gate": "open",
|
|
"override": true,
|
|
"required": [],
|
|
"versions": {
|
|
"account": 1,
|
|
"advisories": 1,
|
|
"airflow": 1,
|
|
"cameras": 1,
|
|
"cloud": 1,
|
|
"cloud.header": 1,
|
|
"cooling.aa-offset": 1,
|
|
"cooling.flow": 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,
|
|
"preferences": 1,
|
|
"sensors": 1,
|
|
"sheet.frame": 1,
|
|
"sheet.place": 1,
|
|
"switches": 1
|
|
},
|
|
"why": ""
|
|
},
|
|
"baseline": {
|
|
"post": [],
|
|
"pre": []
|
|
},
|
|
"batch": {
|
|
"group": "unattended",
|
|
"ts": "2026-09-19T20:29:34Z"
|
|
},
|
|
"before": {
|
|
"acceptance_done": true,
|
|
"account": true,
|
|
"advisories_complete": true,
|
|
"completed": true,
|
|
"first_run": false,
|
|
"gate": "open",
|
|
"override": true,
|
|
"required": [],
|
|
"versions": {
|
|
"account": 1,
|
|
"advisories": 1,
|
|
"airflow": 1,
|
|
"cameras": 1,
|
|
"cloud": 1,
|
|
"cloud.header": 1,
|
|
"cooling.aa-offset": 1,
|
|
"cooling.flow": 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,
|
|
"preferences": 1,
|
|
"sensors": 1,
|
|
"sheet.frame": 1,
|
|
"sheet.place": 1,
|
|
"switches": 1
|
|
},
|
|
"why": ""
|
|
},
|
|
"cloud_step": {
|
|
"data": {
|
|
"enabled": "1",
|
|
"homing_mode": "gfcloud",
|
|
"phrase": "I UNDERSTAND"
|
|
},
|
|
"status": 200
|
|
},
|
|
"completed": {
|
|
"acceptance_done": true,
|
|
"account": true,
|
|
"advisories_complete": true,
|
|
"completed": true,
|
|
"first_run": false,
|
|
"gate": "open",
|
|
"override": true,
|
|
"required": [],
|
|
"versions": {
|
|
"account": 1,
|
|
"advisories": 1,
|
|
"airflow": 1,
|
|
"cameras": 1,
|
|
"cloud": 1,
|
|
"cloud.header": 1,
|
|
"cooling.aa-offset": 1,
|
|
"cooling.flow": 1,
|
|
"cooling.flow-load": 1,
|
|
"cooling.flow-verify": 1,
|
|
"cooling.tec": 1,
|
|
"laser.corner": 1,
|
|
"laser.dose-curve": 1,
|
|
"laser.floor": 1,
|
|
"laser.focus": 1,
|
|
"machine": 1,
|
|
"motion": 1,
|
|
"preferences": 1,
|
|
"sensors": 1,
|
|
"sheet.frame": 1,
|
|
"sheet.place": 1,
|
|
"switches": 1
|
|
},
|
|
"why": ""
|
|
},
|
|
"fixture": {
|
|
"channels": [
|
|
"lid",
|
|
"interlock",
|
|
"button"
|
|
],
|
|
"hostname": "<REDACTED-1>",
|
|
"ip": "<IP-1>",
|
|
"released": []
|
|
},
|
|
"fresh": {
|
|
"acceptance_done": false,
|
|
"account": false,
|
|
"advisories_complete": false,
|
|
"completed": false,
|
|
"first_run": true,
|
|
"gate": "closed",
|
|
"override": true,
|
|
"required": [
|
|
"advisories",
|
|
"account",
|
|
"preferences",
|
|
"machine",
|
|
"cloud"
|
|
],
|
|
"versions": {
|
|
"airflow": 1,
|
|
"cameras": 1,
|
|
"cloud.header": 1,
|
|
"cooling.aa-offset": 1,
|
|
"cooling.flow": 1,
|
|
"cooling.flow-load": 1,
|
|
"cooling.flow-verify": 1,
|
|
"cooling.tec": 1,
|
|
"laser.corner": 1,
|
|
"laser.dose-curve": 1,
|
|
"laser.floor": 1,
|
|
"laser.focus": 1,
|
|
"motion": 1,
|
|
"sensors": 1,
|
|
"sheet.frame": 1,
|
|
"sheet.place": 1,
|
|
"switches": 1
|
|
},
|
|
"why": "the advisories are not accepted"
|
|
},
|
|
"led_pattern": {
|
|
"pulse_off": [
|
|
0,
|
|
1400,
|
|
1400
|
|
],
|
|
"pulse_on": [
|
|
0,
|
|
1400,
|
|
1400
|
|
],
|
|
"target": [
|
|
0,
|
|
255,
|
|
255
|
|
]
|
|
},
|
|
"mode_after_setup": {
|
|
"controller": "running",
|
|
"gated": false,
|
|
"local": false,
|
|
"mode": "grbl",
|
|
"motion": "verified",
|
|
"pid": 2158,
|
|
"why": ""
|
|
},
|
|
"settings_before": {
|
|
"cloud_enabled": "1",
|
|
"controller_mode": "grbl",
|
|
"cool_tec_present": "0",
|
|
"gfcloud_home_timeout_s": "",
|
|
"homing_mode": "gfcloud",
|
|
"ui_units": "imperial",
|
|
"wifi_country": "US"
|
|
},
|
|
"users_reload_rc": 0
|
|
},
|
|
"fingerprint": "1c695919214a1e39f19fe5bd0f7c48818ae74f6d8e7fd75e1ed903a8f063b33c",
|
|
"image": "20260919202327 (dev)",
|
|
"log": [
|
|
"20:33:07 start setup.first-run-flow (operator, takeover) in campaign c-20260919202934-3d3a",
|
|
"20:33:07 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
|
|
"20:33:07 fixture: <REDACTED-1> at <IP-1> covers lid, interlock, button",
|
|
"20:33:07 fixture: running unattended (no prompt can be answered)",
|
|
"20:33:07 queued by the unattended queue opened 2026-09-19T20:29:34Z",
|
|
"20:33:07 baseline: pre: clean",
|
|
"20:33:07 takeover: waiting for forgectrl to be settled",
|
|
"20:33:07 baseline: /mode controller=running motion=verified",
|
|
"20:33:07 takeover: preserving cnc/motor_lock=0, cnc/step_freq=112640, cnc/ramp_rate=500000, cnc/streaming=0, cnc/x_mode=32, cnc/y_mode=32, cnc/x_decay=1, cnc/y_decay=1, pic/x_step_current=33, pic/y_step_current=5",
|
|
"20:33:07 takeover: stopping the controller through forgectrl",
|
|
"20:33:07 takeover: POST /controller/stop -> 200",
|
|
"20:33:07 takeover: forgectrl stop -> rc 0",
|
|
"20:33:08 takeover: pulse device free",
|
|
"20:33:08 takeover: forgectrl start -> rc 0",
|
|
"20:33:10 baseline: /mode controller=gated motion=unverified",
|
|
"20:33:10 installed under a restart: setup.json=13949 B, users=removed, setup-override=0 B",
|
|
"20:33:11 the four documents are accepted",
|
|
"20:33:11 ACT button press (fixture)",
|
|
"20:33:11 ACT button press: done after 0.3 s",
|
|
"20:33:11 the press step: teal ({'target': [0, 255, 255], 'pulse_on': [0, 1400, 1400], 'pulse_off': [0, 1400, 1400]}), the press accepted",
|
|
"20:33:12 account 'bench-ac5d' created, the session cookie set",
|
|
"20:33:12 preferences, machine (basic), cloud (1) written",
|
|
"20:33:12 baseline: /mode controller=stopped motion=unverified",
|
|
"20:33:18 baseline: /mode controller=running motion=verified",
|
|
"20:33:18 the run completed: gate open, the controller back",
|
|
"20:33:18 takeover: waiting for forgectrl to be settled",
|
|
"20:33:18 baseline: /mode controller=running motion=verified",
|
|
"20:33:18 takeover: preserving cnc/motor_lock=0, cnc/step_freq=112640, cnc/ramp_rate=500000, cnc/streaming=0, cnc/x_mode=32, cnc/y_mode=32, cnc/x_decay=1, cnc/y_decay=1, pic/x_step_current=33, pic/y_step_current=5",
|
|
"20:33:18 takeover: stopping the controller through forgectrl",
|
|
"20:33:19 takeover: POST /controller/stop -> 200",
|
|
"20:33:19 takeover: forgectrl stop -> rc 0",
|
|
"20:33:20 takeover: pulse device free",
|
|
"20:33:20 takeover: forgectrl start -> rc 0",
|
|
"20:33:22 baseline: /mode controller=stopped motion=unverified",
|
|
"20:33:27 baseline: /mode controller=running motion=verified",
|
|
"20:33:27 restored under a restart: setup.json, users, setup-override",
|
|
"20:33:27 restore cloud_enabled='1' -> 200",
|
|
"20:33:27 restore homing_mode='gfcloud' -> 200",
|
|
"20:33:27 restore controller_mode='grbl' -> 200",
|
|
"20:33:27 restore gfcloud_home_timeout_s='' -> 200",
|
|
"20:33:27 restore cool_tec_present='0' -> 200",
|
|
"20:33:27 restore ui_units='imperial' -> 200",
|
|
"20:33:28 restore wifi_country='US' -> 200",
|
|
"20:33:28 forgefirm-users reload -> rc 0 forgefirm-users: account scott created\nforgefirm-users: removing account bench-ac5d (not in the record)",
|
|
"20:33:28 removed the temporary home directory of 'bench-ac5d'",
|
|
"20:33:28 baseline: post: clean",
|
|
"20:33:28 result PASS"
|
|
],
|
|
"manifest_sha": "2d41354cdfb037d942fbe328e2ae0594efadd92e976d1c4512ca461b5f864a7e",
|
|
"message": "",
|
|
"result": "PASS",
|
|
"test": "setup.first-run-flow",
|
|
"ts": "2026-09-19T20:33:28Z"
|
|
},
|
|
"requires": [
|
|
"setup.gate-blocks-controllers",
|
|
"setup.advisories-rehash"
|
|
],
|
|
"satisfied": true,
|
|
"source_sha": "78dfb2311d9689d69e5510aad42d38a21ebcf11a956b8f2d01777aeeeae2cbd9",
|
|
"subsystem": "setup",
|
|
"title": "The first run, driven as the page drives it"
|
|
},
|
|
{
|
|
"always": false,
|
|
"covers": [
|
|
[
|
|
"forgectrl",
|
|
"src/ui/wizard.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/ui/forms.js"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/ui/md.js"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/ui/login.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/ui/embed_docs.cmake"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/tls.*"
|
|
]
|
|
],
|
|
"fingerprint": "6f4a7262cc0f8ae5a19079a7f2aec21d8c1643e69c65baaaee42302c05477725",
|
|
"hardware": "takeover",
|
|
"id": "setup.first-run-page",
|
|
"inherited": true,
|
|
"kind": "operator",
|
|
"record": {
|
|
"answers": [
|
|
{
|
|
"answer": "Yes",
|
|
"question": "Did the control panel open after Finish?",
|
|
"ts": "2026-09-19T21:22:31Z"
|
|
}
|
|
],
|
|
"campaign": "c-20260919210959-8780",
|
|
"duration_s": 98,
|
|
"evidence": {
|
|
"account_before": "scott",
|
|
"actions": [
|
|
{
|
|
"by": "fixture",
|
|
"channel": "button",
|
|
"state": "press",
|
|
"took_s": 1.05,
|
|
"ts": "2026-09-19T21:21:41Z"
|
|
}
|
|
],
|
|
"after": {
|
|
"acceptance_done": true,
|
|
"account": true,
|
|
"advisories_complete": true,
|
|
"completed": true,
|
|
"first_run": false,
|
|
"gate": "open",
|
|
"override": true,
|
|
"required": [],
|
|
"versions": {
|
|
"account": 1,
|
|
"advisories": 1,
|
|
"airflow": 1,
|
|
"cameras": 1,
|
|
"cloud": 1,
|
|
"cloud.header": 1,
|
|
"cooling.aa-offset": 1,
|
|
"cooling.flow": 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,
|
|
"preferences": 1,
|
|
"sensors": 1,
|
|
"sheet.frame": 1,
|
|
"sheet.place": 1,
|
|
"switches": 1
|
|
},
|
|
"why": ""
|
|
},
|
|
"baseline": {
|
|
"post": [],
|
|
"pre": []
|
|
},
|
|
"batch": {
|
|
"group": "attended",
|
|
"ts": "2026-09-19T21:21:02Z"
|
|
},
|
|
"before": {
|
|
"acceptance_done": true,
|
|
"account": true,
|
|
"advisories_complete": true,
|
|
"completed": true,
|
|
"first_run": false,
|
|
"gate": "open",
|
|
"override": true,
|
|
"required": [],
|
|
"versions": {
|
|
"account": 1,
|
|
"advisories": 1,
|
|
"airflow": 1,
|
|
"cameras": 1,
|
|
"cloud": 1,
|
|
"cloud.header": 1,
|
|
"cooling.aa-offset": 1,
|
|
"cooling.flow": 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,
|
|
"preferences": 1,
|
|
"sensors": 1,
|
|
"sheet.frame": 1,
|
|
"sheet.place": 1,
|
|
"switches": 1
|
|
},
|
|
"why": ""
|
|
},
|
|
"completed": {
|
|
"acceptance_done": true,
|
|
"account": true,
|
|
"advisories_complete": true,
|
|
"completed": true,
|
|
"first_run": false,
|
|
"gate": "open",
|
|
"override": true,
|
|
"required": [],
|
|
"versions": {
|
|
"account": 1,
|
|
"advisories": 1,
|
|
"airflow": 1,
|
|
"cameras": 1,
|
|
"cloud": 1,
|
|
"cloud.header": 1,
|
|
"cooling.aa-offset": 1,
|
|
"cooling.flow": 1,
|
|
"cooling.flow-load": 1,
|
|
"cooling.flow-verify": 1,
|
|
"cooling.tec": 1,
|
|
"laser.corner": 1,
|
|
"laser.dose-curve": 1,
|
|
"laser.floor": 1,
|
|
"laser.focus": 1,
|
|
"machine": 1,
|
|
"motion": 1,
|
|
"preferences": 1,
|
|
"sensors": 1,
|
|
"sheet.frame": 1,
|
|
"sheet.place": 1,
|
|
"switches": 1
|
|
},
|
|
"why": ""
|
|
},
|
|
"fixture": {
|
|
"channels": [
|
|
"lid",
|
|
"interlock",
|
|
"button"
|
|
],
|
|
"hostname": "<REDACTED-1>",
|
|
"ip": "<IP-1>",
|
|
"released": []
|
|
},
|
|
"fresh": {
|
|
"acceptance_done": false,
|
|
"account": false,
|
|
"advisories_complete": false,
|
|
"completed": false,
|
|
"first_run": true,
|
|
"gate": "closed",
|
|
"override": true,
|
|
"required": [
|
|
"advisories",
|
|
"account",
|
|
"preferences",
|
|
"machine",
|
|
"cloud"
|
|
],
|
|
"versions": {
|
|
"airflow": 1,
|
|
"cameras": 1,
|
|
"cloud.header": 1,
|
|
"cooling.aa-offset": 1,
|
|
"cooling.flow": 1,
|
|
"cooling.flow-load": 1,
|
|
"cooling.flow-verify": 1,
|
|
"cooling.tec": 1,
|
|
"laser.corner": 1,
|
|
"laser.dose-curve": 1,
|
|
"laser.floor": 1,
|
|
"laser.focus": 1,
|
|
"motion": 1,
|
|
"sensors": 1,
|
|
"sheet.frame": 1,
|
|
"sheet.place": 1,
|
|
"switches": 1
|
|
},
|
|
"why": "the advisories are not accepted"
|
|
},
|
|
"led_pattern": {
|
|
"pulse_off": [
|
|
0,
|
|
1400,
|
|
1400
|
|
],
|
|
"pulse_on": [
|
|
0,
|
|
1400,
|
|
1400
|
|
],
|
|
"target": [
|
|
0,
|
|
255,
|
|
255
|
|
]
|
|
},
|
|
"mode_after_setup": {
|
|
"controller": "running",
|
|
"gated": false,
|
|
"local": false,
|
|
"mode": "cloud",
|
|
"motion": "verified",
|
|
"pid": 2610,
|
|
"why": ""
|
|
},
|
|
"root_page": 200,
|
|
"settings_before": {
|
|
"cloud_enabled": "1",
|
|
"controller_mode": "cloud",
|
|
"cool_tec_present": "0",
|
|
"gfcloud_home_timeout_s": "",
|
|
"homing_mode": "gfcloud",
|
|
"ui_units": "imperial",
|
|
"wifi_country": "US"
|
|
},
|
|
"temp_account": "bigcockswallow",
|
|
"users_reload_rc": 0
|
|
},
|
|
"fingerprint": "6f4a7262cc0f8ae5a19079a7f2aec21d8c1643e69c65baaaee42302c05477725",
|
|
"image": "20260919210531 (dev)",
|
|
"log": [
|
|
"21:21:02 start setup.first-run-page (operator, takeover) in campaign c-20260919210959-8780",
|
|
"21:21:03 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
|
|
"21:21:03 fixture: <REDACTED-1> at <IP-1> covers lid, interlock, button",
|
|
"21:21:03 queued by the attended queue opened 2026-09-19T21:21:02Z",
|
|
"21:21:03 baseline: pre: clean",
|
|
"21:21:03 takeover: waiting for forgectrl to be settled",
|
|
"21:21:03 baseline: /mode controller=running motion=verified",
|
|
"21:21:03 takeover: preserving cnc/motor_lock=8, cnc/step_freq=10000, cnc/ramp_rate=500000, 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",
|
|
"21:21:03 takeover: stopping the controller through forgectrl",
|
|
"21:21:04 takeover: POST /controller/stop -> 200",
|
|
"21:21:04 takeover: forgectrl stop -> rc 0",
|
|
"21:21:05 takeover: pulse device free",
|
|
"21:21:05 takeover: forgectrl start -> rc 0",
|
|
"21:21:07 baseline: /mode controller=gated motion=unverified",
|
|
"21:21:07 installed under a restart: setup.json=13950 B, users=removed, setup-override=0 B",
|
|
"21:21:08 NOTICE: Open https://<IP-2>/ from the workstation, accept the certificate, and click through the setup as the steps describe. The test follows the record.",
|
|
"21:21:34 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
|
|
"21:21:40 the documents are accepted (33 s)",
|
|
"21:21:41 ACT button press (fixture)",
|
|
"21:21:43 ACT button press: done after 1.1 s",
|
|
"21:21:43 NOTICE: Continue on the page: the account, the preferences, the machine, the cloud step, Finish.",
|
|
"21:22:02 account 'bigcockswallow' created (20 s)",
|
|
"21:22:06 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
|
|
"21:22:24 baseline: /mode controller=running motion=verified",
|
|
"21:22:24 PROMPT: Did the control panel open after Finish?",
|
|
"21:22:31 ANSWER: Yes",
|
|
"21:22:31 takeover: waiting for forgectrl to be settled",
|
|
"21:22:31 baseline: /mode controller=running motion=verified",
|
|
"21:22:31 takeover: preserving cnc/motor_lock=8, cnc/step_freq=10000, cnc/ramp_rate=500000, 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",
|
|
"21:22:31 takeover: stopping the controller through forgectrl",
|
|
"21:22:32 takeover: POST /controller/stop -> 200",
|
|
"21:22:32 takeover: forgectrl stop -> rc 0",
|
|
"21:22:33 takeover: pulse device free",
|
|
"21:22:33 takeover: forgectrl start -> rc 0",
|
|
"21:22:35 baseline: /mode controller=stopped motion=unverified",
|
|
"21:22:37 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
|
|
"21:22:39 baseline: /mode controller=running motion=verified",
|
|
"21:22:39 restored under a restart: setup.json, users, setup-override",
|
|
"21:22:39 restore cloud_enabled='1' -> 200",
|
|
"21:22:39 restore homing_mode='gfcloud' -> 200",
|
|
"21:22:39 restore controller_mode='cloud' -> 200",
|
|
"21:22:39 restore gfcloud_home_timeout_s='' -> 200",
|
|
"21:22:39 restore cool_tec_present='0' -> 200",
|
|
"21:22:39 restore ui_units='imperial' -> 200",
|
|
"21:22:40 restore wifi_country='US' -> 200",
|
|
"21:22:40 forgefirm-users reload -> rc 0 forgefirm-users: account scott created\nforgefirm-users: removing account bigcockswallow (not in the record)",
|
|
"21:22:40 removed the temporary home directory of 'bigcockswallow'",
|
|
"21:22:41 baseline: post: clean",
|
|
"21:22:41 result PASS"
|
|
],
|
|
"manifest_sha": "5221f3466ae2497ca49fbb8cbe5d4eff49fab0f8c627190416aa2320948f69c4",
|
|
"message": "",
|
|
"result": "PASS",
|
|
"test": "setup.first-run-page",
|
|
"ts": "2026-09-19T21:22:41Z"
|
|
},
|
|
"requires": [
|
|
"setup.gate-blocks-controllers",
|
|
"setup.advisories-rehash",
|
|
"setup.first-run-flow"
|
|
],
|
|
"satisfied": true,
|
|
"source_sha": "b3c2bc6a83c324d419fcab079711db3a8357dcf635cfa7371434fbbe815ac408",
|
|
"subsystem": "setup",
|
|
"title": "The first-run page, walked once"
|
|
},
|
|
{
|
|
"always": false,
|
|
"covers": [
|
|
[
|
|
"forgectrl",
|
|
"src/tls.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/main.c"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/ui/wizard.html"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/ui/wizard.js"
|
|
]
|
|
],
|
|
"fingerprint": "0b25fe54116df3842364e8fef9e064db124fdf3aa1f88f8b921a53e522602b52",
|
|
"hardware": "api",
|
|
"id": "setup.cert-page",
|
|
"inherited": true,
|
|
"kind": "auto",
|
|
"record": {
|
|
"answers": [],
|
|
"campaign": "c-20260919202934-3d3a",
|
|
"duration_s": 0,
|
|
"evidence": {
|
|
"baseline": {
|
|
"post": [],
|
|
"pre": []
|
|
},
|
|
"batch": {
|
|
"group": "unattended",
|
|
"ts": "2026-09-19T20:29:34Z"
|
|
},
|
|
"fingerprint": "41:15:34:89:0E:D3:9F:C8:04:7D:D9:5E:71:85:6B:E6:8E:2B:87:A2:CE:C2:9C:1E:BD:82:AD:14:8A:77:1C:2D",
|
|
"fixture": {
|
|
"channels": [
|
|
"lid",
|
|
"interlock",
|
|
"button"
|
|
],
|
|
"hostname": "<REDACTED-1>",
|
|
"ip": "<IP-1>",
|
|
"released": []
|
|
},
|
|
"pem_bytes": 635
|
|
},
|
|
"fingerprint": "0b25fe54116df3842364e8fef9e064db124fdf3aa1f88f8b921a53e522602b52",
|
|
"image": "20260919202327 (dev)",
|
|
"log": [
|
|
"20:33:28 start setup.cert-page (auto, api) in campaign c-20260919202934-3d3a",
|
|
"20:33:29 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
|
|
"20:33:29 fixture: <REDACTED-1> at <IP-1> covers lid, interlock, button",
|
|
"20:33:29 queued by the unattended queue opened 2026-09-19T20:29:34Z",
|
|
"20:33:29 baseline: pre: clean",
|
|
"20:33:29 GET http://<IP-2>/cert -> 200",
|
|
"20:33:29 GET https://<IP-2>/cert -> 200",
|
|
"20:33:29 baseline: post: clean",
|
|
"20:33:29 result PASS"
|
|
],
|
|
"manifest_sha": "2d41354cdfb037d942fbe328e2ae0594efadd92e976d1c4512ca461b5f864a7e",
|
|
"message": "",
|
|
"result": "PASS",
|
|
"test": "setup.cert-page",
|
|
"ts": "2026-09-19T20:33:29Z"
|
|
},
|
|
"requires": [
|
|
"forgectrl.auth"
|
|
],
|
|
"satisfied": true,
|
|
"source_sha": "5f68066ce5df588d80fde9c3dad0763f7400c2d77c41098966c6c9f521a696bf",
|
|
"subsystem": "setup",
|
|
"title": "The certificate is checkable before the warning"
|
|
},
|
|
{
|
|
"always": false,
|
|
"covers": [
|
|
[
|
|
"forgectrl",
|
|
"src/setup.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/wiz.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/main.c"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/ui/panel.js"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/ui/index.html"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/ui/help.js"
|
|
]
|
|
],
|
|
"fingerprint": "78137ca8417bd73f00629cb79e418c0142a0f70511134f4f1bc1f19750c5927b",
|
|
"hardware": "takeover",
|
|
"id": "setup.what-changed",
|
|
"inherited": true,
|
|
"kind": "auto",
|
|
"record": {
|
|
"answers": [],
|
|
"campaign": "c-20260919202934-3d3a",
|
|
"duration_s": 8,
|
|
"evidence": {
|
|
"after": {
|
|
"acceptance_done": true,
|
|
"account": true,
|
|
"advisories_complete": true,
|
|
"completed": true,
|
|
"first_run": false,
|
|
"gate": "open",
|
|
"override": true,
|
|
"required": [],
|
|
"versions": {
|
|
"account": 1,
|
|
"advisories": 1,
|
|
"airflow": 1,
|
|
"cameras": 1,
|
|
"cloud": 1,
|
|
"cloud.header": 1,
|
|
"cooling.aa-offset": 1,
|
|
"cooling.flow": 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,
|
|
"preferences": 1,
|
|
"sensors": 1,
|
|
"sheet.frame": 1,
|
|
"sheet.place": 1,
|
|
"switches": 1
|
|
},
|
|
"why": ""
|
|
},
|
|
"baseline": {
|
|
"post": [],
|
|
"pre": []
|
|
},
|
|
"batch": {
|
|
"group": "unattended",
|
|
"ts": "2026-09-19T20:29:34Z"
|
|
},
|
|
"before": {
|
|
"acceptance_done": true,
|
|
"account": true,
|
|
"advisories_complete": true,
|
|
"completed": true,
|
|
"first_run": false,
|
|
"gate": "open",
|
|
"override": true,
|
|
"required": [],
|
|
"versions": {
|
|
"account": 1,
|
|
"advisories": 1,
|
|
"airflow": 1,
|
|
"cameras": 1,
|
|
"cloud": 1,
|
|
"cloud.header": 1,
|
|
"cooling.aa-offset": 1,
|
|
"cooling.flow": 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,
|
|
"preferences": 1,
|
|
"sensors": 1,
|
|
"sheet.frame": 1,
|
|
"sheet.place": 1,
|
|
"switches": 1
|
|
},
|
|
"why": ""
|
|
},
|
|
"fan_reason": "a fan was replaced",
|
|
"fixture": {
|
|
"channels": [
|
|
"lid",
|
|
"interlock",
|
|
"button"
|
|
],
|
|
"hostname": "<REDACTED-1>",
|
|
"ip": "<IP-1>",
|
|
"released": []
|
|
},
|
|
"gated_after_fan": false,
|
|
"gated_before": false,
|
|
"menu": [
|
|
"tube",
|
|
"pump",
|
|
"coolant",
|
|
"fan",
|
|
"head",
|
|
"tray",
|
|
"service"
|
|
],
|
|
"override": true,
|
|
"tray_reason": "the tray was replaced"
|
|
},
|
|
"fingerprint": "78137ca8417bd73f00629cb79e418c0142a0f70511134f4f1bc1f19750c5927b",
|
|
"image": "20260919202327 (dev)",
|
|
"log": [
|
|
"20:33:29 start setup.what-changed (auto, takeover) in campaign c-20260919202934-3d3a",
|
|
"20:33:29 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
|
|
"20:33:29 fixture: <REDACTED-1> at <IP-1> covers lid, interlock, button",
|
|
"20:33:29 queued by the unattended queue opened 2026-09-19T20:29:34Z",
|
|
"20:33:29 baseline: pre: clean",
|
|
"20:33:29 POST /wiz/changed what=nothing-like-this -> 400",
|
|
"20:33:30 POST /wiz/changed what=tray -> 200",
|
|
"20:33:30 POST /wiz/changed what=fan -> 200",
|
|
"20:33:30 tray -> focus recommended; fan -> airflow required; gate open (override True)",
|
|
"20:33:30 takeover: waiting for forgectrl to be settled",
|
|
"20:33:30 baseline: /mode controller=running motion=verified",
|
|
"20:33:30 takeover: preserving cnc/motor_lock=0, cnc/step_freq=112640, cnc/ramp_rate=500000, cnc/streaming=0, cnc/x_mode=32, cnc/y_mode=32, cnc/x_decay=1, cnc/y_decay=1, pic/x_step_current=33, pic/y_step_current=5",
|
|
"20:33:30 takeover: stopping the controller through forgectrl",
|
|
"20:33:30 takeover: POST /controller/stop -> 200",
|
|
"20:33:30 takeover: forgectrl stop -> rc 0",
|
|
"20:33:31 takeover: pulse device free",
|
|
"20:33:31 takeover: forgectrl start -> rc 0",
|
|
"20:33:33 baseline: /mode controller=stopped motion=unverified",
|
|
"20:33:38 baseline: /mode controller=running motion=verified",
|
|
"20:33:38 restored under a restart: setup.json",
|
|
"20:33:38 baseline: post: clean",
|
|
"20:33:38 result PASS"
|
|
],
|
|
"manifest_sha": "2d41354cdfb037d942fbe328e2ae0594efadd92e976d1c4512ca461b5f864a7e",
|
|
"message": "",
|
|
"result": "PASS",
|
|
"test": "setup.what-changed",
|
|
"ts": "2026-09-19T20:33:38Z"
|
|
},
|
|
"requires": [
|
|
"forgectrl.auth"
|
|
],
|
|
"satisfied": true,
|
|
"source_sha": "fe15c4ae00b0e9215365ef4c59dfcfb2b1145b9e000002cc08943852c1331aaa",
|
|
"subsystem": "setup",
|
|
"title": "A replaced part asks for its checks again"
|
|
},
|
|
{
|
|
"always": false,
|
|
"covers": [
|
|
[
|
|
"forgectrl",
|
|
"src/setup.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/recordhtml.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/wiz.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/logs.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/main.c"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/ui/index.html"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/ui/panel.js"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/ui/wizard.html"
|
|
]
|
|
],
|
|
"fingerprint": "0db26b6d0374d0a32a3c986a7ef95ea4e774e08c7734c25b5735f6d806aec090",
|
|
"hardware": "api",
|
|
"id": "setup.record-export",
|
|
"inherited": true,
|
|
"kind": "auto",
|
|
"record": {
|
|
"answers": [],
|
|
"campaign": "c-20260919202934-3d3a",
|
|
"duration_s": 43,
|
|
"evidence": {
|
|
"baseline": {
|
|
"post": [],
|
|
"pre": []
|
|
},
|
|
"batch": {
|
|
"group": "unattended",
|
|
"ts": "2026-09-19T20:29:34Z"
|
|
},
|
|
"bundle_record_bytes": 19615,
|
|
"download_disposition": "attachment; filename=\"forgefirm-setup-KZZ77-UF6XM.json\"",
|
|
"export_s": 42.5,
|
|
"fixture": {
|
|
"channels": [
|
|
"lid",
|
|
"interlock",
|
|
"button"
|
|
],
|
|
"hostname": "<REDACTED-1>",
|
|
"ip": "<IP-1>",
|
|
"released": []
|
|
},
|
|
"missing_on_page": [],
|
|
"page_bytes": 17660,
|
|
"sheet_id": "KZZ77-UF6XM",
|
|
"wizards_in_record": [
|
|
"account",
|
|
"advisories",
|
|
"airflow",
|
|
"cameras",
|
|
"cloud",
|
|
"cloud.header",
|
|
"cooling.aa-offset",
|
|
"cooling.flow",
|
|
"cooling.flow-load",
|
|
"cooling.flow-verify",
|
|
"laser.corner",
|
|
"laser.dose-curve",
|
|
"laser.floor",
|
|
"laser.focus",
|
|
"machine",
|
|
"motion",
|
|
"preferences",
|
|
"sensors",
|
|
"sheet.frame",
|
|
"sheet.place",
|
|
"switches"
|
|
]
|
|
},
|
|
"fingerprint": "0db26b6d0374d0a32a3c986a7ef95ea4e774e08c7734c25b5735f6d806aec090",
|
|
"image": "20260919202327 (dev)",
|
|
"log": [
|
|
"20:34:22 start setup.record-export (auto, api) in campaign c-20260919202934-3d3a",
|
|
"20:34:22 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
|
|
"20:34:22 fixture: <REDACTED-1> at <IP-1> covers lid, interlock, button",
|
|
"20:34:22 queued by the unattended queue opened 2026-09-19T20:29:34Z",
|
|
"20:34:22 baseline: pre: clean",
|
|
"20:34:23 GET /wiz/record -> 200 (12045 bytes)",
|
|
"20:34:23 GET /wiz/record.html -> 200 (17660 bytes)",
|
|
"20:34:54 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
|
|
"20:35:05 POST /logs/export -> 200 (3726613 bytes, 42.5 s)",
|
|
"20:35:05 record 21 wizards; page 17660 bytes; bundle carries the record",
|
|
"20:35:06 baseline: post: clean",
|
|
"20:35:06 result PASS"
|
|
],
|
|
"manifest_sha": "2d41354cdfb037d942fbe328e2ae0594efadd92e976d1c4512ca461b5f864a7e",
|
|
"message": "",
|
|
"result": "PASS",
|
|
"test": "setup.record-export",
|
|
"ts": "2026-09-19T20:35:06Z"
|
|
},
|
|
"requires": [
|
|
"forgectrl.auth",
|
|
"logs.tree-tail-export"
|
|
],
|
|
"satisfied": true,
|
|
"source_sha": "cf6cdbfae3047421e0bb2464cf95db538aae83a47b4ce99e521ef45356838a94",
|
|
"subsystem": "setup",
|
|
"title": "The record: JSON, the printable page, and the log bundle"
|
|
},
|
|
{
|
|
"always": false,
|
|
"covers": [
|
|
[
|
|
"forgectrl",
|
|
"src/wizdark.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/wizcalc.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/wiz.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/session.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/ui/wizard.js"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/ui/wizard.html"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/ui/wizard.css"
|
|
]
|
|
],
|
|
"fingerprint": "7125e4fb284a516d21c7713e5ef2f15d722e4f9b3c989320e6386f712a5e2c08",
|
|
"hardware": "takeover",
|
|
"id": "setup.mirror",
|
|
"inherited": true,
|
|
"kind": "auto",
|
|
"record": {
|
|
"answers": [],
|
|
"campaign": "c-20260919202934-3d3a",
|
|
"duration_s": 18,
|
|
"evidence": {
|
|
"a_sees": {
|
|
"mine": true,
|
|
"owned": true,
|
|
"running": true
|
|
},
|
|
"account_before": "scott",
|
|
"after_takeover": {
|
|
"a": false,
|
|
"b": true
|
|
},
|
|
"b_abort_refused": 409,
|
|
"b_sees": {
|
|
"mine": false,
|
|
"owned": true,
|
|
"running": true
|
|
},
|
|
"baseline": {
|
|
"post": [],
|
|
"pre": []
|
|
},
|
|
"batch": {
|
|
"group": "unattended",
|
|
"ts": "2026-09-19T20:29:34Z"
|
|
},
|
|
"end": {
|
|
"error": "aborted",
|
|
"running": false
|
|
},
|
|
"fixture": {
|
|
"channels": [
|
|
"lid",
|
|
"interlock",
|
|
"button"
|
|
],
|
|
"hostname": "<REDACTED-1>",
|
|
"ip": "<IP-1>",
|
|
"released": []
|
|
},
|
|
"tool_sees": {
|
|
"mine": true,
|
|
"owned": true,
|
|
"running": true
|
|
},
|
|
"users_reload_rc": 0
|
|
},
|
|
"fingerprint": "7125e4fb284a516d21c7713e5ef2f15d722e4f9b3c989320e6386f712a5e2c08",
|
|
"image": "20260919202327 (dev)",
|
|
"log": [
|
|
"20:35:18 start setup.mirror (auto, takeover) in campaign c-20260919202934-3d3a",
|
|
"20:35:18 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
|
|
"20:35:18 fixture: <REDACTED-1> at <IP-1> covers lid, interlock, button",
|
|
"20:35:18 queued by the unattended queue opened 2026-09-19T20:29:34Z",
|
|
"20:35:18 baseline: pre: clean",
|
|
"20:35:18 takeover: waiting for forgectrl to be settled",
|
|
"20:35:18 baseline: /mode controller=running motion=verified",
|
|
"20:35:18 takeover: preserving cnc/motor_lock=0, cnc/step_freq=112640, cnc/ramp_rate=500000, cnc/streaming=0, cnc/x_mode=32, cnc/y_mode=32, cnc/x_decay=1, cnc/y_decay=1, pic/x_step_current=33, pic/y_step_current=5",
|
|
"20:35:18 takeover: stopping the controller through forgectrl",
|
|
"20:35:19 takeover: POST /controller/stop -> 200",
|
|
"20:35:19 takeover: forgectrl stop -> rc 0",
|
|
"20:35:19 takeover: pulse device free",
|
|
"20:35:19 takeover: forgectrl start -> rc 0",
|
|
"20:35:21 baseline: /mode controller=stopped motion=unverified",
|
|
"20:35:25 baseline: /mode controller=running motion=verified",
|
|
"20:35:25 installed under a restart: users=removed",
|
|
"20:35:26 POST /wiz/sensors/start (session A) -> 200",
|
|
"20:35:26 POST /wiz/sensors/abort (session B) -> 409 {'error': 'another browser is running this step; take it over to answer'}",
|
|
"20:35:26 POST /wiz/sensors/takeover (session B) -> 200",
|
|
"20:35:26 POST /wiz/sensors/abort (session B, owner) -> 200",
|
|
"20:35:27 takeover: waiting for forgectrl to be settled",
|
|
"20:35:27 baseline: /mode controller=running motion=verified",
|
|
"20:35:27 takeover: preserving cnc/motor_lock=0, cnc/step_freq=112640, cnc/ramp_rate=500000, cnc/streaming=0, cnc/x_mode=32, cnc/y_mode=32, cnc/x_decay=1, cnc/y_decay=1, pic/x_step_current=33, pic/y_step_current=5",
|
|
"20:35:27 takeover: stopping the controller through forgectrl",
|
|
"20:35:28 takeover: POST /controller/stop -> 200",
|
|
"20:35:28 takeover: forgectrl stop -> rc 0",
|
|
"20:35:29 takeover: pulse device free",
|
|
"20:35:29 takeover: forgectrl start -> rc 0",
|
|
"20:35:31 baseline: /mode controller=stopped motion=unverified",
|
|
"20:35:36 baseline: /mode controller=running motion=verified",
|
|
"20:35:36 restored under a restart: users",
|
|
"20:35:36 A owned the run, B mirrored, B took over and stopped it; the account is back",
|
|
"20:35:36 baseline: post: clean",
|
|
"20:35:36 result PASS"
|
|
],
|
|
"manifest_sha": "2d41354cdfb037d942fbe328e2ae0594efadd92e976d1c4512ca461b5f864a7e",
|
|
"message": "",
|
|
"result": "PASS",
|
|
"test": "setup.mirror",
|
|
"ts": "2026-09-19T20:35:36Z"
|
|
},
|
|
"requires": [
|
|
"forgectrl.auth",
|
|
"setup.account-login",
|
|
"setup.check-sensors"
|
|
],
|
|
"satisfied": true,
|
|
"source_sha": "114d6175967633b560ddcba0f65253d44e09223ab2288e98012756304dbc3814",
|
|
"subsystem": "setup",
|
|
"title": "One browser drives a check; a second one follows"
|
|
},
|
|
{
|
|
"always": false,
|
|
"covers": [
|
|
[
|
|
"forgectrl",
|
|
"src/wizdark.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/wizcalc.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/wiz.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/setup.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/main.c"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/ui/wizard.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/status.c"
|
|
]
|
|
],
|
|
"fingerprint": "a840467e616d91614391f94fa46f12c81564758b5c395b57a29d72832d647af6",
|
|
"hardware": "api",
|
|
"id": "setup.check-switches",
|
|
"inherited": true,
|
|
"kind": "operator",
|
|
"record": {
|
|
"answers": [],
|
|
"campaign": "c-20260919202934-3d3a",
|
|
"duration_s": 5,
|
|
"evidence": {
|
|
"actions": [
|
|
{
|
|
"by": "fixture",
|
|
"channel": "lid",
|
|
"state": "open",
|
|
"took_s": 0.26,
|
|
"ts": "2026-09-19T20:35:38Z"
|
|
},
|
|
{
|
|
"by": "fixture",
|
|
"channel": "lid",
|
|
"state": "close",
|
|
"took_s": 0.26,
|
|
"ts": "2026-09-19T20:35:39Z"
|
|
},
|
|
{
|
|
"by": "fixture",
|
|
"channel": "button",
|
|
"state": "press",
|
|
"took_s": 0.26,
|
|
"ts": "2026-09-19T20:35:41Z"
|
|
}
|
|
],
|
|
"baseline": {
|
|
"post": [],
|
|
"pre": []
|
|
},
|
|
"batch": {
|
|
"group": "unattended",
|
|
"ts": "2026-09-19T20:29:34Z"
|
|
},
|
|
"elapsed_s": 4.9,
|
|
"error": "",
|
|
"fixture": {
|
|
"channels": [
|
|
"lid",
|
|
"interlock",
|
|
"button"
|
|
],
|
|
"hostname": "<REDACTED-1>",
|
|
"ip": "<IP-1>",
|
|
"released": []
|
|
},
|
|
"log": [
|
|
"00:00 switches at start: 0x0b",
|
|
"00:01 lid-open: seen",
|
|
"00:02 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",
|
|
"00:04 head: present"
|
|
],
|
|
"phases": [
|
|
"Open the lid.",
|
|
"Close the lid.",
|
|
"Press the button once."
|
|
],
|
|
"result": {
|
|
"button": true,
|
|
"head_present": true,
|
|
"hv_enable_follows_lid": false,
|
|
"interlock": "satisfied",
|
|
"lid": true
|
|
},
|
|
"started": true
|
|
},
|
|
"fingerprint": "a840467e616d91614391f94fa46f12c81564758b5c395b57a29d72832d647af6",
|
|
"image": "20260919202327 (dev)",
|
|
"log": [
|
|
"20:35:37 start setup.check-switches (operator, api) in campaign c-20260919202934-3d3a",
|
|
"20:35:37 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
|
|
"20:35:37 fixture: <REDACTED-1> at <IP-1> covers lid, interlock, button",
|
|
"20:35:37 fixture: running unattended (no prompt can be answered)",
|
|
"20:35:37 queued by the unattended queue opened 2026-09-19T20:29:34Z",
|
|
"20:35:37 baseline: pre: clean",
|
|
"20:35:37 POST /wiz/switches/start -> 200 {'started': True, 'id': 'switches'}",
|
|
"20:35:38 switches: Open the lid.",
|
|
"20:35:38 prompt lid-open (wait): Open the lid.",
|
|
"20:35:38 ACT lid open (fixture)",
|
|
"20:35:38 ACT lid open: done after 0.3 s",
|
|
"20:35:39 switches: Close the lid.",
|
|
"20:35:39 prompt lid-close (wait): Close the lid.",
|
|
"20:35:39 ACT lid close (fixture)",
|
|
"20:35:40 ACT lid close: done after 0.3 s",
|
|
"20:35:41 switches: Press the button once.",
|
|
"20:35:41 prompt button-press (wait): Press the button once.",
|
|
"20:35:41 ACT button press (fixture)",
|
|
"20:35:41 ACT button press: done after 0.3 s",
|
|
"20:35:42 switches: {\"lid\": true, \"hv_enable_follows_lid\": false, \"button\": true, \"interlock\": \"satisfied\", \"head_present\": true}",
|
|
"20:35:42 baseline: post: clean",
|
|
"20:35:42 result PASS"
|
|
],
|
|
"manifest_sha": "2d41354cdfb037d942fbe328e2ae0594efadd92e976d1c4512ca461b5f864a7e",
|
|
"message": "",
|
|
"result": "PASS",
|
|
"test": "setup.check-switches",
|
|
"ts": "2026-09-19T20:35:42Z"
|
|
},
|
|
"requires": [
|
|
"forgectrl.auth"
|
|
],
|
|
"satisfied": true,
|
|
"source_sha": "5c597f4d45f33829c02feffd86bebb72c4daf1779b1083b9e697649cf68e0303",
|
|
"subsystem": "setup",
|
|
"title": "The switches check follows the lid and the button"
|
|
},
|
|
{
|
|
"always": false,
|
|
"covers": [
|
|
[
|
|
"forgectrl",
|
|
"src/wizdark.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/wizcalc.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/wiz.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/setup.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/main.c"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/ui/wizard.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/status.c"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/accel.c"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/cool.c"
|
|
]
|
|
],
|
|
"fingerprint": "a50126fb2f8707cf744b7bfb184d466a2a05aa37b794555c9384ddfc53794d49",
|
|
"hardware": "api",
|
|
"id": "setup.check-sensors",
|
|
"inherited": true,
|
|
"kind": "auto",
|
|
"record": {
|
|
"answers": [],
|
|
"campaign": "c-20260919202934-3d3a",
|
|
"duration_s": 11,
|
|
"evidence": {
|
|
"baseline": {
|
|
"post": [],
|
|
"pre": []
|
|
},
|
|
"batch": {
|
|
"group": "unattended",
|
|
"ts": "2026-09-19T20:29:34Z"
|
|
},
|
|
"elapsed_s": 11.1,
|
|
"error": "",
|
|
"fixture": {
|
|
"channels": [
|
|
"lid",
|
|
"interlock",
|
|
"button"
|
|
],
|
|
"hostname": "<REDACTED-1>",
|
|
"ip": "<IP-1>",
|
|
"released": []
|
|
},
|
|
"log": [
|
|
"00:10 coolant 27.0/27.1 C, chassis 30.8, SoC 50.8, IR max 50/50/54/54, pgood 255, HV 0"
|
|
],
|
|
"phases": [
|
|
"sampling the sensors at rest for 10 s"
|
|
],
|
|
"result": {
|
|
"accel_events": 0,
|
|
"accel_watched": true,
|
|
"chassis_c": 30.8,
|
|
"coolant_down_c": 27.0,
|
|
"coolant_up_c": 27.1,
|
|
"exhaust_rpm_idle": 0.0,
|
|
"hv_current_max": 0,
|
|
"intake_rpm_idle": 733.0,
|
|
"laser_pgood": 1,
|
|
"lid_ir_max": [
|
|
50,
|
|
50,
|
|
54,
|
|
54
|
|
],
|
|
"purge_current": 630,
|
|
"soc_c": 50.8
|
|
},
|
|
"settings_before": {
|
|
"cloud_enabled": "1",
|
|
"cloud_hold_max_s": "",
|
|
"cloud_pause_backtrack_ticks": "",
|
|
"cloud_resume_lead_ticks": "",
|
|
"controller_mode": "grbl",
|
|
"cool_aa_offset_counts": "16",
|
|
"cool_accel_abort": "",
|
|
"cool_accel_x_alert": "",
|
|
"cool_accel_y_alert": "",
|
|
"cool_confirm_max_s": "",
|
|
"cool_cooldown_max_s": "",
|
|
"cool_cooldown_s": "",
|
|
"cool_fan_grace_s": "12",
|
|
"cool_fire_q1_alert": "",
|
|
"cool_fire_q1_critical": "",
|
|
"cool_fire_q2_alert": "",
|
|
"cool_fire_q2_critical": "",
|
|
"cool_flow_check_s": "",
|
|
"cool_flow_heater_pct": "40",
|
|
"cool_flow_rise": "14.5",
|
|
"cool_laser_heat_cw": "6.533e-05",
|
|
"cool_laser_heat_density": "5.03e-05",
|
|
"cool_purge_min_current": "345",
|
|
"cool_recheck_s": "",
|
|
"cool_tach_air_assist_min_rpm": "6093",
|
|
"cool_tach_exhaust_min_rpm": "6416",
|
|
"cool_tach_intake_min_rpm": "2277",
|
|
"cool_tec_off_c": "",
|
|
"cool_tec_on_c": "",
|
|
"cool_tec_present": "0",
|
|
"cool_temp_critical_c": "",
|
|
"cool_temp_max": "",
|
|
"cool_temp_min": "",
|
|
"cool_temp_offset_c": "",
|
|
"cool_temp_resume": "",
|
|
"cool_temp_start": "",
|
|
"gates": {
|
|
"cool_accel_abort": {
|
|
"band": [
|
|
100,
|
|
170
|
|
],
|
|
"def": 133,
|
|
"gate": "crash_abort",
|
|
"hi": 255,
|
|
"lo": 0,
|
|
"off": "low",
|
|
"state": "ok",
|
|
"value": 133
|
|
},
|
|
"cool_accel_x_alert": {
|
|
"band": [
|
|
100,
|
|
170
|
|
],
|
|
"def": 132,
|
|
"gate": "crash_x_alert",
|
|
"hi": 255,
|
|
"lo": 0,
|
|
"off": "low",
|
|
"state": "ok",
|
|
"value": 132
|
|
},
|
|
"cool_accel_y_alert": {
|
|
"band": [
|
|
85,
|
|
145
|
|
],
|
|
"def": 112,
|
|
"gate": "crash_y_alert",
|
|
"hi": 255,
|
|
"lo": 0,
|
|
"off": "low",
|
|
"state": "ok",
|
|
"value": 112
|
|
},
|
|
"cool_fan_grace_s": {
|
|
"band": [
|
|
5,
|
|
30
|
|
],
|
|
"def": 15,
|
|
"gate": null,
|
|
"hi": 120,
|
|
"lo": 0,
|
|
"off": "none",
|
|
"state": "ok",
|
|
"value": 12
|
|
},
|
|
"cool_fire_q1_alert": {
|
|
"band": [
|
|
250,
|
|
450
|
|
],
|
|
"def": 275,
|
|
"gate": "flame_q1_alert",
|
|
"hi": 1023,
|
|
"lo": 0,
|
|
"off": "low",
|
|
"state": "ok",
|
|
"value": 275
|
|
},
|
|
"cool_fire_q1_critical": {
|
|
"band": [
|
|
500,
|
|
1023
|
|
],
|
|
"def": 688,
|
|
"gate": "flame_q1_critical",
|
|
"hi": 1023,
|
|
"lo": 0,
|
|
"off": "low",
|
|
"state": "ok",
|
|
"value": 688
|
|
},
|
|
"cool_fire_q2_alert": {
|
|
"band": [
|
|
300,
|
|
500
|
|
],
|
|
"def": 374,
|
|
"gate": "flame_q2_alert",
|
|
"hi": 1023,
|
|
"lo": 0,
|
|
"off": "low",
|
|
"state": "ok",
|
|
"value": 374
|
|
},
|
|
"cool_fire_q2_critical": {
|
|
"band": [
|
|
500,
|
|
1023
|
|
],
|
|
"def": 1022,
|
|
"gate": "flame_q2_critical",
|
|
"hi": 1023,
|
|
"lo": 0,
|
|
"off": "low",
|
|
"state": "ok",
|
|
"value": 1022
|
|
},
|
|
"cool_flow_check_s": {
|
|
"band": [
|
|
30,
|
|
120
|
|
],
|
|
"def": 50,
|
|
"gate": "flow",
|
|
"hi": 300,
|
|
"lo": 0,
|
|
"off": "low",
|
|
"state": "ok",
|
|
"value": 50
|
|
},
|
|
"cool_flow_rise": {
|
|
"band": [
|
|
8,
|
|
16
|
|
],
|
|
"def": 14.4,
|
|
"gate": null,
|
|
"hi": 40,
|
|
"lo": 1,
|
|
"off": "none",
|
|
"state": "ok",
|
|
"value": 14.5
|
|
},
|
|
"cool_purge_min_current": {
|
|
"band": [
|
|
150,
|
|
500
|
|
],
|
|
"def": 300,
|
|
"gate": "purge",
|
|
"hi": 1023,
|
|
"lo": 0,
|
|
"off": "low",
|
|
"state": "ok",
|
|
"value": 345
|
|
},
|
|
"cool_recheck_s": {
|
|
"band": [
|
|
60,
|
|
600
|
|
],
|
|
"def": 150,
|
|
"gate": "recheck",
|
|
"hi": 3600,
|
|
"lo": 0,
|
|
"off": "low",
|
|
"state": "ok",
|
|
"value": 150
|
|
},
|
|
"cool_tach_air_assist_min_rpm": {
|
|
"band": [
|
|
5500,
|
|
6600
|
|
],
|
|
"def": 6000,
|
|
"gate": "air_assist",
|
|
"hi": 30000,
|
|
"lo": 0,
|
|
"off": "low",
|
|
"state": "ok",
|
|
"value": 6093
|
|
},
|
|
"cool_tach_exhaust_min_rpm": {
|
|
"band": [
|
|
5800,
|
|
7000
|
|
],
|
|
"def": 6400,
|
|
"gate": "exhaust",
|
|
"hi": 20000,
|
|
"lo": 0,
|
|
"off": "low",
|
|
"state": "ok",
|
|
"value": 6416
|
|
},
|
|
"cool_tach_intake_min_rpm": {
|
|
"band": [
|
|
2100,
|
|
2500
|
|
],
|
|
"def": 2290,
|
|
"gate": "intake",
|
|
"hi": 20000,
|
|
"lo": 0,
|
|
"off": "low",
|
|
"state": "ok",
|
|
"value": 2277
|
|
},
|
|
"cool_tec_off_c": {
|
|
"band": [
|
|
16,
|
|
22
|
|
],
|
|
"def": 18,
|
|
"gate": null,
|
|
"hi": 31,
|
|
"lo": 5,
|
|
"off": "none",
|
|
"state": "ok",
|
|
"value": 18
|
|
},
|
|
"cool_tec_on_c": {
|
|
"band": [
|
|
18,
|
|
24
|
|
],
|
|
"def": 20,
|
|
"gate": null,
|
|
"hi": 32,
|
|
"lo": 6,
|
|
"off": "none",
|
|
"state": "ok",
|
|
"value": 20
|
|
},
|
|
"cool_temp_critical_c": {
|
|
"band": [
|
|
36,
|
|
45
|
|
],
|
|
"def": 38,
|
|
"gate": "coolant_critical",
|
|
"hi": 70,
|
|
"lo": 6,
|
|
"off": "high",
|
|
"state": "ok",
|
|
"value": 38
|
|
},
|
|
"cool_temp_max": {
|
|
"band": [
|
|
25,
|
|
38
|
|
],
|
|
"def": 33,
|
|
"gate": "coolant_max",
|
|
"hi": 60,
|
|
"lo": 5,
|
|
"off": "high",
|
|
"state": "ok",
|
|
"value": 33
|
|
},
|
|
"cool_temp_min": {
|
|
"band": [
|
|
3,
|
|
8
|
|
],
|
|
"def": 5,
|
|
"gate": "coolant_min",
|
|
"hi": 40,
|
|
"lo": 0,
|
|
"off": "low",
|
|
"state": "ok",
|
|
"value": 5
|
|
},
|
|
"cool_temp_resume": {
|
|
"band": [
|
|
20,
|
|
36
|
|
],
|
|
"def": 31,
|
|
"gate": null,
|
|
"hi": 59,
|
|
"lo": 5,
|
|
"off": "none",
|
|
"state": "ok",
|
|
"value": 31
|
|
},
|
|
"cool_temp_start": {
|
|
"band": [
|
|
12,
|
|
20
|
|
],
|
|
"def": 16,
|
|
"gate": "warm_up",
|
|
"hi": 40,
|
|
"lo": 0,
|
|
"off": "low",
|
|
"state": "ok",
|
|
"value": 16
|
|
}
|
|
},
|
|
"gf_password_set": true,
|
|
"gf_serial": "<REDACTED-2>",
|
|
"gfcloud_home_timeout_s": "",
|
|
"gfcloud_home_x": "",
|
|
"gfcloud_home_y": "",
|
|
"homing_mode": "gfcloud",
|
|
"laser_button_timeout_s": "",
|
|
"laser_corner_gamma": "1.50",
|
|
"laser_disarm_s": "",
|
|
"laser_dose_curve": "10:0.62,20:2.79,30:8.46,45:24.90,60:42.02,80:52.53,100:100.00",
|
|
"laser_floor_density": "14",
|
|
"laser_pulse_min_ticks": "",
|
|
"laser_pulse_ticks": "",
|
|
"lens_hall_edge_z_mm": "4.51",
|
|
"lens_park_z_mm": "",
|
|
"lens_stop_above_steps": "20",
|
|
"lens_stop_below_steps": "14",
|
|
"lid_lamp_idle": "",
|
|
"lid_policy": "",
|
|
"log_forgectrl_disk": "",
|
|
"log_forgectrl_remote": "",
|
|
"log_gfcloud_disk": "",
|
|
"log_gfcloud_remote": "",
|
|
"log_gfhome_disk": "",
|
|
"log_gfhome_remote": "",
|
|
"log_grblhal_disk": "",
|
|
"log_grblhal_remote": "",
|
|
"log_kernel_disk": "",
|
|
"log_kernel_remote": "",
|
|
"log_system_disk": "",
|
|
"log_system_remote": "",
|
|
"machine_id": "<REDACTED-3>",
|
|
"panel_open_reads": "",
|
|
"pulse_reject_threshold_bytes": "",
|
|
"pulse_warn_threshold_bytes": "",
|
|
"rail_settle_s": "",
|
|
"syslog_port": "",
|
|
"syslog_proto": "",
|
|
"syslog_server": "",
|
|
"tls_fingerprint": "<MAC-1>:<MAC-2>:<MAC-3>:<MAC-4>:<MAC-5>:1C:2D",
|
|
"ui_units": "imperial",
|
|
"version": "20260919202327 (dev)",
|
|
"wifi_country": "US",
|
|
"xy_microsteps": "32"
|
|
},
|
|
"started": true
|
|
},
|
|
"fingerprint": "a50126fb2f8707cf744b7bfb184d466a2a05aa37b794555c9384ddfc53794d49",
|
|
"image": "20260919202327 (dev)",
|
|
"log": [
|
|
"20:35:06 start setup.check-sensors (auto, api) in campaign c-20260919202934-3d3a",
|
|
"20:35:06 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
|
|
"20:35:06 fixture: <REDACTED-1> at <IP-1> covers lid, interlock, button",
|
|
"20:35:06 queued by the unattended queue opened 2026-09-19T20:29:34Z",
|
|
"20:35:06 baseline: pre: clean",
|
|
"20:35:06 POST /wiz/sensors/start -> 200 {'started': True, 'id': 'sensors'}",
|
|
"20:35:07 sensors: sampling the sensors at rest for 10 s",
|
|
"20:35:17 sensors: coolant 27.0/27.1 C, IR [50, 50, 54, 54], HV 0",
|
|
"20:35:18 baseline: post: clean",
|
|
"20:35:18 result PASS"
|
|
],
|
|
"manifest_sha": "2d41354cdfb037d942fbe328e2ae0594efadd92e976d1c4512ca461b5f864a7e",
|
|
"message": "",
|
|
"result": "PASS",
|
|
"test": "setup.check-sensors",
|
|
"ts": "2026-09-19T20:35:18Z"
|
|
},
|
|
"requires": [
|
|
"forgectrl.auth"
|
|
],
|
|
"satisfied": true,
|
|
"source_sha": "b1c752e42fc1c4b5a86e7f97b21773bd5f8c398360a15ebf952cf9b346945c81",
|
|
"subsystem": "setup",
|
|
"title": "The sensors check reads a plausible machine at rest"
|
|
},
|
|
{
|
|
"always": false,
|
|
"covers": [
|
|
[
|
|
"forgectrl",
|
|
"src/wizdark.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/wizcalc.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/wiz.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/setup.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/main.c"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/ui/wizard.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/cool.c"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/airflow.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/gates.c"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/super.c"
|
|
]
|
|
],
|
|
"fingerprint": "1db886963f4ef8910ee331726854d3b55bcdf88dd45a8a61594da54f82f5a753",
|
|
"hardware": "takeover",
|
|
"id": "setup.check-airflow",
|
|
"inherited": true,
|
|
"kind": "auto",
|
|
"record": {
|
|
"answers": [],
|
|
"campaign": "c-20260919202934-3d3a",
|
|
"duration_s": 39,
|
|
"evidence": {
|
|
"baseline": {
|
|
"post": [],
|
|
"pre": []
|
|
},
|
|
"batch": {
|
|
"group": "unattended",
|
|
"ts": "2026-09-19T20:29:34Z"
|
|
},
|
|
"elapsed_s": 39.2,
|
|
"error": "",
|
|
"fixture": {
|
|
"channels": [
|
|
"lid",
|
|
"interlock",
|
|
"button"
|
|
],
|
|
"hostname": "<REDACTED-1>",
|
|
"ip": "<IP-1>",
|
|
"released": []
|
|
},
|
|
"log": [
|
|
"00:00 fans to run duty, purge on",
|
|
"00:38 exhaust: 11689 rpm steady, 90 percent at 4.5 s",
|
|
"00:38 intake 1: 4166 rpm steady, 90 percent at 1.0 s",
|
|
"00:38 intake 2: 4192 rpm steady, 90 percent at 1.0 s",
|
|
"00:38 air assist: 10965 rpm steady, 90 percent at 0.6 s",
|
|
"00:38 purge current 628 on, 0 off",
|
|
"00:38 floors: exhaust 6429, intake 2292, air assist 6031, purge 345; grace 10 s"
|
|
],
|
|
"phases": [
|
|
"stopping the motion controller",
|
|
"fans to the run profile for 35 s",
|
|
"purge off, reading the off current"
|
|
],
|
|
"purge_after": {
|
|
"gate": {
|
|
"floor": 345,
|
|
"reading": 622,
|
|
"state": "idle"
|
|
},
|
|
"purge_air": "1",
|
|
"took_s": 0.010775566101074219
|
|
},
|
|
"result": {
|
|
"fans": {
|
|
"air assist": {
|
|
"ok": true,
|
|
"spinup_s": 0.6,
|
|
"steady_rpm": 10965.0
|
|
},
|
|
"exhaust": {
|
|
"ok": true,
|
|
"spinup_s": 4.5,
|
|
"steady_rpm": 11689.0
|
|
},
|
|
"intake 1": {
|
|
"ok": true,
|
|
"spinup_s": 1.0,
|
|
"steady_rpm": 4166.0
|
|
},
|
|
"intake 2": {
|
|
"ok": true,
|
|
"spinup_s": 1.0,
|
|
"steady_rpm": 4192.0
|
|
}
|
|
},
|
|
"floors": {
|
|
"cool_fan_grace_s": "10",
|
|
"cool_purge_min_current": "345",
|
|
"cool_tach_air_assist_min_rpm": "6031",
|
|
"cool_tach_exhaust_min_rpm": "6429",
|
|
"cool_tach_intake_min_rpm": "2292"
|
|
},
|
|
"purge_current_off": 0.0,
|
|
"purge_current_on": 628.0
|
|
},
|
|
"settings_before": {
|
|
"cool_fan_grace_s": "12",
|
|
"cool_purge_min_current": "345",
|
|
"cool_tach_air_assist_min_rpm": "6093",
|
|
"cool_tach_exhaust_min_rpm": "6416",
|
|
"cool_tach_intake_min_rpm": "2277"
|
|
},
|
|
"started": true
|
|
},
|
|
"fingerprint": "1db886963f4ef8910ee331726854d3b55bcdf88dd45a8a61594da54f82f5a753",
|
|
"image": "20260919202327 (dev)",
|
|
"log": [
|
|
"20:36:34 start setup.check-airflow (auto, takeover) in campaign c-20260919202934-3d3a",
|
|
"20:36:35 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
|
|
"20:36:35 fixture: <REDACTED-1> at <IP-1> covers lid, interlock, button",
|
|
"20:36:35 queued by the unattended queue opened 2026-09-19T20:29:34Z",
|
|
"20:36:35 baseline: pre: clean",
|
|
"20:36:35 POST /wiz/airflow/start -> 200 {'started': True, 'id': 'airflow'}",
|
|
"20:36:35 airflow: stopping the motion controller",
|
|
"20:36:36 airflow: fans to the run profile for 35 s",
|
|
"20:37:06 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
|
|
"20:37:11 airflow: purge off, reading the off current",
|
|
"20:37:14 exhaust: 11689.0 rpm steady, 90 percent at 4.5 s",
|
|
"20:37:14 intake 1: 4166.0 rpm steady, 90 percent at 1.0 s",
|
|
"20:37:14 intake 2: 4192.0 rpm steady, 90 percent at 1.0 s",
|
|
"20:37:14 air assist: 10965.0 rpm steady, 90 percent at 0.6 s",
|
|
"20:37:14 floors: {\"cool_tach_exhaust_min_rpm\": \"6429\", \"cool_tach_intake_min_rpm\": \"2292\", \"cool_tach_air_assist_min_rpm\": \"6031\", \"cool_purge_min_current\": \"345\", \"cool_fan_grace_s\": \"10\"}",
|
|
"20:37:14 purge after the check: commanded 1, drawing 622 against the 345 floor (after 0.0 s)",
|
|
"20:37:14 restore cool_tach_exhaust_min_rpm='6416' -> 200",
|
|
"20:37:14 restore cool_tach_intake_min_rpm='2277' -> 200",
|
|
"20:37:14 restore cool_tach_air_assist_min_rpm='6093' -> 200",
|
|
"20:37:14 restore cool_purge_min_current='345' -> 200",
|
|
"20:37:14 restore cool_fan_grace_s='12' -> 200",
|
|
"20:37:14 baseline: post: clean",
|
|
"20:37:14 result PASS"
|
|
],
|
|
"manifest_sha": "2d41354cdfb037d942fbe328e2ae0594efadd92e976d1c4512ca461b5f864a7e",
|
|
"message": "",
|
|
"result": "PASS",
|
|
"test": "setup.check-airflow",
|
|
"ts": "2026-09-19T20:37:14Z"
|
|
},
|
|
"requires": [
|
|
"forgectrl.auth",
|
|
"cooling.fan-gate-trips"
|
|
],
|
|
"satisfied": true,
|
|
"source_sha": "895b5f30499e0279ec09abd6b652cb8d8a788af5ef8ebc296318141e34da5071",
|
|
"subsystem": "setup",
|
|
"title": "The airflow check measures the fans and sets the floors"
|
|
},
|
|
{
|
|
"always": false,
|
|
"covers": [
|
|
[
|
|
"forgectrl",
|
|
"src/wizdark.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/wizcalc.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/wiz.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/setup.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/main.c"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/ui/wizard.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/cam.c"
|
|
]
|
|
],
|
|
"fingerprint": "d5bd75037a73b4b11d6bb9747906ba2ac9d9e256c4cf2f376e18f15a7b8ed815",
|
|
"hardware": "api",
|
|
"id": "setup.check-cameras",
|
|
"inherited": true,
|
|
"kind": "operator",
|
|
"record": {
|
|
"answers": [],
|
|
"campaign": "c-20260919202934-3d3a",
|
|
"duration_s": 13,
|
|
"evidence": {
|
|
"actions": [
|
|
{
|
|
"by": "fixture",
|
|
"channel": "lid",
|
|
"state": "close",
|
|
"took_s": 0.04,
|
|
"ts": "2026-09-19T20:37:30Z"
|
|
}
|
|
],
|
|
"baseline": {
|
|
"post": [],
|
|
"pre": []
|
|
},
|
|
"batch": {
|
|
"group": "unattended",
|
|
"ts": "2026-09-19T20:29:34Z"
|
|
},
|
|
"elapsed_s": 3.1,
|
|
"error": "",
|
|
"fixture": {
|
|
"channels": [
|
|
"lid",
|
|
"interlock",
|
|
"button"
|
|
],
|
|
"hostname": "<REDACTED-1>",
|
|
"ip": "<IP-1>",
|
|
"released": []
|
|
},
|
|
"log": [
|
|
"00:01 lid snapshot: 89809 bytes",
|
|
"00:02 head snapshot: 57960 bytes"
|
|
],
|
|
"phases": [
|
|
"a lid camera snapshot",
|
|
"a head camera snapshot"
|
|
],
|
|
"result": {
|
|
"head_ok": true,
|
|
"lamp_idle": 236,
|
|
"lid_ok": true,
|
|
"sensor": "OV5648"
|
|
},
|
|
"shots": {
|
|
"head": {
|
|
"bytes": 57960,
|
|
"jpeg": true,
|
|
"status": 200
|
|
},
|
|
"lid": {
|
|
"bytes": 89809,
|
|
"jpeg": true,
|
|
"status": 200
|
|
}
|
|
},
|
|
"started": true
|
|
},
|
|
"fingerprint": "d5bd75037a73b4b11d6bb9747906ba2ac9d9e256c4cf2f376e18f15a7b8ed815",
|
|
"image": "20260919202327 (dev)",
|
|
"log": [
|
|
"20:37:29 start setup.check-cameras (operator, api) in campaign c-20260919202934-3d3a",
|
|
"20:37:30 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
|
|
"20:37:30 fixture: <REDACTED-1> at <IP-1> covers lid, interlock, button",
|
|
"20:37:30 fixture: running unattended (no prompt can be answered)",
|
|
"20:37:30 queued by the unattended queue opened 2026-09-19T20:29:34Z",
|
|
"20:37:30 baseline: pre: clean",
|
|
"20:37:30 ACT lid close (fixture)",
|
|
"20:37:30 ACT lid close: done after 0.0 s",
|
|
"20:37:30 POST /wiz/cameras/start -> 200 {'started': True, 'id': 'cameras'}",
|
|
"20:37:31 cameras: a lid camera snapshot",
|
|
"20:37:31 prompt lid-view (confirm): This is the lid camera. Can you see the bed?",
|
|
"20:37:32 cameras: a head camera snapshot",
|
|
"20:37:32 prompt head-view (confirm): This is the head camera. Can you see the bed under the lens?",
|
|
"20:37:33 cameras: OV5648, lid 89809 bytes, head 57960 bytes",
|
|
"20:37:43 baseline: post: clean",
|
|
"20:37:43 result PASS"
|
|
],
|
|
"manifest_sha": "2d41354cdfb037d942fbe328e2ae0594efadd92e976d1c4512ca461b5f864a7e",
|
|
"message": "",
|
|
"result": "PASS",
|
|
"test": "setup.check-cameras",
|
|
"ts": "2026-09-19T20:37:43Z"
|
|
},
|
|
"requires": [
|
|
"forgectrl.auth",
|
|
"camera.snapshot"
|
|
],
|
|
"satisfied": true,
|
|
"source_sha": "cd8e8937af35b7b29e55fe470498ae9faa2e118f9b74cb4100bb737fb7808fcb",
|
|
"subsystem": "setup",
|
|
"title": "The cameras check captures both cameras"
|
|
},
|
|
{
|
|
"always": false,
|
|
"covers": [
|
|
[
|
|
"forgectrl",
|
|
"src/wizdark.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/wizcalc.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/wiz.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/setup.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/main.c"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/ui/wizard.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/super.c"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/liveness.c"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/lenshome.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/accel.c"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/cool.c"
|
|
]
|
|
],
|
|
"fingerprint": "b4d07d16e774b8e7d944553645abee6fc15164e2e36b76f1881ab16c58442519",
|
|
"hardware": "takeover",
|
|
"id": "setup.check-motion",
|
|
"inherited": true,
|
|
"kind": "auto",
|
|
"record": {
|
|
"answers": [],
|
|
"campaign": "c-20260919202934-3d3a",
|
|
"duration_s": 20,
|
|
"evidence": {
|
|
"baseline": {
|
|
"post": [],
|
|
"pre": []
|
|
},
|
|
"batch": {
|
|
"group": "unattended",
|
|
"ts": "2026-09-19T20:29:34Z"
|
|
},
|
|
"elapsed_s": 20.1,
|
|
"error": "",
|
|
"fixture": {
|
|
"channels": [
|
|
"lid",
|
|
"interlock",
|
|
"button"
|
|
],
|
|
"hostname": "<REDACTED-1>",
|
|
"ip": "<IP-1>",
|
|
"released": []
|
|
},
|
|
"log": [
|
|
"00:06 liveness probe: head accel p2p x=2503 y=2124 (moving>=800 dead<=250)",
|
|
"00:07 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:14 at rest: accelerometer low-passed p2p x 207 y 323 (rms 163 118) over 179 samples",
|
|
"00:15 +X: accelerometer low-passed p2p x 1906 y 773 (rms 844 401, raw p2p 4110 3215, 203 sampl",
|
|
"00:16 -X: accelerometer low-passed p2p x 2395 y 988 (rms 861 433, raw p2p 5376 3029, 206 sampl",
|
|
"00:18 +Y: accelerometer low-passed p2p x 426 y 1269 (rms 216 407, raw p2p 1759 2854, 208 sampl",
|
|
"00:19 -Y: accelerometer low-passed p2p x 325 y 1462 (rms 209 436, raw p2p 1374 3079, 207 sampl"
|
|
],
|
|
"phases": [
|
|
"stopping the motion controller",
|
|
"rail up, the liveness probe",
|
|
"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",
|
|
"the lens finds its reference on the hall sensor: pass 4 of 5",
|
|
"the lens finds its reference on the hall sensor: pass 5 of 5",
|
|
"starting the controller in loopback posture",
|
|
"jog +X",
|
|
"jog -X",
|
|
"jog +Y",
|
|
"jog -Y"
|
|
],
|
|
"result": {
|
|
"moves": {
|
|
"+X": {
|
|
"crash_event": false,
|
|
"p2p_lp_x": 1906,
|
|
"p2p_lp_y": 773,
|
|
"p2p_x": 4110,
|
|
"p2p_y": 3215,
|
|
"rms_x": 844.0,
|
|
"rms_y": 401.0,
|
|
"samples": 203,
|
|
"witnessed": true
|
|
},
|
|
"+Y": {
|
|
"crash_event": false,
|
|
"p2p_lp_x": 426,
|
|
"p2p_lp_y": 1269,
|
|
"p2p_x": 1759,
|
|
"p2p_y": 2854,
|
|
"rms_x": 216.0,
|
|
"rms_y": 407.0,
|
|
"samples": 208,
|
|
"witnessed": true
|
|
},
|
|
"-X": {
|
|
"crash_event": false,
|
|
"p2p_lp_x": 2395,
|
|
"p2p_lp_y": 988,
|
|
"p2p_x": 5376,
|
|
"p2p_y": 3029,
|
|
"rms_x": 861.0,
|
|
"rms_y": 433.0,
|
|
"samples": 206,
|
|
"witnessed": true
|
|
},
|
|
"-Y": {
|
|
"crash_event": false,
|
|
"p2p_lp_x": 325,
|
|
"p2p_lp_y": 1462,
|
|
"p2p_x": 1374,
|
|
"p2p_y": 3079,
|
|
"rms_x": 209.0,
|
|
"rms_y": 436.0,
|
|
"samples": 207,
|
|
"witnessed": true
|
|
}
|
|
},
|
|
"probe": "head accel p2p x=2503 y=2124 (moving>=800 dead<=250)",
|
|
"rail": "up",
|
|
"rest": {
|
|
"p2p_lp_x": 207,
|
|
"p2p_lp_y": 323,
|
|
"p2p_x": 977,
|
|
"p2p_y": 698,
|
|
"rms_x": 163.0,
|
|
"rms_y": 118.0,
|
|
"samples": 179
|
|
},
|
|
"z_passes": [
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0
|
|
],
|
|
"z_referenced": true
|
|
},
|
|
"started": true
|
|
},
|
|
"fingerprint": "b4d07d16e774b8e7d944553645abee6fc15164e2e36b76f1881ab16c58442519",
|
|
"image": "20260919202327 (dev)",
|
|
"log": [
|
|
"20:37:58 start setup.check-motion (auto, takeover) in campaign c-20260919202934-3d3a",
|
|
"20:37:58 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
|
|
"20:37:58 fixture: <REDACTED-1> at <IP-1> covers lid, interlock, button",
|
|
"20:37:58 queued by the unattended queue opened 2026-09-19T20:29:34Z",
|
|
"20:37:59 baseline: pre: clean",
|
|
"20:37:59 NOTICE: The head moves 50 mm each way on X and on Y. Keep the bed clear.",
|
|
"20:37:59 POST /wiz/motion/start -> 200 {'started': True, 'id': 'motion'}",
|
|
"20:37:59 motion: stopping the motion controller",
|
|
"20:38:00 motion: rail up, the liveness probe",
|
|
"20:38:06 motion: the lens finds its reference on the hall sensor: pass 1 of 5",
|
|
"20:38:07 motion: the lens finds its reference on the hall sensor: pass 2 of 5",
|
|
"20:38:08 motion: the lens finds its reference on the hall sensor: pass 3 of 5",
|
|
"20:38:10 motion: the lens finds its reference on the hall sensor: pass 4 of 5",
|
|
"20:38:11 motion: the lens finds its reference on the hall sensor: pass 5 of 5",
|
|
"20:38:12 motion: starting the controller in loopback posture",
|
|
"20:38: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.",
|
|
"20:38:13 motion: jog +X",
|
|
"20:38:15 motion: jog -X",
|
|
"20:38:16 motion: jog +Y",
|
|
"20:38:17 motion: jog -Y",
|
|
"20:38:19 motion: probe 'head accel p2p x=2503 y=2124 (moving>=800 dead<=250)', passes [0, 0, 0, 0, 0], rest {'samples': 179, 'p2p_lp_x': 207, 'p2p_lp_y': 323, 'p2p_x': 977, 'p2p_y': 698, 'rms_x': 163.0, 'rms_y': 118.0}, moves {'+X': (1906, 773), '-X': (2395, 988), '+Y': (426, 1269), '-Y': (325, 1462)}",
|
|
"20:38:19 baseline: post: clean",
|
|
"20:38:19 result PASS"
|
|
],
|
|
"manifest_sha": "2d41354cdfb037d942fbe328e2ae0594efadd92e976d1c4512ca461b5f864a7e",
|
|
"message": "",
|
|
"result": "PASS",
|
|
"test": "setup.check-motion",
|
|
"ts": "2026-09-19T20:38:19Z"
|
|
},
|
|
"requires": [
|
|
"forgectrl.auth",
|
|
"motion.pacing"
|
|
],
|
|
"satisfied": true,
|
|
"source_sha": "fabc9896bfc2270430774200e8beb7275ea485bf4ff822b0c37f7f85067f1b4b",
|
|
"subsystem": "setup",
|
|
"title": "The motion check proves the rail, the lens reference, and the jogs"
|
|
},
|
|
{
|
|
"always": false,
|
|
"covers": [
|
|
[
|
|
"forgectrl",
|
|
"src/wizdark.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/wizcalc.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/wiz.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/setup.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/main.c"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/ui/wizard.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/diag.c"
|
|
]
|
|
],
|
|
"fingerprint": "89f5b758608b0a9297a612e43d15d20c172006f9356a2f7b60d3b69a05669ecd",
|
|
"hardware": "takeover",
|
|
"id": "setup.check-flow-verify",
|
|
"inherited": true,
|
|
"kind": "auto",
|
|
"record": {
|
|
"answers": [],
|
|
"campaign": "c-20260919202934-3d3a",
|
|
"duration_s": 185,
|
|
"evidence": {
|
|
"baseline": {
|
|
"post": [],
|
|
"pre": []
|
|
},
|
|
"batch": {
|
|
"group": "unattended",
|
|
"ts": "2026-09-19T20:29:34Z"
|
|
},
|
|
"elapsed_s": 185.0,
|
|
"error": "",
|
|
"fixture": {
|
|
"channels": [
|
|
"lid",
|
|
"interlock",
|
|
"button"
|
|
],
|
|
"hostname": "<REDACTED-1>",
|
|
"ip": "<IP-1>",
|
|
"released": []
|
|
},
|
|
"log": [],
|
|
"phases": [
|
|
"the flow check: settling the loop",
|
|
"settling before trial 1/1 (pump on)",
|
|
"trial 1/1: heater 40% for 50 s (pump on)",
|
|
"settling before trial 1/1 (pump off)",
|
|
"trial 1/1: heater 40% for 50 s (pump off)"
|
|
],
|
|
"result": {
|
|
"flow_dt": 10.4,
|
|
"flow_rise": 11.3,
|
|
"margin_flow": 3.2,
|
|
"margin_noflow": 3.3,
|
|
"noflow_dt": 11.9,
|
|
"noflow_rise": 17.8,
|
|
"pass": true,
|
|
"thin_margin": false,
|
|
"threshold": 14.5
|
|
},
|
|
"started": true
|
|
},
|
|
"fingerprint": "89f5b758608b0a9297a612e43d15d20c172006f9356a2f7b60d3b69a05669ecd",
|
|
"image": "20260919202327 (dev)",
|
|
"log": [
|
|
"20:42:37 start setup.check-flow-verify (auto, takeover) in campaign c-20260919202934-3d3a",
|
|
"20:42:37 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
|
|
"20:42:37 fixture: <REDACTED-1> at <IP-1> covers lid, interlock, button",
|
|
"20:42:37 queued by the unattended queue opened 2026-09-19T20:29:34Z",
|
|
"20:42:38 baseline: pre: clean",
|
|
"20:42:38 POST /wiz/cooling.flow-verify/start -> 200 {'started': True, 'id': 'cooling.flow-verify'}",
|
|
"20:42:38 cooling.flow-verify: the flow check: settling the loop",
|
|
"20:42:39 cooling.flow-verify: settling before trial 1/1 (pump on)",
|
|
"20:43:09 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
|
|
"20:43:20 cooling.flow-verify: trial 1/1: heater 40% for 50 s (pump on)",
|
|
"20:43:40 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
|
|
"20:44:11 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
|
|
"20:44:13 cooling.flow-verify: settling before trial 1/1 (pump off)",
|
|
"20:44:42 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
|
|
"20:44:49 cooling.flow-verify: trial 1/1: heater 40% for 50 s (pump off)",
|
|
"20:45:12 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
|
|
"20:45:43 flow check: threshold 14.5, flow 11.3, no-flow 17.8, thin False",
|
|
"20:45:43 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
|
|
"20:45:43 baseline: post: clean",
|
|
"20:45:43 result PASS"
|
|
],
|
|
"manifest_sha": "2d41354cdfb037d942fbe328e2ae0594efadd92e976d1c4512ca461b5f864a7e",
|
|
"message": "",
|
|
"result": "PASS",
|
|
"test": "setup.check-flow-verify",
|
|
"ts": "2026-09-19T20:45:43Z"
|
|
},
|
|
"requires": [
|
|
"forgectrl.auth",
|
|
"cooling.aa-offset-calibrate",
|
|
"cooling.flow-verify"
|
|
],
|
|
"satisfied": true,
|
|
"source_sha": "679031b0fa029aafd44c86f7bc2cade9e25871ed8818cd4e7959fb5555735452",
|
|
"subsystem": "setup",
|
|
"title": "The flow check runs as a setup check"
|
|
},
|
|
{
|
|
"always": false,
|
|
"covers": [
|
|
[
|
|
"forgectrl",
|
|
"src/wizdark.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/wizcalc.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/wiz.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/setup.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/main.c"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/ui/wizard.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/super.c"
|
|
],
|
|
[
|
|
"python3-gfhardware",
|
|
"gfhardware/machine.py"
|
|
],
|
|
[
|
|
"python3-gfhardware",
|
|
"forgefirm-app/gfcloud.py"
|
|
],
|
|
[
|
|
"python3-gfhardware",
|
|
"forgefirm-app/ffmachine.py"
|
|
]
|
|
],
|
|
"fingerprint": "9330cdc1f0b1760a2064265a376044cb1c25b1a38c7e1dbe51d9e4f6d307c3da",
|
|
"hardware": "takeover",
|
|
"id": "setup.cloud-header-capture",
|
|
"inherited": true,
|
|
"kind": "operator",
|
|
"record": {
|
|
"answers": [],
|
|
"campaign": "c-20260919210959-8780",
|
|
"duration_s": 62,
|
|
"evidence": {
|
|
"baseline": {
|
|
"post": [],
|
|
"pre": []
|
|
},
|
|
"batch": {
|
|
"group": "attended",
|
|
"ts": "2026-09-19T21:21:02Z"
|
|
},
|
|
"elapsed_s": 61.4,
|
|
"error": "",
|
|
"fixture": {
|
|
"channels": [
|
|
"lid",
|
|
"interlock",
|
|
"button"
|
|
],
|
|
"hostname": "<REDACTED-1>",
|
|
"ip": "<IP-1>",
|
|
"released": []
|
|
},
|
|
"kept": [
|
|
"AAfc",
|
|
"AAid",
|
|
"AAin",
|
|
"AAix",
|
|
"AArd",
|
|
"AArn",
|
|
"AArx",
|
|
"AAsn",
|
|
"AAsx",
|
|
"AAwd",
|
|
"AAwn",
|
|
"AAwx",
|
|
"CFrh",
|
|
"CMin",
|
|
"CMix",
|
|
"CMrn",
|
|
"CMrx",
|
|
"CMts",
|
|
"CMwn",
|
|
"CMwx",
|
|
"EFid",
|
|
"EFin",
|
|
"EFix",
|
|
"EFrd",
|
|
"EFrn",
|
|
"EFrx",
|
|
"EFwd",
|
|
"EFwn",
|
|
"EFwx",
|
|
"HAai",
|
|
"HAar",
|
|
"HAsi",
|
|
"HAsr",
|
|
"HAxi",
|
|
"HAxr",
|
|
"HAyi",
|
|
"HAyr",
|
|
"HAzi",
|
|
"HAzr",
|
|
"IFid"
|
|
],
|
|
"log": [
|
|
"00:57 factory envelope captured: 134 tags, 57 calibration-bearing"
|
|
],
|
|
"mode": {
|
|
"detail": "grbl mode up",
|
|
"found": "cloud",
|
|
"needs": "grbl",
|
|
"ok": true,
|
|
"switched": true
|
|
},
|
|
"phases": [
|
|
"starting the cloud client",
|
|
"waiting for the print's header from the service",
|
|
"the cloud client cancels the print",
|
|
"back to GRBL mode"
|
|
],
|
|
"result": {
|
|
"calibration_tags": {
|
|
"AAfc": 3632880242,
|
|
"AAid": 204,
|
|
"AAin": 0,
|
|
"AAix": 0,
|
|
"AArd": 1023,
|
|
"AArn": 0,
|
|
"AArx": 64500,
|
|
"AAsn": 0,
|
|
"AAsx": 0,
|
|
"AAwd": 1023,
|
|
"AAwn": 0,
|
|
"AAwx": 64500,
|
|
"CFrh": 1,
|
|
"CMin": 10000,
|
|
"CMix": 50000,
|
|
"CMrn": 5000,
|
|
"CMrx": 33000,
|
|
"CMts": 0,
|
|
"CMwn": 7000,
|
|
"CMwx": 31000,
|
|
"EFid": 0,
|
|
"EFin": 0,
|
|
"EFix": 0,
|
|
"EFrd": 65535,
|
|
"EFrn": 0,
|
|
"EFrx": 0,
|
|
"EFwd": 65535,
|
|
"EFwn": 0,
|
|
"EFwx": 0,
|
|
"HAai": 0,
|
|
"HAar": 0,
|
|
"HAsi": 2,
|
|
"HAsr": 4,
|
|
"HAxi": 0,
|
|
"HAxr": 132,
|
|
"HAyi": 0,
|
|
"HAyr": 112,
|
|
"HAzi": 0,
|
|
"HAzr": 0,
|
|
"IFid": 0,
|
|
"IFin": 0,
|
|
"IFix": 0,
|
|
"IFrd": 43278,
|
|
"IFrn": 0,
|
|
"IFrx": 0,
|
|
"IFwd": 43278,
|
|
"IFwn": 0,
|
|
"IFwx": 0,
|
|
"XSdm": 1,
|
|
"XShc": 33,
|
|
"XSmm": 8,
|
|
"XSrc": 135,
|
|
"YSdm": 1,
|
|
"YShc": 5,
|
|
"YSmm": 8,
|
|
"YSrc": 22,
|
|
"ZSmd": 0
|
|
},
|
|
"captured": "2026-09-19T21:23:39Z",
|
|
"job_id": 1586918845,
|
|
"limits": {
|
|
"air_assist_min_rpm": 116,
|
|
"coolant_max_c": 33.0,
|
|
"coolant_min_c": 5.0
|
|
},
|
|
"machine": {
|
|
"cool_accel_x_alert": {
|
|
"default": 132.0,
|
|
"local": ""
|
|
},
|
|
"cool_accel_y_alert": {
|
|
"default": 112.0,
|
|
"local": ""
|
|
},
|
|
"cool_fire_q1_alert": {
|
|
"default": 275.0,
|
|
"local": ""
|
|
},
|
|
"cool_fire_q2_alert": {
|
|
"default": 374.0,
|
|
"local": ""
|
|
},
|
|
"cool_flow_rise": {
|
|
"default": 14.4,
|
|
"local": "14.5"
|
|
},
|
|
"cool_purge_min_current": {
|
|
"default": 300.0,
|
|
"local": "345"
|
|
},
|
|
"cool_tach_air_assist_min_rpm": {
|
|
"default": 6000.0,
|
|
"local": "6093"
|
|
},
|
|
"cool_tach_exhaust_min_rpm": {
|
|
"default": 6400.0,
|
|
"local": "6416"
|
|
},
|
|
"cool_tach_intake_min_rpm": {
|
|
"default": 2290.0,
|
|
"local": "2277"
|
|
},
|
|
"cool_temp_max": {
|
|
"default": 33.0,
|
|
"local": ""
|
|
},
|
|
"cool_temp_min": {
|
|
"default": 5.0,
|
|
"local": ""
|
|
}
|
|
},
|
|
"tag_count": 134
|
|
},
|
|
"settings_before": {
|
|
"cloud_enabled": "1",
|
|
"controller_mode": "grbl",
|
|
"homing_mode": "gfcloud"
|
|
},
|
|
"started": true
|
|
},
|
|
"fingerprint": "9330cdc1f0b1760a2064265a376044cb1c25b1a38c7e1dbe51d9e4f6d307c3da",
|
|
"image": "20260919210531 (dev)",
|
|
"log": [
|
|
"21:22:41 start setup.cloud-header-capture (operator, takeover) in campaign c-20260919210959-8780",
|
|
"21:22:41 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
|
|
"21:22:41 fixture: <REDACTED-1> at <IP-1> covers lid, interlock, button",
|
|
"21:22:41 queued by the attended queue opened 2026-09-19T21:21:02Z",
|
|
"21:22:41 baseline: pre: clean",
|
|
"21:22:41 baseline: switching to grbl mode (found cloud, controller running)",
|
|
"21:22:42 baseline: /mode controller=running motion=verified",
|
|
"21:22:42 mode: test needs grbl - grbl mode up",
|
|
"21:22:42 NOTICE: Print any small design from the Glowforge app once it shows the machine online. Do not press the machine's button.",
|
|
"21:22:42 POST /wiz/cloud.header/start -> 200 {'started': True, 'id': 'cloud.header'}",
|
|
"21:22:43 cloud.header: starting the cloud client",
|
|
"21:22:47 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:22:48 cloud.header: waiting for the print's header from the service",
|
|
"21:23:14 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
|
|
"21:23:40 cloud.header: the cloud client cancels the print",
|
|
"21:23:43 cloud.header: back to GRBL mode",
|
|
"21:23:44 header: 134 tags, 57 kept; job 1586918845",
|
|
"21:23:44 restore cloud_enabled='1' -> 200",
|
|
"21:23:44 restore homing_mode='gfcloud' -> 200",
|
|
"21:23:44 restore controller_mode='grbl' -> 200",
|
|
"21:23:44 baseline: post: clean",
|
|
"21:23:44 result PASS"
|
|
],
|
|
"manifest_sha": "5221f3466ae2497ca49fbb8cbe5d4eff49fab0f8c627190416aa2320948f69c4",
|
|
"message": "",
|
|
"result": "PASS",
|
|
"test": "setup.cloud-header-capture",
|
|
"ts": "2026-09-19T21:23:44Z"
|
|
},
|
|
"requires": [
|
|
"forgectrl.auth",
|
|
"cloud.mode-switch"
|
|
],
|
|
"satisfied": true,
|
|
"source_sha": "29b1611400bb6f6a3ef4b559911834cd18bfe4e5e9724d7e055ce2e1aab312c0",
|
|
"subsystem": "setup",
|
|
"title": "The cloud header check takes one print's envelope"
|
|
},
|
|
{
|
|
"always": false,
|
|
"covers": [
|
|
[
|
|
"forgectrl",
|
|
"src/wizlive.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/wizrun.h"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/lens.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/sheet.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/font_hershey.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/jobstream.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/curverec.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/wizdark.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/wiz.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/setup.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/main.c"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/ui/wizard.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/super.c"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/status.c"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/cool.c"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/accel.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/wizcalc.*"
|
|
],
|
|
[
|
|
"grblhal-glowforge",
|
|
"src/glowforge_laser.c"
|
|
],
|
|
[
|
|
"grblhal-glowforge",
|
|
"src/glowforge_status.c"
|
|
],
|
|
[
|
|
"grblhal-glowforge",
|
|
"src/glowforge_homing.*"
|
|
],
|
|
[
|
|
"grblhal-glowforge",
|
|
"src/glowforge_io.*"
|
|
]
|
|
],
|
|
"fingerprint": "ad5179ae308fa1a4a7a681c9f2586c64410f329a3c6da1c79cd38ca4b341da0d",
|
|
"hardware": "takeover",
|
|
"id": "setup.sheet",
|
|
"inherited": true,
|
|
"kind": "live",
|
|
"record": {
|
|
"answers": [],
|
|
"campaign": "c-20260919210959-8780",
|
|
"duration_s": 723,
|
|
"evidence": {
|
|
"actions": [
|
|
{
|
|
"by": "operator",
|
|
"channel": "button",
|
|
"state": "presence",
|
|
"took_s": 7.02,
|
|
"ts": "2026-09-19T21:24:34Z"
|
|
},
|
|
{
|
|
"by": "fixture",
|
|
"channel": "button",
|
|
"state": "arm",
|
|
"ts": "2026-09-19T21:24:52Z"
|
|
},
|
|
{
|
|
"by": "fixture",
|
|
"channel": "button",
|
|
"state": "arm",
|
|
"ts": "2026-09-19T21:26:53Z"
|
|
},
|
|
{
|
|
"by": "fixture",
|
|
"channel": "button",
|
|
"state": "arm",
|
|
"ts": "2026-09-19T21:28:00Z"
|
|
},
|
|
{
|
|
"by": "fixture",
|
|
"channel": "button",
|
|
"state": "arm",
|
|
"ts": "2026-09-19T21:29:46Z"
|
|
},
|
|
{
|
|
"by": "fixture",
|
|
"channel": "button",
|
|
"state": "arm",
|
|
"ts": "2026-09-19T21:32:12Z"
|
|
},
|
|
{
|
|
"by": "fixture",
|
|
"channel": "button",
|
|
"state": "arm",
|
|
"ts": "2026-09-19T21:34:03Z"
|
|
}
|
|
],
|
|
"baseline": {
|
|
"post": [],
|
|
"pre": []
|
|
},
|
|
"batch": {
|
|
"group": "attended",
|
|
"ts": "2026-09-19T21:21:02Z"
|
|
},
|
|
"cards": {
|
|
"cooling.flow-load": {
|
|
"elapsed_s": 213.7,
|
|
"emission": {
|
|
"hv_max": 1023,
|
|
"laser_on_samples": 216,
|
|
"lit_s": 90.46365566899999,
|
|
"thermopile_delta": 1073
|
|
},
|
|
"error": "",
|
|
"log": [
|
|
"00:02 lens reference pass 1: 0",
|
|
"00:03 lens reference pass 2: 0",
|
|
"01:06 the coolant loop is quiet after 60 s (downstream 22.54 C)",
|
|
"03:33 the downstream peak has passed (2.62 C over the baseline, 46 s dark): the tail ends here",
|
|
"03:33 streamed 220 lines; tube current peak 1023, LASER_ON samples 216, thermopile +1073",
|
|
"03:33 lit 66 s, dose 36694 raw-s, rise 1.76 C at 90 s: k 4.78e-05 C per raw-s"
|
|
],
|
|
"phases": [
|
|
"the tube is dark: the coolant sensors follow the heat, 66 s more",
|
|
"the tube is dark: the coolant sensors follow the heat, 64 s more",
|
|
"the tube is dark: the coolant sensors follow the heat, 63 s more",
|
|
"the tube is dark: the coolant sensors follow the heat, 62 s more",
|
|
"the tube is dark: the coolant sensors follow the heat, 61 s more",
|
|
"the tube is dark: the coolant sensors follow the heat, 60 s more",
|
|
"the tube is dark: the coolant sensors follow the heat, 59 s more",
|
|
"the tube is dark: the coolant sensors follow the heat, 58 s more",
|
|
"the tube is dark: the coolant sensors follow the heat, 57 s more",
|
|
"the tube is dark: the coolant sensors follow the heat, 56 s more",
|
|
"the tube is dark: the coolant sensors follow the heat, 55 s more",
|
|
"the tube is dark: the pulse engine plays the rest"
|
|
],
|
|
"preview_bytes": 3258,
|
|
"program_lines": 217,
|
|
"result": {
|
|
"base_c": 22.97470588235294,
|
|
"dose_raw_s": 36693.75999999997,
|
|
"emission": {
|
|
"hv_max": 1023,
|
|
"laser_on_samples": 216,
|
|
"lit_s": 90.46365566899999,
|
|
"thermopile_delta": 1073
|
|
},
|
|
"hv_mean": 554.0875603864735,
|
|
"k_cw": 6.212507931024212e-05,
|
|
"k_density": 4.7836311068886437e-05,
|
|
"lag_s": 80.0,
|
|
"lit_s": 66.2,
|
|
"peak_c": 1.7552941176470611,
|
|
"summary": "The tube was lit for 66 s and warmed the coolant by 1.76 C, peaking 90 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": 90.0,
|
|
"up_base_c": 23.236470588235296,
|
|
"z_passes": [
|
|
0,
|
|
0
|
|
]
|
|
},
|
|
"started": true
|
|
},
|
|
"laser.corner": {
|
|
"elapsed_s": 50.5,
|
|
"emission": {
|
|
"hv_max": 1023,
|
|
"laser_on_samples": 142,
|
|
"lit_s": 30.91368981200003,
|
|
"thermopile_delta": 759
|
|
},
|
|
"error": "",
|
|
"log": [
|
|
"00:02 lens reference pass 1: 0",
|
|
"00:02 lens reference pass 2: 0",
|
|
"00:29 corner gamma 1.00: the next pattern",
|
|
"00:33 corner gamma 1.25: the next pattern",
|
|
"00:35 corner gamma 1.50: the next pattern",
|
|
"00:38 corner gamma 1.75: the next pattern",
|
|
"00:41 corner gamma 2.00: the next pattern",
|
|
"00:49 streamed 468 lines; tube current peak 1023, LASER_ON samples 142, thermopile +759",
|
|
"00:49 corner rolloff gamma 1.50"
|
|
],
|
|
"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",
|
|
"burning: 0 s lit",
|
|
"burning: 1 s lit",
|
|
"burning: the tube is between passes",
|
|
"burning: 0 s lit",
|
|
"burning: the tube is between passes",
|
|
"the tube is dark: the pulse engine plays the rest"
|
|
],
|
|
"preview_bytes": 6391,
|
|
"program_lines": 465,
|
|
"result": {
|
|
"emission": {
|
|
"hv_max": 1023,
|
|
"laser_on_samples": 142,
|
|
"lit_s": 30.91368981200003,
|
|
"thermopile_delta": 759
|
|
},
|
|
"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.",
|
|
"z_passes": [
|
|
0,
|
|
0
|
|
]
|
|
},
|
|
"started": true
|
|
},
|
|
"laser.dose-curve": {
|
|
"elapsed_s": 146.3,
|
|
"emission": {
|
|
"hv_max": 1023,
|
|
"laser_on_samples": 255,
|
|
"lit_s": 110.95465894099993,
|
|
"thermopile_delta": 2273
|
|
},
|
|
"error": "",
|
|
"log": [
|
|
"00:03 lens reference pass 1: 0",
|
|
"00:04 lens reference pass 2: 0",
|
|
"00:27 the floor and the dose curve are off from here",
|
|
"02:25 streamed 391 lines; tube current peak 1023, LASER_ON samples 255, thermopile +2273",
|
|
"02:25 dose curve 10:0.18,20:2.97,30:10.96,45:28.84,60:42.13,80:54.80,100:100.00"
|
|
],
|
|
"phases": [
|
|
"the tube is dark: the fit needs the dark tail, 10 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",
|
|
"the tube is dark: the fit needs the dark tail, 6 s more",
|
|
"the tube is dark: the fit needs the dark tail, 5 s more",
|
|
"the tube is dark: the fit needs the dark tail, 4 s more",
|
|
"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 machine goes back to its normal posture"
|
|
],
|
|
"preview_bytes": 5722,
|
|
"program_lines": 389,
|
|
"result": {
|
|
"curve": "10:0.18,20:2.97,30:10.96,45:28.84,60:42.13,80:54.80,100:100.00",
|
|
"emission": {
|
|
"hv_max": 1023,
|
|
"laser_on_samples": 255,
|
|
"lit_s": 110.95465894099993,
|
|
"thermopile_delta": 2273
|
|
},
|
|
"points": [
|
|
{
|
|
"density": 10.0,
|
|
"light": 0.17631079409289807
|
|
},
|
|
{
|
|
"density": 20.0,
|
|
"light": 2.9723855358717444
|
|
},
|
|
{
|
|
"density": 30.0,
|
|
"light": 10.964784936276038
|
|
},
|
|
{
|
|
"density": 45.0,
|
|
"light": 28.836116889274283
|
|
},
|
|
{
|
|
"density": 60.0,
|
|
"light": 42.132577556091086
|
|
},
|
|
{
|
|
"density": 80.0,
|
|
"light": 54.80488188475965
|
|
},
|
|
{
|
|
"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.2 percent of the light, 45 gives 29, and 100 gives 100. The chart shows the fit.",
|
|
"z_passes": [
|
|
0,
|
|
0
|
|
]
|
|
},
|
|
"started": true
|
|
},
|
|
"laser.floor": {
|
|
"elapsed_s": 105.1,
|
|
"emission": {
|
|
"hv_max": 1023,
|
|
"laser_on_samples": 146,
|
|
"lit_s": 90.95120146800014,
|
|
"thermopile_delta": 767
|
|
},
|
|
"error": "",
|
|
"log": [
|
|
"00:02 lens reference pass 1: 0",
|
|
"00:03 lens reference pass 2: 0",
|
|
"00:25 the floor and the dose curve are off from here",
|
|
"01:44 streamed 421 lines; tube current peak 1023, LASER_ON samples 146, thermopile +767",
|
|
"01:44 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: 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: 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,
|
|
"program_lines": 418,
|
|
"result": {
|
|
"emission": {
|
|
"hv_max": 1023,
|
|
"laser_on_samples": 146,
|
|
"lit_s": 90.95120146800014,
|
|
"thermopile_delta": 767
|
|
},
|
|
"faintest_density": 8.0,
|
|
"floor_density": 10.0,
|
|
"summary": "The faintest rung with a continuous line is 8 percent density. The laser floor is set at 10 percent, two above it: no job asks the tube for less, so the lightest engraving still marks this wood.",
|
|
"z_passes": [
|
|
0,
|
|
0
|
|
]
|
|
},
|
|
"started": true
|
|
},
|
|
"laser.focus": {
|
|
"elapsed_s": 93.8,
|
|
"emission": {
|
|
"hv_max": 1023,
|
|
"laser_on_samples": 234,
|
|
"lit_s": 47.6316887590001,
|
|
"thermopile_delta": 1409
|
|
},
|
|
"error": "",
|
|
"log": [
|
|
"00:02 lens reference pass 1: 0",
|
|
"00:04 lens reference pass 2: 0",
|
|
"00:17 bottom ring 1-15 (x100): 70 224 75 188 81 150 75 173 83 216 59 202 77 220 46",
|
|
"00:17 bottom ring 16-16 (x100): 72",
|
|
"00:17 the bottom stop: the ring died 16 half-steps below the edge",
|
|
"00:24 top ring 1-15 (x100): 56 178 35 170 46 202 30 182 41 199 33 176 38 207 42",
|
|
"00:24 top ring 16-24 (x100): 193 39 216 33 264 41 94 31 24",
|
|
"00:24 the top stop: the ring died 24 half-steps above the edge",
|
|
"00:30 the lens window: 14 half-steps below the reference, 22 above (the stops found), written ",
|
|
"01:31 streamed 297 lines; tube current peak 1023, LASER_ON samples 234, thermopile +1409",
|
|
"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: 0 s lit",
|
|
"burning: 1 s lit",
|
|
"burning: the tube is between passes",
|
|
"burning: 1 s lit",
|
|
"burning: 2 s lit",
|
|
"burning: 0 s lit",
|
|
"burning: 1 s lit",
|
|
"burning: the tube is between passes",
|
|
"burning: 0 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,
|
|
"program_lines": 294,
|
|
"result": {
|
|
"edge_z_mm": 6.939544832306639,
|
|
"emission": {
|
|
"hv_max": 1023,
|
|
"laser_on_samples": 234,
|
|
"lit_s": 47.6316887590001,
|
|
"thermopile_delta": 1409
|
|
},
|
|
"focus_range_mm": {
|
|
"max": 14.468634496919918,
|
|
"min": 2.148305954825462
|
|
},
|
|
"ladder_z": [
|
|
10.879089664613279,
|
|
9.85239561943874,
|
|
8.48347022587269,
|
|
7.456776180698151,
|
|
6.430082135523614,
|
|
5.403388090349075,
|
|
4.0344626967830255,
|
|
3.0077686516084876,
|
|
1.9810746064339495,
|
|
0.9543805612594114,
|
|
-0.41454483230663897,
|
|
-1.4412388774811773
|
|
],
|
|
"max_height_mm": 14.468634496919918,
|
|
"pick": 11.0,
|
|
"pick_half_steps": -11.0,
|
|
"picked_lines": [
|
|
11,
|
|
11
|
|
],
|
|
"steps_per_mm": 2.922,
|
|
"stops": {
|
|
"above": 22,
|
|
"below": 14,
|
|
"contact_above": 24,
|
|
"contact_below": 16,
|
|
"found": true,
|
|
"why": ""
|
|
},
|
|
"summary": "Line 11 on 0.125 in: with the lens on its hall reference the focus is 0.273 in above the tray. A home puts the lens there, sets Z to that height, and parks the focus at the park height; Z counts the focus height above the bed. The stops were found 14 half-steps below the reference and 22 above, so the lens reaches 0.085 in to 0.570 in. Every later card runs at the focus for this sheet.",
|
|
"thickness_mm": 3.175,
|
|
"window": {
|
|
"above": 22,
|
|
"below": 14,
|
|
"reach_max": 10.879089664613279,
|
|
"reach_min": -1.4412388774811773
|
|
},
|
|
"z_passes": [
|
|
0,
|
|
0
|
|
]
|
|
},
|
|
"started": true
|
|
},
|
|
"sheet.frame": {
|
|
"elapsed_s": 93.9,
|
|
"emission": {
|
|
"hv_max": 1023,
|
|
"laser_on_samples": 150,
|
|
"lit_s": 76.28978926900004,
|
|
"thermopile_delta": 928
|
|
},
|
|
"error": "",
|
|
"log": [
|
|
"00:02 lens reference pass 1: 0",
|
|
"00:03 lens reference pass 2: 0",
|
|
"01:32 streamed 1428 lines; tube current peak 1023, LASER_ON samples 150, thermopile +928"
|
|
],
|
|
"phases": [
|
|
"burning: the tube is between passes",
|
|
"burning: 0 s lit",
|
|
"burning: the tube is between passes",
|
|
"burning: 0 s lit",
|
|
"burning: the tube is between passes",
|
|
"burning: 0 s lit",
|
|
"burning: the tube is between passes",
|
|
"burning: 0 s lit",
|
|
"burning: the tube is between passes",
|
|
"burning: 0 s lit",
|
|
"burning: the tube is between passes",
|
|
"the tube is dark: the pulse engine plays the rest"
|
|
],
|
|
"preview_bytes": 20721,
|
|
"program_lines": 1425,
|
|
"result": {
|
|
"emission": {
|
|
"hv_max": 1023,
|
|
"laser_on_samples": 150,
|
|
"lit_s": 76.28978926900004,
|
|
"thermopile_delta": 928
|
|
},
|
|
"mark_feed": 3000,
|
|
"mark_s": 400,
|
|
"started": "2026-09-19 21:24Z",
|
|
"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,
|
|
0
|
|
]
|
|
},
|
|
"started": true
|
|
},
|
|
"sheet.place": {
|
|
"elapsed_s": 11.1,
|
|
"error": "",
|
|
"log": [
|
|
"00:02 lens reference pass 1: 0",
|
|
"00:03 lens reference pass 2: 0",
|
|
"00:10 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",
|
|
"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"
|
|
],
|
|
"result": {
|
|
"alone": false,
|
|
"origin_x": 0,
|
|
"origin_y": 0,
|
|
"origin_z": 0,
|
|
"steps_per_mm": {
|
|
"x": 213.33299,
|
|
"y": 213.33299,
|
|
"z": 2.922
|
|
},
|
|
"summary": "The origin is set at the head's position. The full sheet, 0.125 in thick. Every card is drawn from this point: do not move the sheet until the last card is done.",
|
|
"thickness_mm": 3.175,
|
|
"z_passes": [
|
|
0,
|
|
0
|
|
],
|
|
"z_referenced": true
|
|
},
|
|
"started": true
|
|
}
|
|
},
|
|
"fixture": {
|
|
"channels": [
|
|
"lid",
|
|
"interlock",
|
|
"button"
|
|
],
|
|
"hostname": "<REDACTED-1>",
|
|
"ip": "<IP-1>",
|
|
"released": []
|
|
},
|
|
"focus_window": {
|
|
"ladder_z": [
|
|
10.879089664613279,
|
|
9.85239561943874,
|
|
8.48347022587269,
|
|
7.456776180698151,
|
|
6.430082135523614,
|
|
5.403388090349075,
|
|
4.0344626967830255,
|
|
3.0077686516084876,
|
|
1.9810746064339495,
|
|
0.9543805612594114,
|
|
-0.41454483230663897,
|
|
-1.4412388774811773
|
|
],
|
|
"preview_bytes": 3966,
|
|
"program_lines": 294,
|
|
"program_z_after": {
|
|
"reach": [
|
|
2.15,
|
|
14.47
|
|
],
|
|
"stops_found": true,
|
|
"z": [
|
|
6.94,
|
|
14.47,
|
|
13.44,
|
|
12.07,
|
|
11.05,
|
|
10.02,
|
|
8.99,
|
|
7.62,
|
|
6.6,
|
|
5.57,
|
|
4.54,
|
|
3.18,
|
|
2.15,
|
|
6.94
|
|
]
|
|
},
|
|
"program_z_before": {
|
|
"reach": [
|
|
-0.07,
|
|
7.46
|
|
],
|
|
"stops_found": false,
|
|
"z": [
|
|
3.35,
|
|
7.46,
|
|
6.77,
|
|
6.09,
|
|
5.4,
|
|
4.72,
|
|
4.03,
|
|
3.35,
|
|
2.67,
|
|
1.98,
|
|
1.3,
|
|
0.61,
|
|
-0.07,
|
|
3.35
|
|
]
|
|
},
|
|
"settings": {
|
|
"lens_hall_edge_z_mm": "6.94",
|
|
"lens_stop_above_steps": "22",
|
|
"lens_stop_below_steps": "14"
|
|
},
|
|
"stops": {
|
|
"above": 22,
|
|
"below": 14,
|
|
"contact_above": 24,
|
|
"contact_below": 16,
|
|
"found": true,
|
|
"why": ""
|
|
},
|
|
"window": {
|
|
"above": 22,
|
|
"below": 14,
|
|
"reach_max": 10.879089664613279,
|
|
"reach_min": -1.4412388774811773
|
|
}
|
|
},
|
|
"lens_fresh": {
|
|
"above": 12,
|
|
"below": 10,
|
|
"edge_z": 3.35,
|
|
"reach_max": 7.46,
|
|
"reach_min": -0.07,
|
|
"stops_found": false
|
|
},
|
|
"mode": {
|
|
"detail": "already in grbl mode",
|
|
"found": "grbl",
|
|
"needs": "grbl",
|
|
"ok": true,
|
|
"switched": false
|
|
},
|
|
"operator": {
|
|
"ack_live": true,
|
|
"ts": "2026-09-19T21:24:26Z"
|
|
},
|
|
"program_z": {
|
|
"cooling.flow-load": {
|
|
"reach": [
|
|
2.15,
|
|
14.47
|
|
],
|
|
"stops_found": true,
|
|
"z": [
|
|
6.94
|
|
]
|
|
},
|
|
"laser.corner": {
|
|
"reach": [
|
|
2.15,
|
|
14.47
|
|
],
|
|
"stops_found": true,
|
|
"z": [
|
|
6.94
|
|
]
|
|
},
|
|
"laser.dose-curve": {
|
|
"reach": [
|
|
2.15,
|
|
14.47
|
|
],
|
|
"stops_found": true,
|
|
"z": [
|
|
6.94
|
|
]
|
|
},
|
|
"laser.floor": {
|
|
"reach": [
|
|
2.15,
|
|
14.47
|
|
],
|
|
"stops_found": true,
|
|
"z": [
|
|
6.94
|
|
]
|
|
},
|
|
"laser.focus": {
|
|
"reach": [
|
|
2.15,
|
|
14.47
|
|
],
|
|
"stops_found": true,
|
|
"z": [
|
|
6.94,
|
|
14.47,
|
|
13.44,
|
|
12.07,
|
|
11.05,
|
|
10.02,
|
|
8.99,
|
|
7.62,
|
|
6.6,
|
|
5.57,
|
|
4.54,
|
|
3.18,
|
|
2.15,
|
|
6.94
|
|
]
|
|
},
|
|
"sheet.frame": {
|
|
"reach": [
|
|
-0.07,
|
|
7.46
|
|
],
|
|
"stops_found": false,
|
|
"z": [
|
|
3.35
|
|
]
|
|
}
|
|
},
|
|
"settings_before": {
|
|
"cool_laser_heat_cw": "6.533e-05",
|
|
"cool_laser_heat_density": "5.03e-05",
|
|
"laser_corner_gamma": "1.50",
|
|
"laser_dose_curve": "10:0.62,20:2.79,30:8.46,45:24.90,60:42.02,80:52.53,100:100.00",
|
|
"laser_floor_density": "14",
|
|
"lens_hall_edge_z_mm": "4.51",
|
|
"lens_stop_above_steps": "20",
|
|
"lens_stop_below_steps": "14"
|
|
},
|
|
"thickness_answer": "0.125"
|
|
},
|
|
"fingerprint": "ad5179ae308fa1a4a7a681c9f2586c64410f329a3c6da1c79cd38ca4b341da0d",
|
|
"image": "20260919210531 (dev)",
|
|
"log": [
|
|
"21:24:26 start setup.sheet (live, takeover) in campaign c-20260919210959-8780",
|
|
"21:24:26 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
|
|
"21:24:26 fixture: <REDACTED-1> at <IP-1> covers lid, interlock, button",
|
|
"21:24:26 queued by the attended queue opened 2026-09-19T21:21:02Z",
|
|
"21:24:26 baseline: pre: clean",
|
|
"21:24:26 mode: test needs grbl - already in grbl mode",
|
|
"21:24:26 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:24:26 READY: waiting for the operator's press on the machine (the bench then does every press in this test)",
|
|
"21:24:34 READY: operator present (press after 7.0 s); the bench takes the presses",
|
|
"21:24:34 POST /wiz/sheet.place/start -> 200 {'started': True, 'id': 'sheet.place'}",
|
|
"21:24:34 sheet.place: stopping the motion controller",
|
|
"21:24:35 sheet.place: the lens finds its reference on the hall sensor",
|
|
"21:24:36 sheet.place: the lens finds its reference on the hall sensor: pass 1 of 2",
|
|
"21:24:37 sheet.place: the lens finds its reference on the hall sensor: pass 2 of 2",
|
|
"21:24:38 sheet.place: the cooling engine takes the controller's report: 0 s (20 at most)",
|
|
"21:24:40 sheet.place: placing the sheet",
|
|
"21:24:40 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:24:41 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:24:42 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:24:43 prompt sheet-kind (choice): Is this the full setup sheet (8 x 6 in or more), or a smaller piece for one card?",
|
|
"21:24:44 prompt thickness (number): The thickness of the sheet in inches.",
|
|
"21:24:45 placed: datum at 0, 0; steps per mm {'x': 213.33299, 'y': 213.33299, 'z': 2.922}",
|
|
"21:24:45 POST /wiz/sheet.frame/start -> 200 {'started': True, 'id': 'sheet.frame'}",
|
|
"21:24:45 sheet.frame: stopping the motion controller",
|
|
"21:24:46 sheet.frame: the lens finds its reference on the hall sensor",
|
|
"21:24:47 sheet.frame: the lens finds its reference on the hall sensor: pass 1 of 2",
|
|
"21:24:48 sheet.frame: the lens finds its reference on the hall sensor: pass 2 of 2",
|
|
"21:24:49 sheet.frame: the cooling engine takes the controller's report: 0 s (20 at most)",
|
|
"21:24:50 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:24:51 sheet.frame: the program goes to the controller, the button lights at the arm",
|
|
"21:24:52 sheet.frame: the button is lit: press it now (0 s; the job waits 599 at most)",
|
|
"21:24:52 prompt press (wait): The button is lit white. Press it now: the laser fires after your press.",
|
|
"21:24:52 ARM press by the fixture, at the machine's own press prompt",
|
|
"21:24:53 sheet.frame: the button is lit: press it now (1 s; the job waits 599 at most)",
|
|
"21:24:54 sheet.frame: the button is lit: press it now (2 s; the job waits 599 at most)",
|
|
"21:24:55 sheet.frame: the button is lit: press it now (3 s; the job waits 599 at most)",
|
|
"21:24:56 sheet.frame: the button is lit: press it now (4 s; the job waits 599 at most)",
|
|
"21:24:57 sheet.frame: the button is lit: press it now (5 s; the job waits 599 at most)",
|
|
"21:24:57 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
|
|
"21:24:58 sheet.frame: the button is lit: press it now (6 s; the job waits 599 at most)",
|
|
"21:24:59 sheet.frame: the button is lit: press it now (7 s; the job waits 599 at most)",
|
|
"21:25:00 sheet.frame: burning: 0 s lit",
|
|
"21:25:01 sheet.frame: burning: 1 s lit",
|
|
"21:25:02 sheet.frame: burning: 2 s lit",
|
|
"21:25:03 sheet.frame: burning: 3 s lit",
|
|
"21:25:04 sheet.frame: burning: 4 s lit",
|
|
"21:25:05 sheet.frame: burning: 5 s lit",
|
|
"21:25:06 sheet.frame: burning: 6 s lit",
|
|
"21:25:07 sheet.frame: burning: 7 s lit",
|
|
"21:25:08 sheet.frame: burning: 8 s lit",
|
|
"21:25:09 sheet.frame: burning: 9 s lit",
|
|
"21:25:10 sheet.frame: burning: 11 s lit",
|
|
"21:25:11 sheet.frame: burning: 12 s lit",
|
|
"21:25:12 sheet.frame: burning: 13 s lit",
|
|
"21:25:13 sheet.frame: burning: 1 s lit",
|
|
"21:25:14 sheet.frame: burning: 0 s lit",
|
|
"21:25:17 sheet.frame: burning: the tube is between passes",
|
|
"21:25:18 sheet.frame: burning: 0 s lit",
|
|
"21:25:25 sheet.frame: burning: the tube is between passes",
|
|
"21:25:26 sheet.frame: burning: 0 s lit",
|
|
"21:25:28 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
|
|
"21:25:35 sheet.frame: burning: the tube is between passes",
|
|
"21:25:36 sheet.frame: burning: 0 s lit",
|
|
"21:25:37 sheet.frame: burning: the tube is between passes",
|
|
"21:25:39 sheet.frame: burning: 0 s lit",
|
|
"21:25:40 sheet.frame: burning: the tube is between passes",
|
|
"21:25:41 sheet.frame: burning: 0 s lit",
|
|
"21:25:43 sheet.frame: burning: the tube is between passes",
|
|
"21:25:44 sheet.frame: burning: 0 s lit",
|
|
"21:25:46 sheet.frame: burning: the tube is between passes",
|
|
"21:25:48 sheet.frame: burning: 0 s lit",
|
|
"21:25:49 sheet.frame: burning: the tube is between passes",
|
|
"21:25:50 sheet.frame: burning: 0 s lit",
|
|
"21:25:53 sheet.frame: burning: the tube is between passes",
|
|
"21:25:54 sheet.frame: burning: 0 s lit",
|
|
"21:25:56 sheet.frame: burning: the tube is between passes",
|
|
"21:25:57 sheet.frame: burning: 0 s lit",
|
|
"21:25:59 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
|
|
"21:26:03 sheet.frame: burning: the tube is between passes",
|
|
"21:26:04 sheet.frame: burning: 0 s lit",
|
|
"21:26:09 sheet.frame: burning: the tube is between passes",
|
|
"21:26:10 sheet.frame: burning: 0 s lit",
|
|
"21:26:11 sheet.frame: burning: the tube is between passes",
|
|
"21:26:13 sheet.frame: burning: 0 s lit",
|
|
"21:26:17 sheet.frame: burning: the tube is between passes",
|
|
"21:26:18 sheet.frame: the tube is dark: the pulse engine plays the rest",
|
|
"21:26:18 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:26:19 sheet.frame: {'mark_s': 400, 'mark_feed': 3000}, emission {'hv_max': 1023, 'laser_on_samples': 150, 'thermopile_delta': 928, 'lit_s': 76.28978926900004}",
|
|
"21:26:19 POST /wiz/laser.focus/start -> 200 {'started': True, 'id': 'laser.focus'}",
|
|
"21:26:19 laser.focus: stopping the motion controller",
|
|
"21:26:20 laser.focus: the lens finds its reference on the hall sensor",
|
|
"21:26:21 laser.focus: the lens finds its reference on the hall sensor: pass 1 of 2",
|
|
"21:26:22 laser.focus: the lens finds its reference on the hall sensor: pass 2 of 2",
|
|
"21:26:23 laser.focus: the fans stop before the listening: 0 s of 10",
|
|
"21:26:24 laser.focus: the fans stop before the listening: 1 s of 10",
|
|
"21:26:25 laser.focus: the fans stop before the listening: 2 s of 10",
|
|
"21:26:26 laser.focus: the fans stop before the listening: 3 s of 10",
|
|
"21:26:27 laser.focus: the fans stop before the listening: 4 s of 10",
|
|
"21:26:28 laser.focus: the fans stop before the listening: 5 s of 10",
|
|
"21:26:29 laser.focus: the fans stop before the listening: 6 s of 10",
|
|
"21:26:29 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
|
|
"21:26:30 laser.focus: the fans stop before the listening: 7 s of 10",
|
|
"21:26:31 laser.focus: the fans stop before the listening: 8 s of 10",
|
|
"21:26:32 laser.focus: the fans stop before the listening: 9 s of 10",
|
|
"21:26:33 laser.focus: finding the bottom stop by the head accelerometer: 3 half-steps below the edge",
|
|
"21:26:34 laser.focus: finding the bottom stop by the head accelerometer: 9 half-steps below the edge",
|
|
"21:26:35 laser.focus: finding the bottom stop by the head accelerometer: 14 half-steps below the edge",
|
|
"21:26:36 laser.focus: finding the bottom stop by the head accelerometer: 16 half-steps below the edge",
|
|
"21:26:39 laser.focus: finding the top stop by the head accelerometer: 5 half-steps above the edge",
|
|
"21:26:40 laser.focus: finding the top stop by the head accelerometer: 10 half-steps above the edge",
|
|
"21:26:41 laser.focus: finding the top stop by the head accelerometer: 16 half-steps above the edge",
|
|
"21:26:42 laser.focus: finding the top stop by the head accelerometer: 21 half-steps above the edge",
|
|
"21:26:43 laser.focus: finding the top stop by the head accelerometer: 24 half-steps above the edge",
|
|
"21:26:49 laser.focus: the cooling engine takes the controller's report: 0 s (20 at most)",
|
|
"21:26:51 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 22 above, without a slip. Twelve 1.772 in lines burn heavy, the lens stepped from 0.296 in above the reference to 0.189 in below it. Lid closed. Continue, then press the button when it lights white;",
|
|
"21:26:52 laser.focus: the program goes to the controller, the button lights at the arm",
|
|
"21:26:53 laser.focus: the button is lit: press it now (0 s; the job waits 599 at most)",
|
|
"21:26:53 prompt press (wait): The button is lit white. Press it now: the laser fires after your press.",
|
|
"21:26:53 ARM press by the fixture, at the machine's own press prompt",
|
|
"21:26:54 laser.focus: the button is lit: press it now (1 s; the job waits 599 at most)",
|
|
"21:26:55 laser.focus: the button is lit: press it now (2 s; the job waits 599 at most)",
|
|
"21:26:56 laser.focus: the button is lit: press it now (3 s; the job waits 599 at most)",
|
|
"21:26:57 laser.focus: the button is lit: press it now (4 s; the job waits 599 at most)",
|
|
"21:26:58 laser.focus: the button is lit: press it now (5 s; the job waits 599 at most)",
|
|
"21:26:59 laser.focus: the button is lit: press it now (6 s; the job waits 599 at most)",
|
|
"21:27:00 laser.focus: the button is lit: press it now (7 s; the job waits 599 at most)",
|
|
"21:27:00 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
|
|
"21:27:01 laser.focus: burning: 1 s lit",
|
|
"21:27:02 laser.focus: burning: 2 s lit",
|
|
"21:27:03 laser.focus: burning: 3 s lit",
|
|
"21:27:04 laser.focus: burning: 4 s lit",
|
|
"21:27:05 laser.focus: burning: 0 s lit",
|
|
"21:27:08 laser.focus: burning: the tube is between passes",
|
|
"21:27:09 laser.focus: burning: 0 s lit",
|
|
"21:27:12 laser.focus: burning: the tube is between passes",
|
|
"21:27:17 laser.focus: burning: 0 s lit",
|
|
"21:27:18 laser.focus: burning: 1 s lit",
|
|
"21:27:19 laser.focus: burning: the tube is between passes",
|
|
"21:27:20 laser.focus: burning: 1 s lit",
|
|
"21:27:21 laser.focus: burning: 2 s lit",
|
|
"21:27:23 laser.focus: burning: 0 s lit",
|
|
"21:27:24 laser.focus: burning: 1 s lit",
|
|
"21:27:25 laser.focus: burning: the tube is between passes",
|
|
"21:27:26 laser.focus: burning: 0 s lit",
|
|
"21:27:27 laser.focus: burning: 1 s lit",
|
|
"21:27:28 laser.focus: burning: the tube is between passes",
|
|
"21:27:29 laser.focus: burning: 1 s lit",
|
|
"21:27:30 laser.focus: burning: the tube is between passes",
|
|
"21:27:31 laser.focus: burning: 0 s lit",
|
|
"21:27:32 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
|
|
"21:27:32 laser.focus: burning: 1 s lit",
|
|
"21:27:33 laser.focus: burning: the tube is between passes",
|
|
"21:27:34 laser.focus: burning: 1 s lit",
|
|
"21:27:35 laser.focus: burning: 2 s lit",
|
|
"21:27:36 laser.focus: burning: the tube is between passes",
|
|
"21:27:37 laser.focus: burning: 1 s lit",
|
|
"21:27:38 laser.focus: burning: the tube is between passes",
|
|
"21:27:39 laser.focus: burning: 0 s lit",
|
|
"21:27:40 laser.focus: burning: 1 s lit",
|
|
"21:27:41 laser.focus: burning: the tube is between passes",
|
|
"21:27:42 laser.focus: burning: 1 s lit",
|
|
"21:27:43 laser.focus: burning: 2 s lit",
|
|
"21:27:44 laser.focus: burning: 0 s lit",
|
|
"21:27:45 laser.focus: burning: 1 s lit",
|
|
"21:27:46 laser.focus: burning: the tube is between passes",
|
|
"21:27:47 laser.focus: burning: 0 s lit",
|
|
"21:27:48 laser.focus: burning: 2 s lit",
|
|
"21:27:49 laser.focus: burning: the tube is between passes",
|
|
"21:27:51 laser.focus: the tube is dark: the pulse engine plays the rest",
|
|
"21:27:51 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:27:52 prompt thickness (number): The sheet thickness (0.125 in from the placement).",
|
|
"21:27:53 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': 14.468634496919918, 'focus_range_mm': {'min': 2.148305954825462, 'max': 14.468634496919918}, 'stops': {'found': True, 'below': 14, 'above': 22, 'contact_below': 16, 'contact_above': 24, 'why': ''}}, emission {'hv_max': 1023, 'laser_on_samples': 234, 'thermopile_delta': 1409, 'lit_s': 47.6316887590001}",
|
|
"21:27:53 POST /wiz/laser.floor/start -> 200 {'started': True, 'id': 'laser.floor'}",
|
|
"21:27:53 laser.floor: stopping the motion controller",
|
|
"21:27:54 laser.floor: the lens finds its reference on the hall sensor",
|
|
"21:27:55 laser.floor: the lens finds its reference on the hall sensor: pass 1 of 2",
|
|
"21:27:56 laser.floor: the cooling engine takes the controller's report: 0 s (20 at most)",
|
|
"21:27:58 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:27:59 laser.floor: the program goes to the controller, the button lights at the arm",
|
|
"21:28:00 laser.floor: the button is lit: press it now (0 s; the job waits 599 at most)",
|
|
"21:28:00 prompt press (wait): The button is lit white. Press it now: the laser fires after your press.",
|
|
"21:28:00 ARM press by the fixture, at the machine's own press prompt",
|
|
"21:28:01 laser.floor: the button is lit: press it now (2 s; the job waits 599 at most)",
|
|
"21:28:02 laser.floor: the button is lit: press it now (3 s; the job waits 599 at most)",
|
|
"21:28:02 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
|
|
"21:28:04 laser.floor: the button is lit: press it now (4 s; the job waits 599 at most)",
|
|
"21:28:05 laser.floor: burning: 1 s lit",
|
|
"21:28:06 laser.floor: burning: 2 s lit",
|
|
"21:28:07 laser.floor: burning: 3 s lit",
|
|
"21:28:08 laser.floor: burning: 4 s lit",
|
|
"21:28:09 laser.floor: burning: 5 s lit",
|
|
"21:28:10 laser.floor: burning: 0 s lit",
|
|
"21:28:12 laser.floor: burning: the tube is between passes",
|
|
"21:28:13 laser.floor: burning: 0 s lit",
|
|
"21:28:14 laser.floor: burning: the tube is between passes",
|
|
"21:28:15 laser.floor: burning: 0 s lit",
|
|
"21:28:18 laser.floor: burning: the tube is between passes",
|
|
"21:28:20 laser.floor: burning: 0 s lit",
|
|
"21:28:23 laser.floor: burning: the tube is between passes",
|
|
"21:28:27 laser.floor: burning: 0 s lit",
|
|
"21:28:29 laser.floor: burning: the tube is between passes",
|
|
"21:28:30 laser.floor: burning: 0 s lit",
|
|
"21:28:31 laser.floor: burning: the tube is between passes",
|
|
"21:28:32 laser.floor: burning: 0 s lit",
|
|
"21:28:33 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
|
|
"21:28:33 laser.floor: burning: the tube is between passes",
|
|
"21:28:35 laser.floor: burning: 0 s lit",
|
|
"21:28:39 laser.floor: burning: the tube is between passes",
|
|
"21:28:40 laser.floor: burning: 0 s lit",
|
|
"21:28:45 laser.floor: burning: the tube is between passes",
|
|
"21:28:46 laser.floor: burning: 0 s lit",
|
|
"21:28:47 laser.floor: burning: the tube is between passes",
|
|
"21:28:48 laser.floor: burning: 0 s lit",
|
|
"21:28:49 laser.floor: burning: the tube is between passes",
|
|
"21:28:50 laser.floor: burning: 1 s lit",
|
|
"21:28:51 laser.floor: burning: 0 s lit",
|
|
"21:28:52 laser.floor: burning: the tube is between passes",
|
|
"21:28:53 laser.floor: burning: 0 s lit",
|
|
"21:28:54 laser.floor: burning: the tube is between passes",
|
|
"21:28:56 laser.floor: burning: 0 s lit",
|
|
"21:28:59 laser.floor: burning: the tube is between passes",
|
|
"21:29:00 laser.floor: burning: 0 s lit",
|
|
"21:29:04 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
|
|
"21:29:05 laser.floor: burning: the tube is between passes",
|
|
"21:29:06 laser.floor: burning: 0 s lit",
|
|
"21:29:07 laser.floor: burning: 1 s lit",
|
|
"21:29:08 laser.floor: burning: 2 s lit",
|
|
"21:29:09 laser.floor: burning: 3 s lit",
|
|
"21:29:10 laser.floor: burning: 4 s lit",
|
|
"21:29:11 laser.floor: burning: 5 s lit",
|
|
"21:29:12 laser.floor: burning: 0 s lit",
|
|
"21:29:13 laser.floor: burning: 1 s lit",
|
|
"21:29:14 laser.floor: burning: 2 s lit",
|
|
"21:29:15 laser.floor: burning: 3 s lit",
|
|
"21:29:16 laser.floor: burning: 4 s lit",
|
|
"21:29:17 laser.floor: burning: the tube is between passes",
|
|
"21:29:18 laser.floor: burning: 0 s lit",
|
|
"21:29:19 laser.floor: burning: 1 s lit",
|
|
"21:29:20 laser.floor: burning: 2 s lit",
|
|
"21:29:21 laser.floor: burning: 3 s lit",
|
|
"21:29:22 laser.floor: burning: 4 s lit",
|
|
"21:29:23 laser.floor: burning: the tube is between passes",
|
|
"21:29:24 laser.floor: burning: 0 s lit",
|
|
"21:29:25 laser.floor: burning: 1 s lit",
|
|
"21:29:26 laser.floor: burning: 2 s lit",
|
|
"21:29:27 laser.floor: burning: 3 s lit",
|
|
"21:29:28 laser.floor: burning: 4 s lit",
|
|
"21:29:29 laser.floor: burning: the tube is between passes",
|
|
"21:29:30 laser.floor: burning: 0 s lit",
|
|
"21:29:31 laser.floor: burning: 1 s lit",
|
|
"21:29:32 laser.floor: burning: 2 s lit",
|
|
"21:29:33 laser.floor: burning: 3 s lit",
|
|
"21:29:34 laser.floor: burning: 4 s lit",
|
|
"21:29:35 laser.floor: burning: the tube is between passes",
|
|
"21:29:35 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
|
|
"21:29:36 laser.floor: the tube is dark: the samples run on, 1 s more",
|
|
"21:29:37 laser.floor: the tube is dark: the pulse engine plays the rest",
|
|
"21:29:37 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:29:38 laser.floor: {'faintest_density': 8.0, 'floor_density': 10.0}, emission {'hv_max': 1023, 'laser_on_samples': 146, 'thermopile_delta': 767, 'lit_s': 90.95120146800014}",
|
|
"21:29:38 POST /wiz/laser.dose-curve/start -> 200 {'started': True, 'id': 'laser.dose-curve'}",
|
|
"21:29:38 laser.dose-curve: stopping the motion controller",
|
|
"21:29:39 laser.dose-curve: the lens finds its reference on the hall sensor",
|
|
"21:29:40 laser.dose-curve: the lens finds its reference on the hall sensor: pass 1 of 2",
|
|
"21:29:41 laser.dose-curve: the lens finds its reference on the hall sensor: pass 2 of 2",
|
|
"21:29:42 laser.dose-curve: the cooling engine takes the controller's report: 0 s (20 at most)",
|
|
"21:29:44 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:29:45 laser.dose-curve: the program goes to the controller, the button lights at the arm",
|
|
"21:29:46 laser.dose-curve: the button is lit: press it now (0 s; the job waits 599 at most)",
|
|
"21:29:46 prompt press (wait): The button is lit white. Press it now: the laser fires after your press.",
|
|
"21:29:46 ARM press by the fixture, at the machine's own press prompt",
|
|
"21:29:47 laser.dose-curve: the button is lit: press it now (1 s; the job waits 599 at most)",
|
|
"21:29:48 laser.dose-curve: the button is lit: press it now (2 s; the job waits 599 at most)",
|
|
"21:29:49 laser.dose-curve: the button is lit: press it now (3 s; the job waits 599 at most)",
|
|
"21:29:50 laser.dose-curve: the button is lit: press it now (4 s; the job waits 599 at most)",
|
|
"21:29:51 laser.dose-curve: burning: 1 s lit",
|
|
"21:29:52 laser.dose-curve: burning: 2 s lit",
|
|
"21:29:53 laser.dose-curve: burning: 3 s lit",
|
|
"21:29:54 laser.dose-curve: burning: 4 s lit",
|
|
"21:29:55 laser.dose-curve: burning: 5 s lit",
|
|
"21:29:56 laser.dose-curve: burning: 6 s lit",
|
|
"21:29:58 laser.dose-curve: burning: the tube is between passes",
|
|
"21:30:02 laser.dose-curve: burning: 0 s lit",
|
|
"21:30:06 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
|
|
"21:30:10 laser.dose-curve: burning: the tube is between passes",
|
|
"21:30:14 laser.dose-curve: burning: 0 s lit",
|
|
"21:30:21 laser.dose-curve: burning: the tube is between passes",
|
|
"21:30:22 laser.dose-curve: burning: 0 s lit",
|
|
"21:30:23 laser.dose-curve: burning: the tube is between passes",
|
|
"21:30:26 laser.dose-curve: burning: 1 s lit",
|
|
"21:30:27 laser.dose-curve: burning: 2 s lit",
|
|
"21:30:28 laser.dose-curve: burning: 3 s lit",
|
|
"21:30:29 laser.dose-curve: burning: 4 s lit",
|
|
"21:30:30 laser.dose-curve: burning: 5 s lit",
|
|
"21:30:31 laser.dose-curve: burning: 6 s lit",
|
|
"21:30:32 laser.dose-curve: burning: 7 s lit",
|
|
"21:30:33 laser.dose-curve: burning: 8 s lit",
|
|
"21:30:34 laser.dose-curve: burning: 9 s lit",
|
|
"21:30:35 laser.dose-curve: burning: 10 s lit",
|
|
"21:30:36 laser.dose-curve: burning: the tube is between passes",
|
|
"21:30:36 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
|
|
"21:30:39 laser.dose-curve: burning: 1 s lit",
|
|
"21:30:40 laser.dose-curve: burning: 2 s lit",
|
|
"21:30:41 laser.dose-curve: burning: 3 s lit",
|
|
"21:30:42 laser.dose-curve: burning: 4 s lit",
|
|
"21:30:43 laser.dose-curve: burning: 5 s lit",
|
|
"21:30:44 laser.dose-curve: burning: 6 s lit",
|
|
"21:30:45 laser.dose-curve: burning: 7 s lit",
|
|
"21:30:46 laser.dose-curve: burning: 8 s lit",
|
|
"21:30:47 laser.dose-curve: burning: 9 s lit",
|
|
"21:30:48 laser.dose-curve: burning: 10 s lit",
|
|
"21:30:49 laser.dose-curve: burning: the tube is between passes",
|
|
"21:30:52 laser.dose-curve: burning: 1 s lit",
|
|
"21:30:53 laser.dose-curve: burning: 2 s lit",
|
|
"21:30:54 laser.dose-curve: burning: 3 s lit",
|
|
"21:30:55 laser.dose-curve: burning: 4 s lit",
|
|
"21:30:56 laser.dose-curve: burning: 5 s lit",
|
|
"21:30:57 laser.dose-curve: burning: 6 s lit",
|
|
"21:30:58 laser.dose-curve: burning: 7 s lit",
|
|
"21:30:59 laser.dose-curve: burning: 8 s lit",
|
|
"21:31:00 laser.dose-curve: burning: 9 s lit",
|
|
"21:31:01 laser.dose-curve: burning: 10 s lit",
|
|
"21:31:02 laser.dose-curve: burning: the tube is between passes",
|
|
"21:31:05 laser.dose-curve: burning: 1 s lit",
|
|
"21:31:06 laser.dose-curve: burning: 2 s lit",
|
|
"21:31:07 laser.dose-curve: burning: 3 s lit",
|
|
"21:31:07 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
|
|
"21:31:08 laser.dose-curve: burning: 4 s lit",
|
|
"21:31:09 laser.dose-curve: burning: 5 s lit",
|
|
"21:31:10 laser.dose-curve: burning: 6 s lit",
|
|
"21:31:11 laser.dose-curve: burning: 7 s lit",
|
|
"21:31:12 laser.dose-curve: burning: 8 s lit",
|
|
"21:31:13 laser.dose-curve: burning: 9 s lit",
|
|
"21:31:14 laser.dose-curve: burning: 10 s lit",
|
|
"21:31:15 laser.dose-curve: burning: the tube is between passes",
|
|
"21:31:18 laser.dose-curve: burning: 0 s lit",
|
|
"21:31:19 laser.dose-curve: burning: 1 s lit",
|
|
"21:31:20 laser.dose-curve: burning: 3 s lit",
|
|
"21:31:21 laser.dose-curve: burning: 4 s lit",
|
|
"21:31:22 laser.dose-curve: burning: 5 s lit",
|
|
"21:31:23 laser.dose-curve: burning: 6 s lit",
|
|
"21:31:24 laser.dose-curve: burning: 7 s lit",
|
|
"21:31:25 laser.dose-curve: burning: 8 s lit",
|
|
"21:31:27 laser.dose-curve: burning: 9 s lit",
|
|
"21:31:28 laser.dose-curve: burning: 10 s lit",
|
|
"21:31:29 laser.dose-curve: burning: the tube is between passes",
|
|
"21:31:32 laser.dose-curve: burning: 0 s lit",
|
|
"21:31:33 laser.dose-curve: burning: 1 s lit",
|
|
"21:31:34 laser.dose-curve: burning: 2 s lit",
|
|
"21:31:35 laser.dose-curve: burning: 4 s lit",
|
|
"21:31:36 laser.dose-curve: burning: 5 s lit",
|
|
"21:31:37 laser.dose-curve: burning: 6 s lit",
|
|
"21:31:38 laser.dose-curve: burning: 7 s lit",
|
|
"21:31:39 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
|
|
"21:31:39 laser.dose-curve: burning: 8 s lit",
|
|
"21:31:40 laser.dose-curve: burning: 9 s lit",
|
|
"21:31:41 laser.dose-curve: burning: 10 s lit",
|
|
"21:31:42 laser.dose-curve: burning: the tube is between passes",
|
|
"21:31:44 laser.dose-curve: the tube is dark: the fit needs the dark tail, 17 s more",
|
|
"21:31:45 laser.dose-curve: the tube is dark: the fit needs the dark tail, 16 s more",
|
|
"21:31:46 laser.dose-curve: the tube is dark: the fit needs the dark tail, 15 s more",
|
|
"21:31:47 laser.dose-curve: the tube is dark: the fit needs the dark tail, 14 s more",
|
|
"21:31:48 laser.dose-curve: the tube is dark: the fit needs the dark tail, 13 s more",
|
|
"21:31:49 laser.dose-curve: the tube is dark: the fit needs the dark tail, 12 s more",
|
|
"21:31:50 laser.dose-curve: the tube is dark: the fit needs the dark tail, 11 s more",
|
|
"21:31:51 laser.dose-curve: the tube is dark: the fit needs the dark tail, 10 s more",
|
|
"21:31:53 laser.dose-curve: the tube is dark: the fit needs the dark tail, 9 s more",
|
|
"21:31:54 laser.dose-curve: the tube is dark: the fit needs the dark tail, 8 s more",
|
|
"21:31:55 laser.dose-curve: the tube is dark: the fit needs the dark tail, 7 s more",
|
|
"21:31:56 laser.dose-curve: the tube is dark: the fit needs the dark tail, 6 s more",
|
|
"21:31:57 laser.dose-curve: the tube is dark: the fit needs the dark tail, 5 s more",
|
|
"21:31:58 laser.dose-curve: the tube is dark: the fit needs the dark tail, 4 s more",
|
|
"21:31:59 laser.dose-curve: the tube is dark: the fit needs the dark tail, 3 s more",
|
|
"21:32:00 laser.dose-curve: the tube is dark: the fit needs the dark tail, 2 s more",
|
|
"21:32:01 laser.dose-curve: the tube is dark: the fit needs the dark tail, 1 s more",
|
|
"21:32:02 laser.dose-curve: the tube is dark: the fit needs the dark tail, 0 s more",
|
|
"21:32:04 laser.dose-curve: the machine goes back to its normal posture",
|
|
"21:32:05 laser.dose-curve: {'points': [{'density': 10.0, 'light': 0.17631079409289807}, {'density': 20.0, 'light': 2.9723855358717444}, {'density': 30.0, 'light': 10.964784936276038}, {'density': 45.0, 'light': 28.836116889274283}, {'density': 60.0, 'light': 42.132577556091086}, {'density': 80.0, 'light': 54.80488188475965}, {'density': 100.0, 'light': 100.0}], 'curve': '10:0.18,20:2.97,30:10.96,45:28.84,60:42.13,80:54.80,100:100.00'}, emission {'hv_max': 1023, 'laser_on_samples': 255, 'thermopile_delta': 2273, 'lit_s': 110.95465894099993}",
|
|
"21:32:05 POST /wiz/laser.corner/start -> 200 {'started': True, 'id': 'laser.corner'}",
|
|
"21:32:05 laser.corner: stopping the motion controller",
|
|
"21:32:06 laser.corner: the lens finds its reference on the hall sensor",
|
|
"21:32:07 laser.corner: the lens finds its reference on the hall sensor: pass 1 of 2",
|
|
"21:32:08 laser.corner: the cooling engine takes the controller's report: 0 s (20 at most)",
|
|
"21:32:10 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:32:10 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
|
|
"21:32:11 laser.corner: the program goes to the controller, the button lights at the arm",
|
|
"21:32:12 laser.corner: the button is lit: press it now (0 s; the job waits 599 at most)",
|
|
"21:32:12 prompt press (wait): The button is lit white. Press it now: the laser fires after your press.",
|
|
"21:32:12 ARM press by the fixture, at the machine's own press prompt",
|
|
"21:32:13 laser.corner: the button is lit: press it now (1 s; the job waits 599 at most)",
|
|
"21:32:14 laser.corner: the button is lit: press it now (2 s; the job waits 599 at most)",
|
|
"21:32:15 laser.corner: the button is lit: press it now (3 s; the job waits 599 at most)",
|
|
"21:32:16 laser.corner: the button is lit: press it now (4 s; the job waits 599 at most)",
|
|
"21:32:17 laser.corner: the button is lit: press it now (5 s; the job waits 599 at most)",
|
|
"21:32:18 laser.corner: the button is lit: press it now (6 s; the job waits 599 at most)",
|
|
"21:32:19 laser.corner: the button is lit: press it now (7 s; the job waits 599 at most)",
|
|
"21:32:20 laser.corner: the button is lit: press it now (8 s; the job waits 599 at most)",
|
|
"21:32:21 laser.corner: the button is lit: press it now (9 s; the job waits 599 at most)",
|
|
"21:32:22 laser.corner: burning: 1 s lit",
|
|
"21:32:23 laser.corner: burning: 2 s lit",
|
|
"21:32:24 laser.corner: burning: 3 s lit",
|
|
"21:32:25 laser.corner: burning: 4 s lit",
|
|
"21:32:26 laser.corner: burning: the tube is between passes",
|
|
"21:32:28 laser.corner: burning: 0 s lit",
|
|
"21:32:31 laser.corner: burning: the tube is between passes",
|
|
"21:32:33 laser.corner: burning: 0 s lit",
|
|
"21:32:39 laser.corner: burning: the tube is between passes",
|
|
"21:32:40 laser.corner: burning: 0 s lit",
|
|
"21:32:41 laser.corner: burning: 1 s lit",
|
|
"21:32:41 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
|
|
"21:32:42 laser.corner: burning: the tube is between passes",
|
|
"21:32:43 laser.corner: burning: 1 s lit",
|
|
"21:32:44 laser.corner: burning: the tube is between passes",
|
|
"21:32:45 laser.corner: burning: 0 s lit",
|
|
"21:32:46 laser.corner: burning: 1 s lit",
|
|
"21:32:47 laser.corner: burning: the tube is between passes",
|
|
"21:32:48 laser.corner: burning: 0 s lit",
|
|
"21:32:49 laser.corner: burning: 1 s lit",
|
|
"21:32:50 laser.corner: burning: the tube is between passes",
|
|
"21:32:51 laser.corner: burning: 0 s lit",
|
|
"21:32:52 laser.corner: burning: the tube is between passes",
|
|
"21:32:54 laser.corner: the tube is dark: the pulse engine plays the rest",
|
|
"21:32:54 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:32:55 laser.corner: {'gamma': 1.5}, emission {'hv_max': 1023, 'laser_on_samples': 142, 'thermopile_delta': 759, 'lit_s': 30.91368981200003}",
|
|
"21:32:55 POST /wiz/cooling.flow-load/start -> 200 {'started': True, 'id': 'cooling.flow-load'}",
|
|
"21:32:55 cooling.flow-load: stopping the motion controller",
|
|
"21:32:56 cooling.flow-load: the lens finds its reference on the hall sensor",
|
|
"21:32:57 cooling.flow-load: the lens finds its reference on the hall sensor: pass 1 of 2",
|
|
"21:32:58 cooling.flow-load: the lens finds its reference on the hall sensor: pass 2 of 2",
|
|
"21:32:59 cooling.flow-load: the cooling engine takes the controller's report: 0 s (20 at most)",
|
|
"21:33:01 cooling.flow-load: the coolant loop settles before the press: 0 s (60 at least, 240 at most), reading the sensors",
|
|
"21:33:02 cooling.flow-load: the coolant loop settles before the press: 1 s (60 at least, 240 at most), reading the sensors",
|
|
"21:33:03 cooling.flow-load: the coolant loop settles before the press: 2 s (60 at least, 240 at most), reading the sensors",
|
|
"21:33:04 cooling.flow-load: the coolant loop settles before the press: 3 s (60 at least, 240 at most), reading the sensors",
|
|
"21:33:05 cooling.flow-load: the coolant loop settles before the press: 4 s (60 at least, 240 at most), reading the sensors",
|
|
"21:33:06 cooling.flow-load: the coolant loop settles before the press: 5 s (60 at least, 240 at most), reading the sensors",
|
|
"21:33:07 cooling.flow-load: the coolant loop settles before the press: 6 s (60 at least, 240 at most), reading the sensors",
|
|
"21:33:08 cooling.flow-load: the coolant loop settles before the press: 7 s (60 at least, 240 at most), reading the sensors",
|
|
"21:33:09 cooling.flow-load: the coolant loop settles before the press: 8 s (60 at least, 240 at most), reading the sensors",
|
|
"21:33:10 cooling.flow-load: the coolant loop settles before the press: 9 s (60 at least, 240 at most), reading the sensors",
|
|
"21:33:11 cooling.flow-load: the coolant loop settles before the press: 10 s (60 at least, 240 at most), reading the sensors",
|
|
"21:33:12 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
|
|
"21:33:12 cooling.flow-load: the coolant loop settles before the press: 11 s (60 at least, 240 at most), reading the sensors",
|
|
"21:33:13 cooling.flow-load: the coolant loop settles before the press: 12 s (60 at least, 240 at most), reading the sensors",
|
|
"21:33:14 cooling.flow-load: the coolant loop settles before the press: 13 s (60 at least, 240 at most), reading the sensors",
|
|
"21:33:15 cooling.flow-load: the coolant loop settles before the press: 14 s (60 at least, 240 at most), reading the sensors",
|
|
"21:33:16 cooling.flow-load: the coolant loop settles before the press: 15 s (60 at least, 240 at most), reading the sensors",
|
|
"21:33:17 cooling.flow-load: the coolant loop settles before the press: 16 s (60 at least, 240 at most), reading the sensors",
|
|
"21:33:18 cooling.flow-load: the coolant loop settles before the press: 17 s (60 at least, 240 at most), reading the sensors",
|
|
"21:33:20 cooling.flow-load: the coolant loop settles before the press: 18 s (60 at least, 240 at most), reading the sensors",
|
|
"21:33:21 cooling.flow-load: the coolant loop settles before the press: 19 s (60 at least, 240 at most), reading the sensors",
|
|
"21:33:22 cooling.flow-load: the coolant loop settles before the press: 20 s (60 at least, 240 at most), reading the sensors",
|
|
"21:33:23 cooling.flow-load: the coolant loop settles before the press: 21 s (60 at least, 240 at most), reading the sensors",
|
|
"21:33:24 cooling.flow-load: the coolant loop settles before the press: 22 s (60 at least, 240 at most), reading the sensors",
|
|
"21:33:25 cooling.flow-load: the coolant loop settles before the press: 23 s (60 at least, 240 at most), reading the sensors",
|
|
"21:33:26 cooling.flow-load: the coolant loop settles before the press: 24 s (60 at least, 240 at most), reading the sensors",
|
|
"21:33:27 cooling.flow-load: the coolant loop settles before the press: 25 s (60 at least, 240 at most), reading the sensors",
|
|
"21:33:28 cooling.flow-load: the coolant loop settles before the press: 26 s (60 at least, 240 at most), reading the sensors",
|
|
"21:33:29 cooling.flow-load: the coolant loop settles before the press: 27 s (60 at least, 240 at most), reading the sensors",
|
|
"21:33:30 cooling.flow-load: the coolant loop settles before the press: 28 s (60 at least, 240 at most), reading the sensors",
|
|
"21:33:31 cooling.flow-load: the coolant loop settles before the press: 29 s (60 at least, 240 at most), drifting -0.164 C p",
|
|
"21:33:32 cooling.flow-load: the coolant loop settles before the press: 30 s (60 at least, 240 at most), drifting -0.137 C p",
|
|
"21:33:33 cooling.flow-load: the coolant loop settles before the press: 31 s (60 at least, 240 at most), drifting -0.120 C p",
|
|
"21:33:34 cooling.flow-load: the coolant loop settles before the press: 32 s (60 at least, 240 at most), drifting -0.102 C p",
|
|
"21:33:35 cooling.flow-load: the coolant loop settles before the press: 33 s (60 at least, 240 at most), drifting -0.092 C p",
|
|
"21:33:36 cooling.flow-load: the coolant loop settles before the press: 34 s (60 at least, 240 at most), drifting -0.083 C p",
|
|
"21:33:37 cooling.flow-load: the coolant loop settles before the press: 35 s (60 at least, 240 at most), drifting -0.073 C p",
|
|
"21:33:38 cooling.flow-load: the coolant loop settles before the press: 36 s (60 at least, 240 at most), drifting -0.065 C p",
|
|
"21:33:39 cooling.flow-load: the coolant loop settles before the press: 37 s (60 at least, 240 at most), drifting -0.055 C p",
|
|
"21:33:40 cooling.flow-load: the coolant loop settles before the press: 38 s (60 at least, 240 at most), drifting -0.054 C p",
|
|
"21:33:41 cooling.flow-load: the coolant loop settles before the press: 39 s (60 at least, 240 at most), drifting -0.048 C p",
|
|
"21:33:42 cooling.flow-load: the coolant loop settles before the press: 40 s (60 at least, 240 at most), drifting -0.044 C p",
|
|
"21:33:43 cooling.flow-load: the coolant loop settles before the press: 41 s (60 at least, 240 at most), drifting -0.043 C p",
|
|
"21:33:43 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
|
|
"21:33:44 cooling.flow-load: the coolant loop settles before the press: 42 s (60 at least, 240 at most), drifting -0.040 C p",
|
|
"21:33:45 cooling.flow-load: the coolant loop settles before the press: 43 s (60 at least, 240 at most), drifting -0.035 C p",
|
|
"21:33:46 cooling.flow-load: the coolant loop settles before the press: 44 s (60 at least, 240 at most), drifting -0.033 C p",
|
|
"21:33:47 cooling.flow-load: the coolant loop settles before the press: 45 s (60 at least, 240 at most), drifting -0.031 C p",
|
|
"21:33:48 cooling.flow-load: the coolant loop settles before the press: 46 s (60 at least, 240 at most), drifting -0.029 C p",
|
|
"21:33:49 cooling.flow-load: the coolant loop settles before the press: 47 s (60 at least, 240 at most), drifting -0.026 C p",
|
|
"21:33:50 cooling.flow-load: the coolant loop settles before the press: 48 s (60 at least, 240 at most), drifting -0.023 C p",
|
|
"21:33:51 cooling.flow-load: the coolant loop settles before the press: 49 s (60 at least, 240 at most), drifting -0.020 C p",
|
|
"21:33:52 cooling.flow-load: the coolant loop settles before the press: 50 s (60 at least, 240 at most), drifting -0.019 C p",
|
|
"21:33:53 cooling.flow-load: the coolant loop settles before the press: 51 s (60 at least, 240 at most), drifting -0.016 C p",
|
|
"21:33:54 cooling.flow-load: the coolant loop settles before the press: 52 s (60 at least, 240 at most), drifting -0.020 C p",
|
|
"21:33:55 cooling.flow-load: the coolant loop settles before the press: 53 s (60 at least, 240 at most), drifting -0.019 C p",
|
|
"21:33:56 cooling.flow-load: the coolant loop settles before the press: 54 s (60 at least, 240 at most), drifting -0.019 C p",
|
|
"21:33:57 cooling.flow-load: the coolant loop settles before the press: 55 s (60 at least, 240 at most), drifting -0.019 C p",
|
|
"21:33:58 cooling.flow-load: the coolant loop settles before the press: 57 s (60 at least, 240 at most), drifting -0.017 C p",
|
|
"21:33:59 cooling.flow-load: the coolant loop settles before the press: 58 s (60 at least, 240 at most), drifting -0.015 C p",
|
|
"21:34:00 cooling.flow-load: the coolant loop settles before the press: 59 s (60 at least, 240 at most), drifting -0.016 C p",
|
|
"21:34:01 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:34:02 cooling.flow-load: the program goes to the controller, the button lights at the arm",
|
|
"21:34:03 cooling.flow-load: the button is lit: press it now (0 s; the job waits 599 at most)",
|
|
"21:34:03 prompt press (wait): The button is lit white. Press it now: the laser fires after your press.",
|
|
"21:34:03 ARM press by the fixture, at the machine's own press prompt",
|
|
"21:34:04 cooling.flow-load: the button is lit: press it now (1 s; the job waits 599 at most)",
|
|
"21:34:05 cooling.flow-load: the button is lit: press it now (2 s; the job waits 599 at most)",
|
|
"21:34:06 cooling.flow-load: the button is lit: press it now (3 s; the job waits 599 at most)",
|
|
"21:34:07 cooling.flow-load: the button is lit: press it now (4 s; the job waits 599 at most)",
|
|
"21:34:08 cooling.flow-load: the button is lit: press it now (5 s; the job waits 599 at most)",
|
|
"21:34:09 cooling.flow-load: the button is lit: press it now (6 s; the job waits 599 at most)",
|
|
"21:34:10 cooling.flow-load: the button is lit: press it now (7 s; the job waits 599 at most)",
|
|
"21:34:11 cooling.flow-load: the button is lit: press it now (8 s; the job waits 599 at most)",
|
|
"21:34:12 cooling.flow-load: the button is lit: press it now (9 s; the job waits 599 at most)",
|
|
"21:34:13 cooling.flow-load: burning: 1 s lit",
|
|
"21:34:13 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
|
|
"21:34:14 cooling.flow-load: burning: 2 s lit",
|
|
"21:34:15 cooling.flow-load: burning: 3 s lit",
|
|
"21:34:16 cooling.flow-load: burning: 4 s lit",
|
|
"21:34:17 cooling.flow-load: burning: the tube is between passes",
|
|
"21:34:18 cooling.flow-load: burning: 0 s lit",
|
|
"21:34:19 cooling.flow-load: burning: the tube is between passes",
|
|
"21:34:20 cooling.flow-load: burning: 0 s lit",
|
|
"21:34:22 cooling.flow-load: burning: the tube is between passes",
|
|
"21:34:24 cooling.flow-load: burning: 0 s lit",
|
|
"21:34:25 cooling.flow-load: burning: the tube is between passes",
|
|
"21:34:27 cooling.flow-load: burning: 1 s lit",
|
|
"21:34:28 cooling.flow-load: burning: 2 s lit",
|
|
"21:34:29 cooling.flow-load: burning: 3 s lit",
|
|
"21:34:30 cooling.flow-load: burning: 4 s lit",
|
|
"21:34:31 cooling.flow-load: burning: 5 s lit",
|
|
"21:34:32 cooling.flow-load: burning: 6 s lit",
|
|
"21:34:33 cooling.flow-load: burning: 7 s lit",
|
|
"21:34:34 cooling.flow-load: burning: 8 s lit",
|
|
"21:34:35 cooling.flow-load: burning: 9 s lit",
|
|
"21:34:36 cooling.flow-load: burning: 10 s lit",
|
|
"21:34:37 cooling.flow-load: burning: 11 s lit",
|
|
"21:34:38 cooling.flow-load: burning: 12 s lit",
|
|
"21:34:39 cooling.flow-load: burning: 13 s lit",
|
|
"21:34:40 cooling.flow-load: burning: 14 s lit",
|
|
"21:34:41 cooling.flow-load: burning: 15 s lit",
|
|
"21:34:42 cooling.flow-load: burning: 16 s lit",
|
|
"21:34:43 cooling.flow-load: burning: 17 s lit",
|
|
"21:34:44 cooling.flow-load: burning: 18 s lit",
|
|
"21:34:44 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
|
|
"21:34:45 cooling.flow-load: burning: 19 s lit",
|
|
"21:34:46 cooling.flow-load: burning: 20 s lit",
|
|
"21:34:47 cooling.flow-load: burning: 21 s lit",
|
|
"21:34:48 cooling.flow-load: burning: 22 s lit",
|
|
"21:34:49 cooling.flow-load: burning: 23 s lit",
|
|
"21:34:50 cooling.flow-load: burning: 24 s lit",
|
|
"21:34:51 cooling.flow-load: burning: 25 s lit",
|
|
"21:34:52 cooling.flow-load: burning: 26 s lit",
|
|
"21:34:53 cooling.flow-load: burning: 27 s lit",
|
|
"21:34:54 cooling.flow-load: burning: 28 s lit",
|
|
"21:34:55 cooling.flow-load: burning: 29 s lit",
|
|
"21:34:56 cooling.flow-load: burning: 30 s lit",
|
|
"21:34:57 cooling.flow-load: burning: 31 s lit",
|
|
"21:34:58 cooling.flow-load: burning: 32 s lit",
|
|
"21:34:59 cooling.flow-load: burning: 33 s lit",
|
|
"21:35:00 cooling.flow-load: burning: 34 s lit",
|
|
"21:35:01 cooling.flow-load: burning: 35 s lit",
|
|
"21:35:02 cooling.flow-load: burning: 36 s lit",
|
|
"21:35:03 cooling.flow-load: burning: 37 s lit",
|
|
"21:35:04 cooling.flow-load: burning: 38 s lit",
|
|
"21:35:05 cooling.flow-load: burning: 39 s lit",
|
|
"21:35:06 cooling.flow-load: burning: 40 s lit",
|
|
"21:35:07 cooling.flow-load: burning: 41 s lit",
|
|
"21:35:08 cooling.flow-load: burning: 42 s lit",
|
|
"21:35:09 cooling.flow-load: burning: 43 s lit",
|
|
"21:35:10 cooling.flow-load: burning: 45 s lit",
|
|
"21:35:11 cooling.flow-load: burning: 46 s lit",
|
|
"21:35:12 cooling.flow-load: burning: 47 s lit",
|
|
"21:35:13 cooling.flow-load: burning: 48 s lit",
|
|
"21:35:15 cooling.flow-load: burning: 49 s lit",
|
|
"21:35:16 cooling.flow-load: burning: 50 s lit",
|
|
"21:35:16 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
|
|
"21:35:17 cooling.flow-load: burning: 51 s lit",
|
|
"21:35:18 cooling.flow-load: burning: 52 s lit",
|
|
"21:35:19 cooling.flow-load: burning: 53 s lit",
|
|
"21:35:20 cooling.flow-load: burning: 54 s lit",
|
|
"21:35:21 cooling.flow-load: burning: 55 s lit",
|
|
"21:35:22 cooling.flow-load: burning: 56 s lit",
|
|
"21:35:23 cooling.flow-load: burning: 57 s lit",
|
|
"21:35:24 cooling.flow-load: burning: 58 s lit",
|
|
"21:35:25 cooling.flow-load: burning: 59 s lit",
|
|
"21:35:26 cooling.flow-load: burning: 60 s lit",
|
|
"21:35:27 cooling.flow-load: burning: 61 s lit",
|
|
"21:35:28 cooling.flow-load: burning: 62 s lit",
|
|
"21:35:29 cooling.flow-load: burning: 63 s lit",
|
|
"21:35:30 cooling.flow-load: burning: 64 s lit",
|
|
"21:35:31 cooling.flow-load: burning: 65 s lit",
|
|
"21:35:32 cooling.flow-load: burning: 66 s lit",
|
|
"21:35:33 cooling.flow-load: burning: 67 s lit",
|
|
"21:35:34 cooling.flow-load: burning: 68 s lit",
|
|
"21:35:35 cooling.flow-load: burning: 69 s lit",
|
|
"21:35:36 cooling.flow-load: burning: 70 s lit",
|
|
"21:35:37 cooling.flow-load: burning: 71 s lit",
|
|
"21:35:38 cooling.flow-load: burning: 72 s lit",
|
|
"21:35:39 cooling.flow-load: burning: 73 s lit",
|
|
"21:35:40 cooling.flow-load: burning: 74 s lit",
|
|
"21:35:41 cooling.flow-load: burning: 75 s lit",
|
|
"21:35:42 cooling.flow-load: burning: 76 s lit",
|
|
"21:35:43 cooling.flow-load: burning: the tube is between passes",
|
|
"21:35:45 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 97 s more",
|
|
"21:35:46 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 96 s more",
|
|
"21:35:47 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
|
|
"21:35:47 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 95 s more",
|
|
"21:35:48 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 94 s more",
|
|
"21:35:49 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 93 s more",
|
|
"21:35:50 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 92 s more",
|
|
"21:35:51 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 91 s more",
|
|
"21:35:52 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 90 s more",
|
|
"21:35:53 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 89 s more",
|
|
"21:35:55 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 88 s more",
|
|
"21:35:56 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 87 s more",
|
|
"21:35:57 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 86 s more",
|
|
"21:35:58 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 85 s more",
|
|
"21:35:59 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 84 s more",
|
|
"21:36:00 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 83 s more",
|
|
"21:36:01 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 82 s more",
|
|
"21:36:02 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 81 s more",
|
|
"21:36:03 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 80 s more",
|
|
"21:36:04 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 79 s more",
|
|
"21:36:05 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 78 s more",
|
|
"21:36:06 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 77 s more",
|
|
"21:36:07 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 76 s more",
|
|
"21:36:08 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 75 s more",
|
|
"21:36:09 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 74 s more",
|
|
"21:36:10 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 73 s more",
|
|
"21:36:11 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 72 s more",
|
|
"21:36:12 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 71 s more",
|
|
"21:36:13 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 70 s more",
|
|
"21:36:14 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 69 s more",
|
|
"21:36:15 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 68 s more",
|
|
"21:36:16 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 67 s more",
|
|
"21:36:17 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 66 s more",
|
|
"21:36:17 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
|
|
"21:36:18 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 64 s more",
|
|
"21:36:19 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 63 s more",
|
|
"21:36:20 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 62 s more",
|
|
"21:36:21 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 61 s more",
|
|
"21:36:22 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 60 s more",
|
|
"21:36:23 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 59 s more",
|
|
"21:36:24 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 58 s more",
|
|
"21:36:25 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 57 s more",
|
|
"21:36:26 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 56 s more",
|
|
"21:36:27 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 55 s more",
|
|
"21:36:28 cooling.flow-load: the tube is dark: the pulse engine plays the rest",
|
|
"21:36:29 cooling.flow-load: {'lit_s': 66.2, 'dose_raw_s': 36693.75999999997, 'peak_c': 1.7552941176470611, 'k_density': 4.7836311068886437e-05, 'k_cw': 6.212507931024212e-05}, emission {'hv_max': 1023, 'laser_on_samples': 216, 'thermopile_delta': 1073, 'lit_s': 90.46365566899999}",
|
|
"21:36:29 restore lens_hall_edge_z_mm='4.51' -> 200",
|
|
"21:36:29 restore lens_stop_below_steps='14' -> 200",
|
|
"21:36:29 restore lens_stop_above_steps='20' -> 200",
|
|
"21:36:29 restore laser_floor_density='14' -> 200",
|
|
"21:36:29 restore laser_dose_curve='10:0.62,20:2.79,30:8.46,45:24.90,60:42.02,80:52.53,100:100.00' -> 200",
|
|
"21:36:29 restore laser_corner_gamma='1.50' -> 200",
|
|
"21:36:29 restore cool_laser_heat_density='5.03e-05' -> 200",
|
|
"21:36:29 restore cool_laser_heat_cw='6.533e-05' -> 200",
|
|
"21:36:29 PASS: the sheet's seven wizards ran on one piece as a fresh machine's; settings restored",
|
|
"21:36:30 baseline: post: clean",
|
|
"21:36:30 result PASS"
|
|
],
|
|
"manifest_sha": "5221f3466ae2497ca49fbb8cbe5d4eff49fab0f8c627190416aa2320948f69c4",
|
|
"message": "",
|
|
"result": "PASS",
|
|
"test": "setup.sheet",
|
|
"ts": "2026-09-19T21:36:30Z"
|
|
},
|
|
"requires": [
|
|
"forgectrl.auth",
|
|
"setup.check-motion",
|
|
"laser.emission-witness",
|
|
"cooling.flow-verify"
|
|
],
|
|
"satisfied": true,
|
|
"source_sha": "b2a28c0bd596ad9ca79dcb5335b47b7c6c8f2471350adc46190d54fc08151a6b",
|
|
"subsystem": "setup",
|
|
"title": "The setup sheet: the placement, the frame, and the five cards"
|
|
},
|
|
{
|
|
"always": false,
|
|
"covers": [
|
|
[
|
|
"forgectrl",
|
|
"src/logs.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/fflog.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/sanitize.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/main.c"
|
|
]
|
|
],
|
|
"fingerprint": "2d2b9374f7420a8ac62318967c6453297710ac0bb71a81aa09b44ad6250f3527",
|
|
"hardware": "api",
|
|
"id": "logs.tree-tail-export",
|
|
"inherited": true,
|
|
"kind": "auto",
|
|
"record": {
|
|
"answers": [],
|
|
"campaign": "c-20260919202934-3d3a",
|
|
"duration_s": 43,
|
|
"evidence": {
|
|
"baseline": {
|
|
"post": [],
|
|
"pre": []
|
|
},
|
|
"batch": {
|
|
"group": "unattended",
|
|
"ts": "2026-09-19T20:29:34Z"
|
|
},
|
|
"camera_key_leaks": [],
|
|
"export_bytes": 3726630,
|
|
"export_s": 43.1,
|
|
"fixture": {
|
|
"channels": [
|
|
"lid",
|
|
"interlock",
|
|
"button"
|
|
],
|
|
"hostname": "<REDACTED-1>",
|
|
"ip": "<IP-1>",
|
|
"released": []
|
|
},
|
|
"install_members": [
|
|
"forgefirm-logs/logs/install/forgetest-probe.txt"
|
|
],
|
|
"loggers": [
|
|
"forgectrl",
|
|
"grblhal",
|
|
"gfcloud",
|
|
"gfhome",
|
|
"kernel",
|
|
"system"
|
|
],
|
|
"members": 40,
|
|
"panel_token_leaks": []
|
|
},
|
|
"fingerprint": "2d2b9374f7420a8ac62318967c6453297710ac0bb71a81aa09b44ad6250f3527",
|
|
"image": "20260919202327 (dev)",
|
|
"log": [
|
|
"20:33:38 start logs.tree-tail-export (auto, api) in campaign c-20260919202934-3d3a",
|
|
"20:33:38 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
|
|
"20:33:38 fixture: <REDACTED-1> at <IP-1> covers lid, interlock, button",
|
|
"20:33:38 queued by the unattended queue opened 2026-09-19T20:29:34Z",
|
|
"20:33:38 baseline: pre: clean",
|
|
"20:33:38 GET /logs -> 200",
|
|
"20:33:38 loggers: ['forgectrl', 'grblhal', 'gfcloud', 'gfhome', 'kernel', 'system']",
|
|
"20:33:38 GET /logs/tail?name=forgectrl -> 200",
|
|
"20:34:08 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
|
|
"20:34:21 POST /logs/export -> 200 (3726630 bytes, 43.1 s)",
|
|
"20:34:22 bundle: 40 members, e.g. ['forgefirm-logs', 'forgefirm-logs/README.txt', 'forgefirm-logs/logs', 'forgefirm-logs/logs/grblhal', 'forgefirm-logs/logs/grblhal/grblhal.log']",
|
|
"20:34:22 baseline: post: clean",
|
|
"20:34:22 result PASS"
|
|
],
|
|
"manifest_sha": "2d41354cdfb037d942fbe328e2ae0594efadd92e976d1c4512ca461b5f864a7e",
|
|
"message": "",
|
|
"result": "PASS",
|
|
"test": "logs.tree-tail-export",
|
|
"ts": "2026-09-19T20:34:22Z"
|
|
},
|
|
"requires": [
|
|
"forgectrl.auth"
|
|
],
|
|
"satisfied": true,
|
|
"source_sha": "4ca089910aa8185ecf6e299349cbacbf545bc78df9e2cf3af063e661da7ce023",
|
|
"subsystem": "logs",
|
|
"title": "Log tree, tail, and sanitized export"
|
|
},
|
|
{
|
|
"always": false,
|
|
"covers": [
|
|
[
|
|
"forgectrl",
|
|
"src/logs.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/fflog.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/super.c"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"init/**"
|
|
],
|
|
[
|
|
"grblhal-glowforge",
|
|
"src/fflog.*"
|
|
],
|
|
[
|
|
"grblhal-glowforge",
|
|
"src/main.c"
|
|
],
|
|
[
|
|
"forgefirm-app",
|
|
"forgefirm-app/ffmachine.py"
|
|
],
|
|
[
|
|
"forgefirm-app",
|
|
"forgefirm-app/gfcloud.py"
|
|
],
|
|
[
|
|
"forgefirm-app",
|
|
"forgefirm-app/gfhome.py"
|
|
]
|
|
],
|
|
"fingerprint": "6168aa3b9c27abe4f207de0608093102d2ab029eb2fe268c35afe028bb9c298f",
|
|
"hardware": "api",
|
|
"id": "logs.routing",
|
|
"inherited": true,
|
|
"kind": "auto",
|
|
"record": {
|
|
"answers": [],
|
|
"campaign": "c-20260919202934-3d3a",
|
|
"duration_s": 4,
|
|
"evidence": {
|
|
"baseline": {
|
|
"post": [],
|
|
"pre": []
|
|
},
|
|
"batch": {
|
|
"group": "unattended",
|
|
"ts": "2026-09-19T20:29:34Z"
|
|
},
|
|
"controller": "running",
|
|
"effective": {
|
|
"forgectrl": [
|
|
"info",
|
|
"off"
|
|
],
|
|
"gfcloud": [
|
|
"info",
|
|
"off"
|
|
],
|
|
"gfhome": [
|
|
"info",
|
|
"off"
|
|
],
|
|
"grblhal": [
|
|
"info",
|
|
"off"
|
|
],
|
|
"kernel": [
|
|
"info",
|
|
"off"
|
|
],
|
|
"system": [
|
|
"info",
|
|
"off"
|
|
]
|
|
},
|
|
"fixture": {
|
|
"channels": [
|
|
"lid",
|
|
"interlock",
|
|
"button"
|
|
],
|
|
"hostname": "<REDACTED-1>",
|
|
"ip": "<IP-1>",
|
|
"released": []
|
|
},
|
|
"kernel_lines": 50,
|
|
"logger_relays": [
|
|
2728,
|
|
3795
|
|
],
|
|
"own_lines": 179,
|
|
"probe_gfhome": "2026-09-19T20:45:45.095997+00:00 gfhome[-] ERR forgetest-routing-1789850744 gfhome",
|
|
"probe_grblhal": "2026-09-19T20:45:44.060260+00:00 grblhal[-] ERR forgetest-routing-1789850744 grblhal",
|
|
"rsyslogd_pids": [
|
|
451
|
|
]
|
|
},
|
|
"fingerprint": "6168aa3b9c27abe4f207de0608093102d2ab029eb2fe268c35afe028bb9c298f",
|
|
"image": "20260919202327 (dev)",
|
|
"log": [
|
|
"20:45:43 start logs.routing (auto, api) in campaign c-20260919202934-3d3a",
|
|
"20:45:43 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
|
|
"20:45:43 fixture: <REDACTED-1> at <IP-1> covers lid, interlock, button",
|
|
"20:45:43 queued by the unattended queue opened 2026-09-19T20:29:34Z",
|
|
"20:45:43 baseline: pre: clean",
|
|
"20:45:43 rsyslogd [451]; no syslogd/klogd",
|
|
"20:45:43 effective levels: {'forgectrl': ('info', 'off'), 'grblhal': ('info', 'off'), 'gfcloud': ('info', 'off'), 'gfhome': ('info', 'off'), 'kernel': ('info', 'off'), 'system': ('info', 'off')}",
|
|
"20:45:44 forgectrl[[2729]] lines in its file: 179",
|
|
"20:45:45 grblhal: 2026-09-19T20:45:44.060260+00:00 grblhal[-] ERR forgetest-routing-1789850744 grblhal",
|
|
"20:45:46 gfhome: 2026-09-19T20:45:45.095997+00:00 gfhome[-] ERR forgetest-routing-1789850744 gfhome",
|
|
"20:45:47 logger relays: [2728, 3795] (controller running)",
|
|
"20:45:47 no ForgeFIRM log outside /data/log/forgefirm",
|
|
"20:45:47 baseline: post: clean",
|
|
"20:45:47 result PASS"
|
|
],
|
|
"manifest_sha": "2d41354cdfb037d942fbe328e2ae0594efadd92e976d1c4512ca461b5f864a7e",
|
|
"message": "",
|
|
"result": "PASS",
|
|
"test": "logs.routing",
|
|
"ts": "2026-09-19T20:45:47Z"
|
|
},
|
|
"requires": [
|
|
"logs.tree-tail-export"
|
|
],
|
|
"satisfied": true,
|
|
"source_sha": "c260381a19b6271679df637e784bf4ea39664fc9472732c9698a17e3ee5a68f4",
|
|
"subsystem": "logs",
|
|
"title": "Log routing, relays, and the rendered rules"
|
|
},
|
|
{
|
|
"always": false,
|
|
"covers": [
|
|
[
|
|
"forgectrl",
|
|
"src/logs.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/main.c"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/settings.*"
|
|
]
|
|
],
|
|
"fingerprint": "c00a1acaeb260f8685f0fc01d3b4eb0df02c0c4e1e498458842e2f10e9d2082a",
|
|
"hardware": "api",
|
|
"id": "logs.level-settings",
|
|
"inherited": true,
|
|
"kind": "auto",
|
|
"record": {
|
|
"answers": [],
|
|
"campaign": "c-20260919202934-3d3a",
|
|
"duration_s": 0,
|
|
"evidence": {
|
|
"baseline": {
|
|
"post": [],
|
|
"pre": []
|
|
},
|
|
"batch": {
|
|
"group": "unattended",
|
|
"ts": "2026-09-19T20:29:34Z"
|
|
},
|
|
"fixture": {
|
|
"channels": [
|
|
"lid",
|
|
"interlock",
|
|
"button"
|
|
],
|
|
"hostname": "<REDACTED-1>",
|
|
"ip": "<IP-1>",
|
|
"released": []
|
|
},
|
|
"pending_before": false,
|
|
"refused log_grblhal_disk=verbose": 400,
|
|
"refused log_kernel_remote=7": 400,
|
|
"refused syslog_port=70000": 400,
|
|
"refused syslog_proto=tls": 400,
|
|
"refused syslog_server=bad host name": 400,
|
|
"system_remote_before": "off"
|
|
},
|
|
"fingerprint": "c00a1acaeb260f8685f0fc01d3b4eb0df02c0c4e1e498458842e2f10e9d2082a",
|
|
"image": "20260919202327 (dev)",
|
|
"log": [
|
|
"20:45:47 start logs.level-settings (auto, api) in campaign c-20260919202934-3d3a",
|
|
"20:45:48 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
|
|
"20:45:48 fixture: <REDACTED-1> at <IP-1> covers lid, interlock, button",
|
|
"20:45:48 queued by the unattended queue opened 2026-09-19T20:29:34Z",
|
|
"20:45:48 baseline: pre: clean",
|
|
"20:45:48 POST /settings log_grblhal_disk=verbose -> 400",
|
|
"20:45:48 POST /settings log_kernel_remote=7 -> 400",
|
|
"20:45:48 POST /settings syslog_port=70000 -> 400",
|
|
"20:45:48 POST /settings syslog_proto=tls -> 400",
|
|
"20:45:48 POST /settings syslog_server=bad host name -> 400",
|
|
"20:45:48 POST /settings log_system_remote=warning -> 200",
|
|
"20:45:48 configured warning, effective off, pending_reboot True",
|
|
"20:45:48 restore log_system_remote -> 200",
|
|
"20:45:48 baseline: post: clean",
|
|
"20:45:48 result PASS"
|
|
],
|
|
"manifest_sha": "2d41354cdfb037d942fbe328e2ae0594efadd92e976d1c4512ca461b5f864a7e",
|
|
"message": "",
|
|
"result": "PASS",
|
|
"test": "logs.level-settings",
|
|
"ts": "2026-09-19T20:45:48Z"
|
|
},
|
|
"requires": [
|
|
"logs.tree-tail-export",
|
|
"forgectrl.settings-bounds"
|
|
],
|
|
"satisfied": true,
|
|
"source_sha": "5dc9d8682c516f05159e28831cbc65bf3a501473d397cae2c0c6812e9db24598",
|
|
"subsystem": "logs",
|
|
"title": "Log level and remote-target settings"
|
|
},
|
|
{
|
|
"always": false,
|
|
"covers": [
|
|
[
|
|
"grblhal-glowforge",
|
|
"src/**"
|
|
],
|
|
[
|
|
"kernel-module-glowforge",
|
|
"**"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/super.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/liveness.*"
|
|
]
|
|
],
|
|
"fingerprint": "313e232c35018b9118c52df54fe233ad65b41f59e58f21f5e1b502f8560690a5",
|
|
"hardware": "api",
|
|
"id": "motion.pacing",
|
|
"inherited": true,
|
|
"kind": "auto",
|
|
"record": {
|
|
"answers": [],
|
|
"campaign": "c-20260919202934-3d3a",
|
|
"duration_s": 15,
|
|
"evidence": {
|
|
"baseline": {
|
|
"post": [],
|
|
"pre": []
|
|
},
|
|
"batch": {
|
|
"group": "unattended",
|
|
"ts": "2026-09-19T20:29:34Z"
|
|
},
|
|
"controller_pid": 3094,
|
|
"final_drift_mm": 0.0,
|
|
"fixture": {
|
|
"channels": [
|
|
"lid",
|
|
"interlock",
|
|
"button"
|
|
],
|
|
"hostname": "<REDACTED-1>",
|
|
"ip": "<IP-1>",
|
|
"released": []
|
|
},
|
|
"held_state": "Hold:0",
|
|
"idle_cpu_pct": 0.7,
|
|
"mode": {
|
|
"detail": "already in grbl mode",
|
|
"found": "grbl",
|
|
"needs": "grbl",
|
|
"ok": true,
|
|
"switched": false
|
|
},
|
|
"moved_mm": 30.0,
|
|
"moving_cpu_pct": 26.0,
|
|
"parked_cpu_pct": 1.0
|
|
},
|
|
"fingerprint": "313e232c35018b9118c52df54fe233ad65b41f59e58f21f5e1b502f8560690a5",
|
|
"image": "20260919202327 (dev)",
|
|
"log": [
|
|
"20:37:43 start motion.pacing (auto, api) in campaign c-20260919202934-3d3a",
|
|
"20:37:43 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
|
|
"20:37:43 fixture: <REDACTED-1> at <IP-1> covers lid, interlock, button",
|
|
"20:37:43 queued by the unattended queue opened 2026-09-19T20:29:34Z",
|
|
"20:37:43 baseline: pre: clean",
|
|
"20:37:43 mode: test needs grbl - already in grbl mode",
|
|
"20:37:43 connect: Idle",
|
|
"20:37:46 [1] idle CPU = 0.7%",
|
|
"20:37:48 [3] state=Run CPU during move = 26.0%",
|
|
"20:37:53 [2] Hold:0: CPU parked in Hold = 1.0%",
|
|
"20:37:54 [4] start X=0.000 end X=30.000 moved=30.000 (expect 30.0)",
|
|
"20:37:58 PASS: idle 0.7%, moving 26.0%, parked 1.0%, hold/resume exact",
|
|
"20:37:58 baseline: post: clean",
|
|
"20:37:58 result PASS"
|
|
],
|
|
"manifest_sha": "2d41354cdfb037d942fbe328e2ae0594efadd92e976d1c4512ca461b5f864a7e",
|
|
"message": "",
|
|
"result": "PASS",
|
|
"test": "motion.pacing",
|
|
"ts": "2026-09-19T20:37:58Z"
|
|
},
|
|
"requires": [
|
|
"kernel.latch-locked-idle"
|
|
],
|
|
"satisfied": true,
|
|
"source_sha": "68d3a7391a4962489d3f2463fb0ba9722321eab12740de47cb93b4d779080f0e",
|
|
"subsystem": "motion",
|
|
"title": "Protocol-loop pacing (idle, parked, moving) and hold/resume position"
|
|
},
|
|
{
|
|
"always": false,
|
|
"covers": [
|
|
[
|
|
"grblhal-glowforge",
|
|
"src/**"
|
|
],
|
|
[
|
|
"kernel-module-glowforge",
|
|
"**"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/super.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/liveness.*"
|
|
]
|
|
],
|
|
"fingerprint": "a1a0a18ea10d05c4be6a6e9112a070edcc93e383e49e1f69d9eb10eeb911cc6e",
|
|
"hardware": "api",
|
|
"id": "motion.jog-roundtrip",
|
|
"inherited": true,
|
|
"kind": "auto",
|
|
"record": {
|
|
"answers": [],
|
|
"campaign": "c-20260919202934-3d3a",
|
|
"duration_s": 14,
|
|
"evidence": {
|
|
"accel_moving_legs": [
|
|
"X sanity 40mm back",
|
|
"Y sanity 40mm out",
|
|
"X max-rate 60mm back",
|
|
"diag 40mm back"
|
|
],
|
|
"accel_overall": {
|
|
"errors": 0,
|
|
"p2p": [
|
|
2666,
|
|
1588
|
|
],
|
|
"samples": 17
|
|
},
|
|
"baseline": {
|
|
"post": [],
|
|
"pre": []
|
|
},
|
|
"batch": {
|
|
"group": "unattended",
|
|
"ts": "2026-09-19T20:29:34Z"
|
|
},
|
|
"drift_mm": 0.0,
|
|
"final": [
|
|
0.0,
|
|
0.0,
|
|
4.449
|
|
],
|
|
"fixture": {
|
|
"channels": [
|
|
"lid",
|
|
"interlock",
|
|
"button"
|
|
],
|
|
"hostname": "<REDACTED-1>",
|
|
"ip": "<IP-1>",
|
|
"released": []
|
|
},
|
|
"held_state": "Hold:0",
|
|
"max_rate_peak": 10500.0,
|
|
"mode": {
|
|
"detail": "already in grbl mode",
|
|
"found": "grbl",
|
|
"needs": "grbl",
|
|
"ok": true,
|
|
"switched": false
|
|
},
|
|
"moves": [
|
|
{
|
|
"accel_p2p": [
|
|
503,
|
|
452
|
|
],
|
|
"accel_samples": 2,
|
|
"leg": "out",
|
|
"name": "X sanity 40mm",
|
|
"peak": 2400.0,
|
|
"states": [
|
|
"Jog",
|
|
"Idle"
|
|
],
|
|
"t0": 1789850749.7691636,
|
|
"t1": 1789850750.8737097
|
|
},
|
|
{
|
|
"accel_p2p": [
|
|
1003,
|
|
649
|
|
],
|
|
"accel_samples": 3,
|
|
"leg": "back",
|
|
"name": "X sanity 40mm",
|
|
"peak": 2400.0,
|
|
"states": [
|
|
"Jog",
|
|
"Idle"
|
|
],
|
|
"t0": 1789850750.8739343,
|
|
"t1": 1789850751.976563
|
|
},
|
|
{
|
|
"accel_p2p": [
|
|
2360,
|
|
421
|
|
],
|
|
"accel_samples": 3,
|
|
"leg": "out",
|
|
"name": "Y sanity 40mm",
|
|
"peak": 2400.0,
|
|
"states": [
|
|
"Jog",
|
|
"Idle"
|
|
],
|
|
"t0": 1789850751.9768176,
|
|
"t1": 1789850753.0753016
|
|
},
|
|
{
|
|
"accel_p2p": [
|
|
556,
|
|
149
|
|
],
|
|
"accel_samples": 2,
|
|
"leg": "back",
|
|
"name": "Y sanity 40mm",
|
|
"peak": 2400.0,
|
|
"states": [
|
|
"Jog",
|
|
"Idle"
|
|
],
|
|
"t0": 1789850753.0755193,
|
|
"t1": 1789850754.1863184
|
|
},
|
|
{
|
|
"accel_p2p": [
|
|
186,
|
|
238
|
|
],
|
|
"accel_samples": 2,
|
|
"leg": "out",
|
|
"name": "X max-rate 60mm",
|
|
"peak": 10500.0,
|
|
"states": [
|
|
"Jog",
|
|
"Idle"
|
|
],
|
|
"t0": 1789850754.186522,
|
|
"t1": 1789850754.879082
|
|
},
|
|
{
|
|
"accel_p2p": [
|
|
1188,
|
|
53
|
|
],
|
|
"accel_samples": 2,
|
|
"leg": "back",
|
|
"name": "X max-rate 60mm",
|
|
"peak": 10500.0,
|
|
"states": [
|
|
"Jog",
|
|
"Idle"
|
|
],
|
|
"t0": 1789850754.8792872,
|
|
"t1": 1789850755.5707695
|
|
},
|
|
{
|
|
"accel_p2p": [
|
|
0,
|
|
0
|
|
],
|
|
"accel_samples": 1,
|
|
"leg": "out",
|
|
"name": "diag 40mm",
|
|
"peak": 8000.0,
|
|
"states": [
|
|
"Jog",
|
|
"Idle"
|
|
],
|
|
"t0": 1789850755.570979,
|
|
"t1": 1789850756.2731655
|
|
},
|
|
{
|
|
"accel_p2p": [
|
|
900,
|
|
908
|
|
],
|
|
"accel_samples": 2,
|
|
"leg": "back",
|
|
"name": "diag 40mm",
|
|
"peak": 8000.0,
|
|
"states": [
|
|
"Jog",
|
|
"Idle"
|
|
],
|
|
"t0": 1789850756.2733657,
|
|
"t1": 1789850756.966057
|
|
}
|
|
],
|
|
"start": [
|
|
0.0,
|
|
0.0,
|
|
4.449
|
|
]
|
|
},
|
|
"fingerprint": "a1a0a18ea10d05c4be6a6e9112a070edcc93e383e49e1f69d9eb10eeb911cc6e",
|
|
"image": "20260919202327 (dev)",
|
|
"log": [
|
|
"20:45:48 start motion.jog-roundtrip (auto, api) in campaign c-20260919202934-3d3a",
|
|
"20:45:49 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
|
|
"20:45:49 fixture: <REDACTED-1> at <IP-1> covers lid, interlock, button",
|
|
"20:45:49 queued by the unattended queue opened 2026-09-19T20:29:34Z",
|
|
"20:45:49 baseline: pre: clean",
|
|
"20:45:49 mode: test needs grbl - already in grbl mode",
|
|
"20:45:49 connect: Idle",
|
|
"20:45:50 X sanity 40mm out: peak 2400 mm/min, states ['Jog', 'Idle']; accel p2p x=503 y=452 over 2 samples",
|
|
"20:45:51 X sanity 40mm back: peak 2400 mm/min, states ['Jog', 'Idle']; accel p2p x=1003 y=649 over 3 samples",
|
|
"20:45:53 Y sanity 40mm out: peak 2400 mm/min, states ['Jog', 'Idle']; accel p2p x=2360 y=421 over 3 samples",
|
|
"20:45:54 Y sanity 40mm back: peak 2400 mm/min, states ['Jog', 'Idle']; accel p2p x=556 y=149 over 2 samples",
|
|
"20:45:54 X max-rate 60mm out: peak 10500 mm/min, states ['Jog', 'Idle']; accel p2p x=186 y=238 over 2 samples",
|
|
"20:45:55 X max-rate 60mm back: peak 10500 mm/min, states ['Jog', 'Idle']; accel p2p x=1188 y=53 over 2 samples",
|
|
"20:45:56 diag 40mm out: peak 8000 mm/min, states ['Jog', 'Idle']; accel p2p x=0 y=0 over 1 samples",
|
|
"20:45:56 diag 40mm back: peak 8000 mm/min, states ['Jog', 'Idle']; accel p2p x=900 y=908 over 2 samples",
|
|
"20:45:56 accel over all 8 legs: p2p x=2666 y=1588 (17 samples, 0 errors); motion seen on 4 legs",
|
|
"20:45:58 after !: Hold:0",
|
|
"20:46:00 after ~: states ['Run', 'Idle']",
|
|
"20:46:01 final drift 0.000 mm (start (0.0, 0.0, 4.449), final (0.0, 0.0, 4.449))",
|
|
"20:46:02 PASS: 8 jogs, peak 10500 mm/min, hold parked, drift 0.000 mm, accel p2p 2666 over the jogs, motion on 4 of 8 legs",
|
|
"20:46:03 baseline: post: clean",
|
|
"20:46:03 result PASS"
|
|
],
|
|
"manifest_sha": "2d41354cdfb037d942fbe328e2ae0594efadd92e976d1c4512ca461b5f864a7e",
|
|
"message": "",
|
|
"result": "PASS",
|
|
"test": "motion.jog-roundtrip",
|
|
"ts": "2026-09-19T20:46:03Z"
|
|
},
|
|
"requires": [
|
|
"kernel.latch-locked-idle"
|
|
],
|
|
"satisfied": true,
|
|
"source_sha": "552b84a92fc216a048433c9a4b80e2f537355c1993d45cf61384ace782c32c41",
|
|
"subsystem": "motion",
|
|
"title": "Motion quality: bounded jogs, max rate, diagonal, hold/resume"
|
|
},
|
|
{
|
|
"always": false,
|
|
"covers": [
|
|
[
|
|
"grblhal-glowforge",
|
|
"src/**"
|
|
],
|
|
[
|
|
"kernel-module-glowforge",
|
|
"**"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/super.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/liveness.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/main.c"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/settings.*"
|
|
]
|
|
],
|
|
"fingerprint": "c2fbe9607381168842646ee7023bb59cc9e410a30a9f7ee6414c16921e4b4511",
|
|
"hardware": "api",
|
|
"id": "motion.microstep-modes",
|
|
"inherited": true,
|
|
"kind": "auto",
|
|
"record": {
|
|
"answers": [],
|
|
"campaign": "c-20260919202934-3d3a",
|
|
"duration_s": 25,
|
|
"evidence": {
|
|
"baseline": {
|
|
"post": [],
|
|
"pre": []
|
|
},
|
|
"batch": {
|
|
"group": "unattended",
|
|
"ts": "2026-09-19T20:29:34Z"
|
|
},
|
|
"fixture": {
|
|
"channels": [
|
|
"lid",
|
|
"interlock",
|
|
"button"
|
|
],
|
|
"hostname": "<REDACTED-1>",
|
|
"ip": "<IP-1>",
|
|
"released": []
|
|
},
|
|
"mode": {
|
|
"detail": "already in grbl mode",
|
|
"found": "grbl",
|
|
"needs": "grbl",
|
|
"ok": true,
|
|
"switched": false
|
|
},
|
|
"modes": [
|
|
{
|
|
"$100": 53.333,
|
|
"$101": 53.333,
|
|
"accel_p2p": [
|
|
6715,
|
|
1062
|
|
],
|
|
"accel_samples": 6,
|
|
"drift_mm": 0.0,
|
|
"kernel_out_mm": 39.99,
|
|
"mode": 8,
|
|
"peak": 9578.0,
|
|
"sysfs": {
|
|
"cnc/ramp_rate": "125000",
|
|
"cnc/step_freq": "28160",
|
|
"cnc/x_mode": "8",
|
|
"cnc/y_mode": "8"
|
|
},
|
|
"typed_100": 53.333
|
|
},
|
|
{
|
|
"$100": 106.667,
|
|
"$101": 106.667,
|
|
"accel_p2p": [
|
|
4248,
|
|
1705
|
|
],
|
|
"accel_samples": 6,
|
|
"drift_mm": 0.0,
|
|
"kernel_out_mm": 40.0,
|
|
"mode": 16,
|
|
"peak": 9580.0,
|
|
"sysfs": {
|
|
"cnc/ramp_rate": "250000",
|
|
"cnc/step_freq": "56320",
|
|
"cnc/x_mode": "16",
|
|
"cnc/y_mode": "16"
|
|
},
|
|
"typed_100": 106.667
|
|
},
|
|
{
|
|
"$100": 213.33299,
|
|
"$101": 213.33299,
|
|
"accel_p2p": [
|
|
5135,
|
|
1448
|
|
],
|
|
"accel_samples": 6,
|
|
"drift_mm": 0.0,
|
|
"kernel_out_mm": 40.0,
|
|
"mode": 32,
|
|
"peak": 9579.0,
|
|
"sysfs": {
|
|
"cnc/ramp_rate": "500000",
|
|
"cnc/step_freq": "112640",
|
|
"cnc/x_mode": "32",
|
|
"cnc/y_mode": "32"
|
|
},
|
|
"typed_100": 213.33299
|
|
}
|
|
],
|
|
"xy_microsteps_after": "32",
|
|
"xy_microsteps_before": "32"
|
|
},
|
|
"fingerprint": "c2fbe9607381168842646ee7023bb59cc9e410a30a9f7ee6414c16921e4b4511",
|
|
"image": "20260919202327 (dev)",
|
|
"log": [
|
|
"20:46:03 start motion.microstep-modes (auto, api) in campaign c-20260919202934-3d3a",
|
|
"20:46:03 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
|
|
"20:46:03 fixture: <REDACTED-1> at <IP-1> covers lid, interlock, button",
|
|
"20:46:03 queued by the unattended queue opened 2026-09-19T20:29:34Z",
|
|
"20:46:03 baseline: pre: clean",
|
|
"20:46:03 mode: test needs grbl - already in grbl mode",
|
|
"20:46:03 --- x8 ---",
|
|
"20:46:05 baseline: /mode controller=running motion=verified",
|
|
"20:46:06 baseline: controller configured 1.0 s after running",
|
|
"20:46:07 connect: Idle",
|
|
"20:46:10 x8: out 39.990 mm by the kernel, peak 9578/9578 mm/min, drift 0.000 mm, accel p2p x=6715 y=1062 over 6 samples",
|
|
"20:46:10 --- x16 ---",
|
|
"20:46:13 baseline: /mode controller=running motion=verified",
|
|
"20:46:14 baseline: controller configured 1.0 s after running",
|
|
"20:46:14 connect: Idle",
|
|
"20:46:17 x16: out 40.000 mm by the kernel, peak 9580/9580 mm/min, drift 0.000 mm, accel p2p x=4248 y=1705 over 6 samples",
|
|
"20:46:17 --- x32 ---",
|
|
"20:46:20 baseline: /mode controller=running motion=verified",
|
|
"20:46:21 baseline: controller configured 1.0 s after running",
|
|
"20:46:21 connect: Idle",
|
|
"20:46:24 x32: out 40.000 mm by the kernel, peak 9579/9579 mm/min, drift 0.000 mm, accel p2p x=5135 y=1448 over 6 samples",
|
|
"20:46:26 baseline: /mode controller=running motion=verified",
|
|
"20:46:27 baseline: controller configured 1.0 s after running",
|
|
"20:46:28 PASS: x8: 39.990 mm, drift 0.000, accel 6715; x16: 40.000 mm, drift 0.000, accel 4248; x32: 40.000 mm, drift 0.000, accel 5135",
|
|
"20:46:28 baseline: post: clean",
|
|
"20:46:28 result PASS"
|
|
],
|
|
"manifest_sha": "2d41354cdfb037d942fbe328e2ae0594efadd92e976d1c4512ca461b5f864a7e",
|
|
"message": "",
|
|
"result": "PASS",
|
|
"test": "motion.microstep-modes",
|
|
"ts": "2026-09-19T20:46:28Z"
|
|
},
|
|
"requires": [
|
|
"motion.jog-roundtrip"
|
|
],
|
|
"satisfied": true,
|
|
"source_sha": "ae045b61bff5de50b1d56e50b1218dd6c17fc5c933672207406ca65c3b6eaecf",
|
|
"subsystem": "motion",
|
|
"title": "XY microstep modes: the setting drives the drivers, the scale and the tick"
|
|
},
|
|
{
|
|
"always": false,
|
|
"covers": [
|
|
[
|
|
"forgectrl",
|
|
"src/super.c"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/liveness.c"
|
|
],
|
|
[
|
|
"kernel-module-glowforge",
|
|
"**"
|
|
]
|
|
],
|
|
"fingerprint": "441f61bdffeeb16ef725975d64b17abcc634a613d8644310d5cdc2c0b32cca9e",
|
|
"hardware": "api",
|
|
"id": "motion.liveness-probe",
|
|
"inherited": true,
|
|
"kind": "auto",
|
|
"record": {
|
|
"answers": [],
|
|
"campaign": "c-20260919202934-3d3a",
|
|
"duration_s": 8,
|
|
"evidence": {
|
|
"baseline": {
|
|
"post": [],
|
|
"pre": []
|
|
},
|
|
"batch": {
|
|
"group": "unattended",
|
|
"ts": "2026-09-19T20:29:34Z"
|
|
},
|
|
"fixture": {
|
|
"channels": [
|
|
"lid",
|
|
"interlock",
|
|
"button"
|
|
],
|
|
"hostname": "<REDACTED-1>",
|
|
"ip": "<IP-1>",
|
|
"released": []
|
|
},
|
|
"masked_restart": {
|
|
"mode": {
|
|
"controller": "running",
|
|
"gated": false,
|
|
"local": false,
|
|
"mode": "grbl",
|
|
"motion": "verified",
|
|
"pid": 4070,
|
|
"why": ""
|
|
},
|
|
"motor_lock_after": "0",
|
|
"probe_lines": [
|
|
"2026-09-19T20:46:35.335779+00:00 forgectrl[4036] INFO super: liveness probe: MOTION OK - head accel p2p x=2054 y=1893 (moving>=800 dead<=250)"
|
|
]
|
|
},
|
|
"mode_after": {
|
|
"controller": "running",
|
|
"gated": false,
|
|
"local": false,
|
|
"mode": "grbl",
|
|
"motion": "verified",
|
|
"pid": 3975,
|
|
"why": ""
|
|
},
|
|
"mode_before": {
|
|
"controller": "running",
|
|
"gated": false,
|
|
"local": false,
|
|
"mode": "grbl",
|
|
"motion": "verified",
|
|
"pid": 3975,
|
|
"why": ""
|
|
}
|
|
},
|
|
"fingerprint": "441f61bdffeeb16ef725975d64b17abcc634a613d8644310d5cdc2c0b32cca9e",
|
|
"image": "20260919202327 (dev)",
|
|
"log": [
|
|
"20:46:28 start motion.liveness-probe (auto, api) in campaign c-20260919202934-3d3a",
|
|
"20:46:28 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
|
|
"20:46:28 fixture: <REDACTED-1> at <IP-1> covers lid, interlock, button",
|
|
"20:46:28 queued by the unattended queue opened 2026-09-19T20:29:34Z",
|
|
"20:46:28 baseline: pre: clean",
|
|
"20:46:28 mode: {'mode': 'grbl', 'controller': 'running', 'pid': 3975, 'motion': 'verified', 'gated': False, 'local': False, 'why': ''}",
|
|
"20:46:28 mode after: {'mode': 'grbl', 'controller': 'running', 'pid': 3975, 'motion': 'verified', 'gated': False, 'local': False, 'why': ''}",
|
|
"20:46:29 masked every axis (cnc/motor_lock=15); restarting forgectrl for a fresh probe",
|
|
"20:46:37 super: liveness probe: MOTION OK - head accel p2p x=2054 y=1893 (moving>=800 dead<=250)",
|
|
"20:46:37 kernel X 0.0 -> 0.0 mm across the probe (out and back)",
|
|
"20:46:37 PASS: masked restart probed MOTION OK on the first try, mask cleared, controller up",
|
|
"20:46:37 baseline: post: clean",
|
|
"20:46:37 result PASS"
|
|
],
|
|
"manifest_sha": "2d41354cdfb037d942fbe328e2ae0594efadd92e976d1c4512ca461b5f864a7e",
|
|
"message": "",
|
|
"result": "PASS",
|
|
"test": "motion.liveness-probe",
|
|
"ts": "2026-09-19T20:46:37Z"
|
|
},
|
|
"requires": [
|
|
"kernel.latch-locked-idle"
|
|
],
|
|
"satisfied": true,
|
|
"source_sha": "b7ecde6a0a2f24b0524fa51a35e4f3f92df52462f0e195af603801d3567635d1",
|
|
"subsystem": "motion",
|
|
"title": "Supervisor motion-liveness verdict"
|
|
},
|
|
{
|
|
"always": false,
|
|
"covers": [
|
|
[
|
|
"forgectrl",
|
|
"src/super.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/liveness.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/led.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/ui/panel.js"
|
|
]
|
|
],
|
|
"fingerprint": "916eefa411705f1f89159f6f50934cc04480ea22d6f721d200107f74dff446cc",
|
|
"hardware": "api",
|
|
"id": "motion.gate-waits-for-lid",
|
|
"inherited": true,
|
|
"kind": "operator",
|
|
"record": {
|
|
"answers": [],
|
|
"campaign": "c-20260919202934-3d3a",
|
|
"duration_s": 15,
|
|
"evidence": {
|
|
"actions": [
|
|
{
|
|
"by": "fixture",
|
|
"channel": "lid",
|
|
"state": "open",
|
|
"took_s": 0.04,
|
|
"ts": "2026-09-19T20:46:38Z"
|
|
},
|
|
{
|
|
"by": "fixture",
|
|
"channel": "lid",
|
|
"state": "close",
|
|
"took_s": 0.41,
|
|
"ts": "2026-09-19T20:46:45Z"
|
|
}
|
|
],
|
|
"after_close": {
|
|
"controller": "running",
|
|
"gated": false,
|
|
"local": false,
|
|
"mode": "grbl",
|
|
"motion": "verified",
|
|
"pid": 4154,
|
|
"why": ""
|
|
},
|
|
"baseline": {
|
|
"post": [],
|
|
"pre": []
|
|
},
|
|
"batch": {
|
|
"group": "unattended",
|
|
"ts": "2026-09-19T20:29:34Z"
|
|
},
|
|
"close_to_running_s": 6.5,
|
|
"fixture": {
|
|
"channels": [
|
|
"lid",
|
|
"interlock",
|
|
"button"
|
|
],
|
|
"hostname": "<REDACTED-1>",
|
|
"ip": "<IP-1>",
|
|
"released": []
|
|
},
|
|
"led_running": [
|
|
0,
|
|
0,
|
|
0
|
|
],
|
|
"led_waiting": [
|
|
255,
|
|
255,
|
|
0
|
|
],
|
|
"probe_lines": [
|
|
"2026-09-19T20:46:50.425761+00:00 forgectrl[4112] INFO super: liveness probe: MOTION OK - head accel p2p x=2415 y=1802 (moving>=800 dead<=250)"
|
|
],
|
|
"waiting": {
|
|
"controller": "waiting",
|
|
"gated": false,
|
|
"local": false,
|
|
"mode": "grbl",
|
|
"motion": "unverified",
|
|
"pid": 0,
|
|
"why": "the lid is open"
|
|
}
|
|
},
|
|
"fingerprint": "916eefa411705f1f89159f6f50934cc04480ea22d6f721d200107f74dff446cc",
|
|
"image": "20260919202327 (dev)",
|
|
"log": [
|
|
"20:46:37 start motion.gate-waits-for-lid (operator, api) in campaign c-20260919202934-3d3a",
|
|
"20:46:37 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
|
|
"20:46:37 fixture: <REDACTED-1> at <IP-1> covers lid, interlock, button",
|
|
"20:46:37 fixture: running unattended (no prompt can be answered)",
|
|
"20:46:37 queued by the unattended queue opened 2026-09-19T20:29:34Z",
|
|
"20:46:37 baseline: pre: clean",
|
|
"20:46:38 ACT lid open (fixture)",
|
|
"20:46:38 ACT lid open: done after 0.0 s",
|
|
"20:46:41 mode with the lid open: {'mode': 'grbl', 'controller': 'waiting', 'pid': 0, 'motion': 'unverified', 'gated': False, 'local': False, 'why': 'the lid is open'}",
|
|
"20:46:42 button LED targets while waiting (r, g, b): [255, 255, 0]",
|
|
"20:46:45 ACT lid close (fixture)",
|
|
"20:46:45 ACT lid close: done after 0.4 s",
|
|
"20:46:51 mode 6.5 s after the lid closed: {'mode': 'grbl', 'controller': 'running', 'pid': 4154, 'motion': 'verified', 'gated': False, 'local': False, 'why': ''}",
|
|
"20:46:53 baseline: post: clean",
|
|
"20:46:53 result PASS"
|
|
],
|
|
"manifest_sha": "2d41354cdfb037d942fbe328e2ae0594efadd92e976d1c4512ca461b5f864a7e",
|
|
"message": "",
|
|
"result": "PASS",
|
|
"test": "motion.gate-waits-for-lid",
|
|
"ts": "2026-09-19T20:46:53Z"
|
|
},
|
|
"requires": [
|
|
"motion.liveness-probe"
|
|
],
|
|
"satisfied": true,
|
|
"source_sha": "764eef4c0b9636931e70c75b30ccc2b55861aad33c560a230d9a4d36186565ff",
|
|
"subsystem": "motion",
|
|
"title": "The motion gate waits for the lid"
|
|
},
|
|
{
|
|
"always": false,
|
|
"covers": [
|
|
[
|
|
"grblhal-glowforge",
|
|
"src/**"
|
|
],
|
|
[
|
|
"kernel-module-glowforge",
|
|
"**"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/super.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/liveness.*"
|
|
]
|
|
],
|
|
"fingerprint": "695e68f28a54f43b9ab61fc43daf83d48325e14174630f4daaf0e8bec2eb6742",
|
|
"hardware": "api",
|
|
"id": "motion.cancel-abort",
|
|
"inherited": true,
|
|
"kind": "auto",
|
|
"record": {
|
|
"answers": [],
|
|
"campaign": "c-20260919202934-3d3a",
|
|
"duration_s": 7,
|
|
"evidence": {
|
|
"abort_drift_after_recovery_mm": 0.0,
|
|
"abort_moved_mm": 10.041,
|
|
"abort_returned_home": false,
|
|
"baseline": {
|
|
"post": [],
|
|
"pre": []
|
|
},
|
|
"batch": {
|
|
"group": "unattended",
|
|
"ts": "2026-09-19T20:29:34Z"
|
|
},
|
|
"cancel_moved_mm": 17.198,
|
|
"final_drift_mm": 0.0,
|
|
"fixture": {
|
|
"channels": [
|
|
"lid",
|
|
"interlock",
|
|
"button"
|
|
],
|
|
"hostname": "<REDACTED-1>",
|
|
"ip": "<IP-1>",
|
|
"released": []
|
|
},
|
|
"mode": {
|
|
"detail": "already in grbl mode",
|
|
"found": "grbl",
|
|
"needs": "grbl",
|
|
"ok": true,
|
|
"switched": false
|
|
}
|
|
},
|
|
"fingerprint": "695e68f28a54f43b9ab61fc43daf83d48325e14174630f4daaf0e8bec2eb6742",
|
|
"image": "20260919202327 (dev)",
|
|
"log": [
|
|
"20:46:53 start motion.cancel-abort (auto, api) in campaign c-20260919202934-3d3a",
|
|
"20:46:53 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
|
|
"20:46:53 fixture: <REDACTED-1> at <IP-1> covers lid, interlock, button",
|
|
"20:46:53 queued by the unattended queue opened 2026-09-19T20:29:34Z",
|
|
"20:46:53 baseline: pre: clean",
|
|
"20:46:53 mode: test needs grbl - already in grbl mode",
|
|
"20:46:54 connect: Idle",
|
|
"20:46:55 jog cancel: moved 17.198 mm of 40 (state Idle)",
|
|
"20:46:56 ^X abort: state Alarm, moved 10.041 mm of 30, position retained (27.239, 0.0, 4.449)",
|
|
"20:46:56 $X -> ['ALARM:3', \"GrblHAL 1.1f ['$' or '$HELP' for help]\", \"[MSG:'$H'|'$X' to unlock]\", '[MSG:Caution: Unlocked]', 'ok']",
|
|
"20:46:59 after $X: (27.239, 0.0, 4.449) (moved 0.000 mm since the abort)",
|
|
"20:46:59 returned: drift 0.000 mm",
|
|
"20:47:00 baseline: post: clean",
|
|
"20:47:00 result PASS"
|
|
],
|
|
"manifest_sha": "2d41354cdfb037d942fbe328e2ae0594efadd92e976d1c4512ca461b5f864a7e",
|
|
"message": "",
|
|
"result": "PASS",
|
|
"test": "motion.cancel-abort",
|
|
"ts": "2026-09-19T20:47:00Z"
|
|
},
|
|
"requires": [
|
|
"motion.pacing"
|
|
],
|
|
"satisfied": true,
|
|
"source_sha": "065ca064b95c260d3f0c55181381125c926df70efafc092958c87866d3b5f8ac",
|
|
"subsystem": "motion",
|
|
"title": "Jog cancel and controlled abort recover cleanly"
|
|
},
|
|
{
|
|
"always": false,
|
|
"covers": [
|
|
[
|
|
"grblhal-glowforge",
|
|
"src/**"
|
|
],
|
|
[
|
|
"kernel-module-glowforge",
|
|
"**"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/super.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/liveness.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/main.c"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"init/**"
|
|
]
|
|
],
|
|
"fingerprint": "de56afb99821404b19568ee711d9023c59bae47e68bbde49739590b98a7f210a",
|
|
"hardware": "api",
|
|
"id": "motion.deadman",
|
|
"inherited": true,
|
|
"kind": "auto",
|
|
"record": {
|
|
"answers": [],
|
|
"campaign": "c-20260919202934-3d3a",
|
|
"duration_s": 46,
|
|
"evidence": {
|
|
"baseline": {
|
|
"post": [],
|
|
"pre": []
|
|
},
|
|
"batch": {
|
|
"group": "unattended",
|
|
"ts": "2026-09-19T20:29:34Z"
|
|
},
|
|
"fixture": {
|
|
"channels": [
|
|
"lid",
|
|
"interlock",
|
|
"button"
|
|
],
|
|
"hostname": "<REDACTED-1>",
|
|
"ip": "<IP-1>",
|
|
"released": []
|
|
},
|
|
"homing_kill": {
|
|
"homing_mode": "gfcloud",
|
|
"kernel_state_at_respawn": "idle",
|
|
"mode_after": {
|
|
"controller": "running",
|
|
"gated": false,
|
|
"local": false,
|
|
"mode": "grbl",
|
|
"motion": "verified",
|
|
"pid": 4362,
|
|
"why": ""
|
|
},
|
|
"pulse_holders": [
|
|
"forgectrl",
|
|
"grblHAL_glowfor"
|
|
],
|
|
"respawn_s": 2.0,
|
|
"runner_gone_s": 1.9809107780456543,
|
|
"super_lines": [
|
|
"2026-09-19T20:47:44.983736+00:00 forgectrl[4284] WARNING super: the homing runner outlived its controller - stopping it"
|
|
]
|
|
},
|
|
"mode": {
|
|
"detail": "already in grbl mode",
|
|
"found": "grbl",
|
|
"needs": "grbl",
|
|
"ok": true,
|
|
"switched": false
|
|
},
|
|
"restart": {
|
|
"mode_after": {
|
|
"controller": "running",
|
|
"gated": false,
|
|
"local": false,
|
|
"mode": "grbl",
|
|
"motion": "verified",
|
|
"pid": 4325,
|
|
"why": ""
|
|
},
|
|
"rc": 0,
|
|
"replaced_at_idle": true,
|
|
"states": [
|
|
"Run",
|
|
"Idle"
|
|
]
|
|
},
|
|
"short_stall": {
|
|
"kernel_dx_mm": 30.0,
|
|
"state_after": "Idle",
|
|
"states": [
|
|
"Run",
|
|
"Idle"
|
|
],
|
|
"underruns": 0,
|
|
"warning": "2026-09-19T20:47:18.106979+00:00 grblhal[4226] WARNING gfstream: run: 91 late events clamped (max behind 91.4 ms, lead 10 ms) - step generation was starved of CPU"
|
|
},
|
|
"sigkill": {
|
|
"new": {
|
|
"controller": "running",
|
|
"gated": false,
|
|
"local": false,
|
|
"mode": "grbl",
|
|
"motion": "verified",
|
|
"pid": 4226,
|
|
"why": ""
|
|
},
|
|
"old_pid": 4154,
|
|
"respawn_s": 1.3,
|
|
"unlocked_seen": false
|
|
},
|
|
"sigstop": {
|
|
"after": {
|
|
"controller": "running",
|
|
"gated": false,
|
|
"local": false,
|
|
"mode": "grbl",
|
|
"motion": "verified",
|
|
"pid": 4226,
|
|
"why": ""
|
|
},
|
|
"halt_s": 0.21,
|
|
"kernel_state": "underrun",
|
|
"latch_locked": true,
|
|
"recovery_states": [
|
|
"Jog",
|
|
"Idle"
|
|
],
|
|
"ring_free_after_reset": 33521664,
|
|
"state_after_cont": "Alarm",
|
|
"underruns": 2,
|
|
"unlock_after_reset": [
|
|
"[MSG:Caution: Unlocked]",
|
|
"ok"
|
|
],
|
|
"unlock_before_reset": [
|
|
"ALARM:17",
|
|
"error:79"
|
|
]
|
|
}
|
|
},
|
|
"fingerprint": "de56afb99821404b19568ee711d9023c59bae47e68bbde49739590b98a7f210a",
|
|
"image": "20260919202327 (dev)",
|
|
"log": [
|
|
"20:47:00 start motion.deadman (auto, api) in campaign c-20260919202934-3d3a",
|
|
"20:47:01 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
|
|
"20:47:01 fixture: <REDACTED-1> at <IP-1> covers lid, interlock, button",
|
|
"20:47:01 queued by the unattended queue opened 2026-09-19T20:29:34Z",
|
|
"20:47:01 baseline: pre: clean",
|
|
"20:47:01 mode: test needs grbl - already in grbl mode",
|
|
"20:47:01 connect: Idle",
|
|
"20:47:02 SIGKILL sent to controller pid 4154 mid-move",
|
|
"20:47:04 after SIGKILL: respawned as {'mode': 'grbl', 'controller': 'running', 'pid': 4226, 'motion': 'verified', 'gated': False, 'local': False, 'why': ''} in 1.3 s; latch unlocked seen: False",
|
|
"20:47:07 kernel X: 0.0 -> 0.0 mm",
|
|
"20:47:07 connect: Idle",
|
|
"20:47:08 SIGSTOP sent to controller pid 4226 mid-move",
|
|
"20:47:08 after SIGSTOP: kernel underrun in 0.21 s, latch locked True, underruns 1 -> 2",
|
|
"20:47:09 controller resumed: state Alarm",
|
|
"20:47:09 $X before the reset: ['ALARM:17', 'error:79']",
|
|
"20:47:12 after the soft reset: Alarm",
|
|
"20:47:12 $X after the reset: ['[MSG:Caution: Unlocked]', 'ok']",
|
|
"20:47:12 ring after the reset: free 33521664 (idle 33521664)",
|
|
"20:47:16 connect: Idle",
|
|
"20:47:18 SIGSTOP 100 ms sent to controller pid 4226 mid-move",
|
|
"20:47:23 short stall: states ['Run', 'Idle'], underruns +0, warning '2026-09-19T20:47:18.106979+00:00 grblhal[4226] WARNING gfstream: run: 91 late events clamped (max behind 91.4 ms, lead 10 ms) - step generation was starved of CPU', kernel dx 30.0 mm",
|
|
"20:47:26 connect: Idle",
|
|
"20:47:28 forgectrl restart mid-move -> rc 0",
|
|
"20:47:32 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
|
|
"20:47:32 move after the restart: states ['Run', 'Idle']",
|
|
"20:47:40 mode after restart: {'mode': 'grbl', 'controller': 'running', 'pid': 4325, 'motion': 'verified', 'gated': False, 'local': False, 'why': ''}",
|
|
"20:47:40 retake: unmanaged pid 4226 finished the move; supervised pid 4325 started at idle",
|
|
"20:47:41 connect: Idle",
|
|
"20:47:44 SIGKILL sent to controller pid 4325 during $H (runner pid [4336])",
|
|
"20:47:46 kill during $H: runner gone in 1.9809107780456543 s, respawned as 4362, kernel idle, pulse held by ['forgectrl', 'grblHAL_glowfor']",
|
|
"20:47:46 PASS: kill respawned in 1.3 s, hang -> underrun in 0.21 s, short stall warned and completed, restart retook supervision (pid 4325), the kill during $H ended the runner (1.9809107780456543)",
|
|
"20:47:47 baseline: post: clean",
|
|
"20:47:47 result PASS"
|
|
],
|
|
"manifest_sha": "2d41354cdfb037d942fbe328e2ae0594efadd92e976d1c4512ca461b5f864a7e",
|
|
"message": "",
|
|
"result": "PASS",
|
|
"test": "motion.deadman",
|
|
"ts": "2026-09-19T20:47:47Z"
|
|
},
|
|
"requires": [
|
|
"motion.cancel-abort",
|
|
"kernel.k1-k2"
|
|
],
|
|
"satisfied": true,
|
|
"source_sha": "c08572336810d181b90e4dcd9dbed69e3e952df4646fd0c7f6289da9d6f0e598",
|
|
"subsystem": "motion",
|
|
"title": "Dead-man: controller kill, controller hang, forgectrl restart mid-move, a kill during the web-service homing"
|
|
},
|
|
{
|
|
"always": false,
|
|
"covers": [
|
|
[
|
|
"grblhal-glowforge",
|
|
"src/**"
|
|
],
|
|
[
|
|
"kernel-module-glowforge",
|
|
"**"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/super.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/liveness.*"
|
|
]
|
|
],
|
|
"fingerprint": "74cc22ff86f6a56032138ad972bf91eaba82bdc06fcc5df47bddfa515cf922b0",
|
|
"hardware": "api",
|
|
"id": "motion.respawn-gate",
|
|
"inherited": true,
|
|
"kind": "operator",
|
|
"record": {
|
|
"answers": [],
|
|
"campaign": "c-20260919202934-3d3a",
|
|
"duration_s": 8,
|
|
"evidence": {
|
|
"actions": [
|
|
{
|
|
"by": "fixture",
|
|
"channel": "lid",
|
|
"state": "open",
|
|
"took_s": 0.04,
|
|
"ts": "2026-09-19T20:47:47Z"
|
|
},
|
|
{
|
|
"by": "fixture",
|
|
"channel": "lid",
|
|
"state": "close",
|
|
"took_s": 0.36,
|
|
"ts": "2026-09-19T20:47:55Z"
|
|
}
|
|
],
|
|
"after_close": {
|
|
"mode": {
|
|
"controller": "running",
|
|
"gated": false,
|
|
"local": false,
|
|
"mode": "grbl",
|
|
"motion": "verified",
|
|
"pid": 4408,
|
|
"why": ""
|
|
},
|
|
"running_s": 0.01127004623413086
|
|
},
|
|
"after_kill": {
|
|
"mode": {
|
|
"controller": "waiting",
|
|
"gated": false,
|
|
"local": false,
|
|
"mode": "grbl",
|
|
"motion": "verified",
|
|
"pid": 0,
|
|
"why": "the lid is open"
|
|
},
|
|
"waiting_s": 2.296966075897217
|
|
},
|
|
"baseline": {
|
|
"post": [],
|
|
"pre": []
|
|
},
|
|
"batch": {
|
|
"group": "unattended",
|
|
"ts": "2026-09-19T20:29:34Z"
|
|
},
|
|
"fixture": {
|
|
"channels": [
|
|
"lid",
|
|
"interlock",
|
|
"button"
|
|
],
|
|
"hostname": "<REDACTED-1>",
|
|
"ip": "<IP-1>",
|
|
"released": []
|
|
},
|
|
"mode": {
|
|
"detail": "already in grbl mode",
|
|
"found": "grbl",
|
|
"needs": "grbl",
|
|
"ok": true,
|
|
"switched": false
|
|
},
|
|
"probe_lines": []
|
|
},
|
|
"fingerprint": "74cc22ff86f6a56032138ad972bf91eaba82bdc06fcc5df47bddfa515cf922b0",
|
|
"image": "20260919202327 (dev)",
|
|
"log": [
|
|
"20:47:47 start motion.respawn-gate (operator, api) in campaign c-20260919202934-3d3a",
|
|
"20:47:47 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
|
|
"20:47:47 fixture: <REDACTED-1> at <IP-1> covers lid, interlock, button",
|
|
"20:47:47 fixture: running unattended (no prompt can be answered)",
|
|
"20:47:47 queued by the unattended queue opened 2026-09-19T20:29:34Z",
|
|
"20:47:47 baseline: pre: clean",
|
|
"20:47:47 mode: test needs grbl - already in grbl mode",
|
|
"20:47:47 ACT lid open (fixture)",
|
|
"20:47:47 ACT lid open: done after 0.0 s",
|
|
"20:47:48 SIGKILL sent to controller pid 4362 with the lid open",
|
|
"20:47:51 mode 2.3 s after the kill: {'mode': 'grbl', 'controller': 'waiting', 'pid': 0, 'motion': 'verified', 'gated': False, 'local': False, 'why': 'the lid is open'}",
|
|
"20:47:55 ACT lid close (fixture)",
|
|
"20:47:55 ACT lid close: done after 0.4 s",
|
|
"20:47:55 mode 0.0 s after the lid closed: {'mode': 'grbl', 'controller': 'running', 'pid': 4408, 'motion': 'verified', 'gated': False, 'local': False, 'why': ''}",
|
|
"20:47:55 PASS: the respawn waited 6.7 s for the lid, then came back verified in 0.0 s with no probe",
|
|
"20:47:55 baseline: leds/button_led_1: target 0, brightness 124; the fade from a level the machine itself ended, not a leftover",
|
|
"20:47:55 baseline: leds/button_led_2: target 0, brightness 124; the fade from a level the machine itself ended, not a leftover",
|
|
"20:47:55 baseline: post: clean",
|
|
"20:47:55 result PASS"
|
|
],
|
|
"manifest_sha": "2d41354cdfb037d942fbe328e2ae0594efadd92e976d1c4512ca461b5f864a7e",
|
|
"message": "",
|
|
"result": "PASS",
|
|
"test": "motion.respawn-gate",
|
|
"ts": "2026-09-19T20:47:55Z"
|
|
},
|
|
"requires": [
|
|
"motion.deadman",
|
|
"motion.gate-waits-for-lid"
|
|
],
|
|
"satisfied": true,
|
|
"source_sha": "a589d00198a65f42da10a0ae62caa66a0b6f36b66b0f2e683adf40641ccc8340",
|
|
"subsystem": "motion",
|
|
"title": "A respawn waits for the lid the way a first spawn does"
|
|
},
|
|
{
|
|
"always": false,
|
|
"covers": [
|
|
[
|
|
"grblhal-glowforge",
|
|
"src/**"
|
|
],
|
|
[
|
|
"kernel-module-glowforge",
|
|
"**"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/super.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/liveness.*"
|
|
]
|
|
],
|
|
"fingerprint": "a445afc8c538ae6ac9bbe459f002d515295357487c8f92a278d6685ba6db77d7",
|
|
"hardware": "api",
|
|
"id": "motion.soft-limits",
|
|
"inherited": true,
|
|
"kind": "auto",
|
|
"record": {
|
|
"answers": [],
|
|
"campaign": "c-20260919202934-3d3a",
|
|
"duration_s": 18,
|
|
"evidence": {
|
|
"baseline": {
|
|
"post": [],
|
|
"pre": []
|
|
},
|
|
"batch": {
|
|
"group": "unattended",
|
|
"ts": "2026-09-19T20:29:34Z"
|
|
},
|
|
"fixture": {
|
|
"channels": [
|
|
"lid",
|
|
"interlock",
|
|
"button"
|
|
],
|
|
"hostname": "<REDACTED-1>",
|
|
"ip": "<IP-1>",
|
|
"released": []
|
|
},
|
|
"inside": [
|
|
"Run",
|
|
"Idle"
|
|
],
|
|
"jog": [
|
|
"error:15"
|
|
],
|
|
"kernel_back_mm": [
|
|
0.0,
|
|
0.0
|
|
],
|
|
"mode": {
|
|
"detail": "already in grbl mode",
|
|
"found": "grbl",
|
|
"needs": "grbl",
|
|
"ok": true,
|
|
"switched": false
|
|
},
|
|
"refused": [
|
|
{
|
|
"alarm": true,
|
|
"cmd": "G90 G1 X500.0 F600",
|
|
"moved_mm": 0.0,
|
|
"reply": [
|
|
"ALARM:2",
|
|
"[MSG:Reset to continue]"
|
|
],
|
|
"state": "Alarm"
|
|
},
|
|
{
|
|
"alarm": true,
|
|
"cmd": "G90 G1 Y284.0 F600",
|
|
"moved_mm": 0.0,
|
|
"reply": [
|
|
"ALARM:2",
|
|
"[MSG:Reset to continue]"
|
|
],
|
|
"state": "Alarm"
|
|
},
|
|
{
|
|
"alarm": true,
|
|
"cmd": "G90 G1 X-1 F600",
|
|
"moved_mm": 0.0,
|
|
"reply": [
|
|
"ALARM:2",
|
|
"[MSG:Reset to continue]"
|
|
],
|
|
"state": "Alarm"
|
|
}
|
|
],
|
|
"travel": {
|
|
"x": 495.0,
|
|
"y": 279.0
|
|
}
|
|
},
|
|
"fingerprint": "a445afc8c538ae6ac9bbe459f002d515295357487c8f92a278d6685ba6db77d7",
|
|
"image": "20260919202327 (dev)",
|
|
"log": [
|
|
"20:49:38 start motion.soft-limits (auto, api) in campaign c-20260919202934-3d3a",
|
|
"20:49:39 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
|
|
"20:49:39 fixture: <REDACTED-1> at <IP-1> covers lid, interlock, button",
|
|
"20:49:39 queued by the unattended queue opened 2026-09-19T20:29:34Z",
|
|
"20:49:39 baseline: pre: clean",
|
|
"20:49:39 mode: test needs grbl - already in grbl mode",
|
|
"20:49:39 connect: Idle",
|
|
"20:49:42 {'cmd': 'G90 G1 X500.0 F600', 'reply': ['ALARM:2', '[MSG:Reset to continue]'], 'alarm': True, 'moved_mm': 0.0, 'state': 'Alarm'}",
|
|
"20:49:47 {'cmd': 'G90 G1 Y284.0 F600', 'reply': ['ALARM:2', '[MSG:Reset to continue]'], 'alarm': True, 'moved_mm': 0.0, 'state': 'Alarm'}",
|
|
"20:49:51 {'cmd': 'G90 G1 X-1 F600', 'reply': ['ALARM:2', '[MSG:Reset to continue]'], 'alarm': True, 'moved_mm': 0.0, 'state': 'Alarm'}",
|
|
"20:49:56 PASS: X max, Y max and X min refused with ALARM:2 and no motion, the jog refused with error 15, a move inside the bed ran",
|
|
"20:49:56 baseline: post: clean",
|
|
"20:49:56 result PASS"
|
|
],
|
|
"manifest_sha": "2d41354cdfb037d942fbe328e2ae0594efadd92e976d1c4512ca461b5f864a7e",
|
|
"message": "",
|
|
"result": "PASS",
|
|
"test": "motion.soft-limits",
|
|
"ts": "2026-09-19T20:49:56Z"
|
|
},
|
|
"requires": [
|
|
"motion.jog-roundtrip",
|
|
"cloud.mode-switch"
|
|
],
|
|
"satisfied": true,
|
|
"source_sha": "2a3c643967e5768c6d152f4852dda6284a97f259e054b5bdf294bbfd756bf74c",
|
|
"subsystem": "motion",
|
|
"title": "After a home the bed is the X/Y envelope"
|
|
},
|
|
{
|
|
"always": false,
|
|
"covers": [
|
|
[
|
|
"grblhal-glowforge",
|
|
"src/**"
|
|
],
|
|
[
|
|
"kernel-module-glowforge",
|
|
"**"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/super.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/liveness.*"
|
|
],
|
|
[
|
|
"grblhal-glowforge",
|
|
"src/glowforge_switches.c"
|
|
],
|
|
[
|
|
"grblhal-glowforge",
|
|
"src/glowforge_switch_map.h"
|
|
],
|
|
[
|
|
"grblhal-glowforge",
|
|
"src/glowforge_laser.c"
|
|
]
|
|
],
|
|
"fingerprint": "17ed468e9dc924952793d87120179622756f7f5474c06a8ab9e00dee15418a04",
|
|
"hardware": "api",
|
|
"id": "motion.button-hold-resume",
|
|
"inherited": true,
|
|
"kind": "operator",
|
|
"record": {
|
|
"answers": [],
|
|
"campaign": "c-20260919202934-3d3a",
|
|
"duration_s": 11,
|
|
"evidence": {
|
|
"actions": [
|
|
{
|
|
"by": "fixture",
|
|
"channel": "button",
|
|
"state": "press",
|
|
"took_s": 0.12,
|
|
"ts": "2026-09-19T20:49:58Z"
|
|
},
|
|
{
|
|
"by": "fixture",
|
|
"channel": "button",
|
|
"state": "press",
|
|
"took_s": 0.13,
|
|
"ts": "2026-09-19T20:49:58Z"
|
|
}
|
|
],
|
|
"baseline": {
|
|
"post": [],
|
|
"pre": []
|
|
},
|
|
"batch": {
|
|
"group": "unattended",
|
|
"ts": "2026-09-19T20:29:34Z"
|
|
},
|
|
"fixture": {
|
|
"channels": [
|
|
"lid",
|
|
"interlock",
|
|
"button"
|
|
],
|
|
"hostname": "<REDACTED-1>",
|
|
"ip": "<IP-1>",
|
|
"released": []
|
|
},
|
|
"held_at_mm": 1.195,
|
|
"held_state": "Hold:0",
|
|
"mode": {
|
|
"detail": "already in grbl mode",
|
|
"found": "grbl",
|
|
"needs": "grbl",
|
|
"ok": true,
|
|
"switched": false
|
|
},
|
|
"move_start": [
|
|
{
|
|
"after_s": 0.05,
|
|
"line": "G1X40F300",
|
|
"reply": [
|
|
"ok"
|
|
],
|
|
"state": "Run"
|
|
}
|
|
],
|
|
"moved_mm": 39.999,
|
|
"pause_message": true,
|
|
"resume_message": true,
|
|
"state_after_resume": "Run"
|
|
},
|
|
"fingerprint": "17ed468e9dc924952793d87120179622756f7f5474c06a8ab9e00dee15418a04",
|
|
"image": "20260919202327 (dev)",
|
|
"log": [
|
|
"20:49:57 start motion.button-hold-resume (operator, api) in campaign c-20260919202934-3d3a",
|
|
"20:49:57 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
|
|
"20:49:57 fixture: <REDACTED-1> at <IP-1> covers lid, interlock, button",
|
|
"20:49:57 fixture: running unattended (no prompt can be answered)",
|
|
"20:49:57 queued by the unattended queue opened 2026-09-19T20:29:34Z",
|
|
"20:49:57 baseline: pre: clean",
|
|
"20:49:57 mode: test needs grbl - already in grbl mode",
|
|
"20:49:58 connect: Idle",
|
|
"20:49:58 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:49:58 ACT button press (fixture)",
|
|
"20:49:58 ACT button press: done after 0.1 s",
|
|
"20:49:58 held: Hold:0 at 1.195 mm of 40; message seen: True",
|
|
"20:49:58 ACT button press (fixture)",
|
|
"20:49:59 ACT button press: done after 0.1 s",
|
|
"20:49:59 resumed: Run; message seen: True",
|
|
"20:50:06 move completed after pause/resume: 39.999 mm of 40",
|
|
"20:50:08 PASS: button press held the job (Hold:0), the next press resumed it, target reached",
|
|
"20:50:08 baseline: post: clean",
|
|
"20:50:08 result PASS"
|
|
],
|
|
"manifest_sha": "2d41354cdfb037d942fbe328e2ae0594efadd92e976d1c4512ca461b5f864a7e",
|
|
"message": "",
|
|
"result": "PASS",
|
|
"test": "motion.button-hold-resume",
|
|
"ts": "2026-09-19T20:50:08Z"
|
|
},
|
|
"requires": [
|
|
"motion.pacing"
|
|
],
|
|
"satisfied": true,
|
|
"source_sha": "6da5e94dd6a498f51f31a6d66e2ba06bbf983a4f636aa6d7080f4a2d0f929bf6",
|
|
"subsystem": "motion",
|
|
"title": "The button pauses and resumes a job"
|
|
},
|
|
{
|
|
"always": false,
|
|
"covers": [
|
|
[
|
|
"grblhal-glowforge",
|
|
"src/**"
|
|
],
|
|
[
|
|
"kernel-module-glowforge",
|
|
"**"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/super.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/liveness.*"
|
|
],
|
|
[
|
|
"grblhal-glowforge",
|
|
"src/glowforge_switches.c"
|
|
],
|
|
[
|
|
"grblhal-glowforge",
|
|
"src/glowforge_switch_map.h"
|
|
],
|
|
[
|
|
"grblhal-glowforge",
|
|
"src/glowforge_laser.c"
|
|
]
|
|
],
|
|
"fingerprint": "a4d5dc6394af6d50613d85d314209fa4805a011b1b871ffbbaca692caceb2bcf",
|
|
"hardware": "api",
|
|
"id": "motion.lid-cancel-home",
|
|
"inherited": true,
|
|
"kind": "operator",
|
|
"record": {
|
|
"answers": [],
|
|
"campaign": "c-20260919202934-3d3a",
|
|
"duration_s": 15,
|
|
"evidence": {
|
|
"actions": [
|
|
{
|
|
"by": "fixture",
|
|
"channel": "lid",
|
|
"state": "open",
|
|
"took_s": 0.05,
|
|
"ts": "2026-09-19T20:50:09Z"
|
|
},
|
|
{
|
|
"by": "fixture",
|
|
"channel": "lid",
|
|
"state": "close",
|
|
"took_s": 0.33,
|
|
"ts": "2026-09-19T20:50:13Z"
|
|
},
|
|
{
|
|
"by": "fixture",
|
|
"channel": "button",
|
|
"state": "press",
|
|
"took_s": 0.11,
|
|
"ts": "2026-09-19T20:50:16Z"
|
|
},
|
|
{
|
|
"by": "fixture",
|
|
"channel": "lid",
|
|
"state": "open",
|
|
"took_s": 0.04,
|
|
"ts": "2026-09-19T20:50:17Z"
|
|
},
|
|
{
|
|
"by": "fixture",
|
|
"channel": "lid",
|
|
"state": "close",
|
|
"took_s": 0.34,
|
|
"ts": "2026-09-19T20:50:20Z"
|
|
}
|
|
],
|
|
"baseline": {
|
|
"post": [],
|
|
"pre": []
|
|
},
|
|
"batch": {
|
|
"group": "unattended",
|
|
"ts": "2026-09-19T20:29:34Z"
|
|
},
|
|
"fixture": {
|
|
"channels": [
|
|
"lid",
|
|
"interlock",
|
|
"button"
|
|
],
|
|
"hostname": "<REDACTED-1>",
|
|
"ip": "<IP-1>",
|
|
"released": []
|
|
},
|
|
"hold_drift_mm": 0.037,
|
|
"hold_kernel_drift_mm": 0.03,
|
|
"hold_messages": [
|
|
"[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]"
|
|
],
|
|
"hold_pause_message": true,
|
|
"hold_returned_message": true,
|
|
"hold_start": [
|
|
0.038,
|
|
0.0,
|
|
3.08
|
|
],
|
|
"hold_state": "Hold:0",
|
|
"kernel_start": [
|
|
0.0,
|
|
0.0
|
|
],
|
|
"lid_at_return": false,
|
|
"lid_policy": "cancel",
|
|
"mode": {
|
|
"detail": "already in grbl mode",
|
|
"found": "grbl",
|
|
"needs": "grbl",
|
|
"ok": true,
|
|
"switched": false
|
|
},
|
|
"move_start": [
|
|
{
|
|
"after_s": 0.05,
|
|
"line": "G1X40F300",
|
|
"reply": [
|
|
"ok"
|
|
],
|
|
"state": "Run"
|
|
}
|
|
],
|
|
"running_drift_mm": 0.038,
|
|
"running_kernel_drift_mm": 0.04,
|
|
"running_messages": [
|
|
"[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]"
|
|
],
|
|
"running_returned_message": true,
|
|
"start": [
|
|
0.0,
|
|
0.0,
|
|
3.08
|
|
]
|
|
},
|
|
"fingerprint": "a4d5dc6394af6d50613d85d314209fa4805a011b1b871ffbbaca692caceb2bcf",
|
|
"image": "20260919202327 (dev)",
|
|
"log": [
|
|
"20:50:08 start motion.lid-cancel-home (operator, api) in campaign c-20260919202934-3d3a",
|
|
"20:50:09 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
|
|
"20:50:09 fixture: <REDACTED-1> at <IP-1> covers lid, interlock, button",
|
|
"20:50:09 fixture: running unattended (no prompt can be answered)",
|
|
"20:50:09 queued by the unattended queue opened 2026-09-19T20:29:34Z",
|
|
"20:50:09 baseline: pre: clean",
|
|
"20:50:09 mode: test needs grbl - already in grbl mode",
|
|
"20:50:09 connect: Idle",
|
|
"20:50:09 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:50:09 ACT lid open (fixture)",
|
|
"20:50:10 ACT lid open: done after 0.1 s",
|
|
"20:50:13 [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:50:13 [running] back at the job start: drift 0.038 mm",
|
|
"20:50:13 kernel counters: start (0.00, 0.00) -> now (0.04, 0.00), drift 0.040 mm",
|
|
"20:50:13 ACT lid close (fixture)",
|
|
"20:50:13 ACT lid close: done after 0.3 s",
|
|
"20:50:16 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:50:16 ACT button press (fixture)",
|
|
"20:50:16 ACT button press: done after 0.1 s",
|
|
"20:50:16 paused: Hold:0; message seen: True",
|
|
"20:50:17 ACT lid open (fixture)",
|
|
"20:50:17 ACT lid open: done after 0.0 s",
|
|
"20:50:20 [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:50:20 [hold] back at the job start: drift 0.037 mm",
|
|
"20:50:20 kernel counters: start (0.04, 0.00) -> now (0.07, 0.00), drift 0.030 mm",
|
|
"20:50:20 ACT lid close (fixture)",
|
|
"20:50:20 ACT lid close: done after 0.3 s",
|
|
"20:50:23 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:50:24 baseline: position: [16, 0, 0] (expected [0, 0, 0]) -> failed: counters read [16, 0, 0] after the return jog; inside the 0.10 mm dead band, not a leftover",
|
|
"20:50:24 baseline: post: clean",
|
|
"20:50:24 result PASS"
|
|
],
|
|
"manifest_sha": "2d41354cdfb037d942fbe328e2ae0594efadd92e976d1c4512ca461b5f864a7e",
|
|
"message": "",
|
|
"result": "PASS",
|
|
"test": "motion.lid-cancel-home",
|
|
"ts": "2026-09-19T20:50:24Z"
|
|
},
|
|
"requires": [
|
|
"motion.pacing",
|
|
"motion.cancel-abort"
|
|
],
|
|
"satisfied": true,
|
|
"source_sha": "b576ff66cc14ed97e1b7a69a5eb72499461837b95528ee36304e42db5afdb659",
|
|
"subsystem": "motion",
|
|
"title": "Lid open during a job - running or paused - cancels it and returns to the job start"
|
|
},
|
|
{
|
|
"always": false,
|
|
"covers": [
|
|
[
|
|
"grblhal-glowforge",
|
|
"src/**"
|
|
],
|
|
[
|
|
"kernel-module-glowforge",
|
|
"**"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/super.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/liveness.*"
|
|
],
|
|
[
|
|
"grblhal-glowforge",
|
|
"src/glowforge_switches.c"
|
|
],
|
|
[
|
|
"grblhal-glowforge",
|
|
"src/glowforge_switch_map.h"
|
|
],
|
|
[
|
|
"grblhal-glowforge",
|
|
"src/glowforge_laser.c"
|
|
]
|
|
],
|
|
"fingerprint": "c8cb383db8871e24f9c6a5db15681abeaae3cb0a9c73089497ad3dea31aeff77",
|
|
"hardware": "api",
|
|
"id": "motion.interlock-cancel-home",
|
|
"inherited": true,
|
|
"kind": "operator",
|
|
"record": {
|
|
"answers": [],
|
|
"campaign": "c-20260919202934-3d3a",
|
|
"duration_s": 8,
|
|
"evidence": {
|
|
"actions": [
|
|
{
|
|
"by": "fixture",
|
|
"channel": "interlock",
|
|
"state": "open",
|
|
"took_s": 0.04,
|
|
"ts": "2026-09-19T20:50:25Z"
|
|
},
|
|
{
|
|
"by": "fixture",
|
|
"channel": "interlock",
|
|
"state": "close",
|
|
"took_s": 0.36,
|
|
"ts": "2026-09-19T20:50:28Z"
|
|
}
|
|
],
|
|
"baseline": {
|
|
"post": [],
|
|
"pre": []
|
|
},
|
|
"batch": {
|
|
"group": "unattended",
|
|
"ts": "2026-09-19T20:29:34Z"
|
|
},
|
|
"fixture": {
|
|
"channels": [
|
|
"lid",
|
|
"interlock",
|
|
"button"
|
|
],
|
|
"hostname": "<REDACTED-1>",
|
|
"ip": "<IP-1>",
|
|
"released": []
|
|
},
|
|
"interlock_drift_mm": 0.038,
|
|
"interlock_kernel_drift_mm": 0.04,
|
|
"interlock_messages": [
|
|
"[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]"
|
|
],
|
|
"interlock_ok_after_pull": false,
|
|
"interlock_returned_message": true,
|
|
"kernel_start": [
|
|
0.07,
|
|
0.0
|
|
],
|
|
"lid_policy": "cancel",
|
|
"mode": {
|
|
"detail": "already in grbl mode",
|
|
"found": "grbl",
|
|
"needs": "grbl",
|
|
"ok": true,
|
|
"switched": false
|
|
},
|
|
"move_start": [
|
|
{
|
|
"after_s": 0.05,
|
|
"line": "G1X60F300",
|
|
"reply": [
|
|
"ok"
|
|
],
|
|
"state": "Run"
|
|
}
|
|
],
|
|
"restored": {
|
|
"interlock_ok": true,
|
|
"lid": true
|
|
},
|
|
"start": [
|
|
0.075,
|
|
0.0,
|
|
3.08
|
|
],
|
|
"switches_at_return": {
|
|
"interlock_ok": false,
|
|
"lid": true
|
|
}
|
|
},
|
|
"fingerprint": "c8cb383db8871e24f9c6a5db15681abeaae3cb0a9c73089497ad3dea31aeff77",
|
|
"image": "20260919202327 (dev)",
|
|
"log": [
|
|
"20:50:24 start motion.interlock-cancel-home (operator, api) in campaign c-20260919202934-3d3a",
|
|
"20:50:24 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
|
|
"20:50:24 fixture: <REDACTED-1> at <IP-1> covers lid, interlock, button",
|
|
"20:50:24 fixture: running unattended (no prompt can be answered)",
|
|
"20:50:24 queued by the unattended queue opened 2026-09-19T20:29:34Z",
|
|
"20:50:24 baseline: pre: clean",
|
|
"20:50:24 mode: test needs grbl - already in grbl mode",
|
|
"20:50:25 connect: Idle",
|
|
"20:50:25 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:50:25 ACT interlock open (fixture)",
|
|
"20:50:25 ACT interlock open: done after 0.0 s",
|
|
"20:50:28 [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:50:28 [interlock] back at the job start: drift 0.038 mm",
|
|
"20:50:28 kernel counters: start (0.07, 0.00) -> now (0.11, 0.00), drift 0.040 mm",
|
|
"20:50:28 at the end of the park: {'lid': True, 'interlock_ok': False}",
|
|
"20:50:28 ACT interlock close (fixture)",
|
|
"20:50:29 ACT interlock close: done after 0.4 s",
|
|
"20:50:31 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:50:32 baseline: head jogged back -0.038/-0.000 mm to its start",
|
|
"20:50:32 baseline: position: [24, 0, 0] (expected [16, 0, 0]) -> restored (jogged back -0.0/-0.0 mm); inside the 0.10 mm dead band, not a leftover",
|
|
"20:50:32 baseline: post: clean",
|
|
"20:50:32 result PASS"
|
|
],
|
|
"manifest_sha": "2d41354cdfb037d942fbe328e2ae0594efadd92e976d1c4512ca461b5f864a7e",
|
|
"message": "",
|
|
"result": "PASS",
|
|
"test": "motion.interlock-cancel-home",
|
|
"ts": "2026-09-19T20:50:32Z"
|
|
},
|
|
"requires": [
|
|
"motion.lid-cancel-home"
|
|
],
|
|
"satisfied": true,
|
|
"source_sha": "54e4efc0db3ea288261f4b26af2e508c83731cee7e960f123beabd9cf6cfa872",
|
|
"subsystem": "motion",
|
|
"title": "The interlock loop cancels a job like the lid and returns to the job start"
|
|
},
|
|
{
|
|
"always": false,
|
|
"covers": [
|
|
[
|
|
"grblhal-glowforge",
|
|
"src/**"
|
|
],
|
|
[
|
|
"kernel-module-glowforge",
|
|
"**"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/super.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/liveness.*"
|
|
],
|
|
[
|
|
"grblhal-glowforge",
|
|
"src/glowforge_switches.c"
|
|
],
|
|
[
|
|
"grblhal-glowforge",
|
|
"src/glowforge_switch_map.h"
|
|
],
|
|
[
|
|
"grblhal-glowforge",
|
|
"src/glowforge_laser.c"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/settings.*"
|
|
]
|
|
],
|
|
"fingerprint": "ca695460b94abff225c592f7be15138f5332e6f18d20df9d7ecce25a18990e8a",
|
|
"hardware": "api",
|
|
"id": "motion.lid-policy-hold",
|
|
"inherited": true,
|
|
"kind": "operator",
|
|
"record": {
|
|
"answers": [],
|
|
"campaign": "c-20260919202934-3d3a",
|
|
"duration_s": 13,
|
|
"evidence": {
|
|
"actions": [
|
|
{
|
|
"by": "fixture",
|
|
"channel": "lid",
|
|
"state": "open",
|
|
"took_s": 0.04,
|
|
"ts": "2026-09-19T20:50:34Z"
|
|
},
|
|
{
|
|
"by": "fixture",
|
|
"channel": "lid",
|
|
"state": "close",
|
|
"took_s": 0.35,
|
|
"ts": "2026-09-19T20:50:34Z"
|
|
}
|
|
],
|
|
"baseline": {
|
|
"post": [],
|
|
"pre": []
|
|
},
|
|
"batch": {
|
|
"group": "unattended",
|
|
"ts": "2026-09-19T20:29:34Z"
|
|
},
|
|
"door_state": "Door:2",
|
|
"fixture": {
|
|
"channels": [
|
|
"lid",
|
|
"interlock",
|
|
"button"
|
|
],
|
|
"hostname": "<REDACTED-1>",
|
|
"ip": "<IP-1>",
|
|
"released": []
|
|
},
|
|
"lid_policy_before": "",
|
|
"lid_policy_in_force": "cancel",
|
|
"lid_policy_restored": "",
|
|
"messages": [
|
|
"[MSG:Check Door]"
|
|
],
|
|
"mode": {
|
|
"detail": "already in grbl mode",
|
|
"found": "grbl",
|
|
"needs": "grbl",
|
|
"ok": true,
|
|
"switched": false
|
|
},
|
|
"move_start": [
|
|
{
|
|
"after_s": 0.05,
|
|
"line": "G1X40F300",
|
|
"reply": [
|
|
"ok"
|
|
],
|
|
"state": "Run"
|
|
}
|
|
],
|
|
"moved_mm": 39.999,
|
|
"parked_at": [
|
|
1.223,
|
|
0.0,
|
|
3.08
|
|
],
|
|
"state_after_close": "Door:0",
|
|
"states_after_resume": [
|
|
"Run",
|
|
"Idle"
|
|
]
|
|
},
|
|
"fingerprint": "ca695460b94abff225c592f7be15138f5332e6f18d20df9d7ecce25a18990e8a",
|
|
"image": "20260919202327 (dev)",
|
|
"log": [
|
|
"20:50:32 start motion.lid-policy-hold (operator, api) in campaign c-20260919202934-3d3a",
|
|
"20:50:33 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
|
|
"20:50:33 fixture: <REDACTED-1> at <IP-1> covers lid, interlock, button",
|
|
"20:50:33 fixture: running unattended (no prompt can be answered)",
|
|
"20:50:33 queued by the unattended queue opened 2026-09-19T20:29:34Z",
|
|
"20:50:33 baseline: pre: clean",
|
|
"20:50:33 mode: test needs grbl - already in grbl mode",
|
|
"20:50:33 connect: Idle",
|
|
"20:50:33 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:50:34 ACT lid open (fixture)",
|
|
"20:50:34 ACT lid open: done after 0.0 s",
|
|
"20:50:34 parked in Door:2 at (1.223, 0.0, 3.08)",
|
|
"20:50:34 ACT lid close (fixture)",
|
|
"20:50:34 ACT lid close: done after 0.3 s",
|
|
"20:50:35 after the lid closed: Door:0 (a cycle start is needed)",
|
|
"20:50:43 finished: moved 39.999 mm of 40 (states ['Run', 'Idle'])",
|
|
"20:50:46 lid_policy restored to ",
|
|
"20:50:46 PASS: lid_policy=hold parked the job in Door and the cycle start finished it (39.999 mm)",
|
|
"20:50:46 baseline: post: clean",
|
|
"20:50:46 result PASS"
|
|
],
|
|
"manifest_sha": "2d41354cdfb037d942fbe328e2ae0594efadd92e976d1c4512ca461b5f864a7e",
|
|
"message": "",
|
|
"result": "PASS",
|
|
"test": "motion.lid-policy-hold",
|
|
"ts": "2026-09-19T20:50:46Z"
|
|
},
|
|
"requires": [
|
|
"motion.lid-cancel-home"
|
|
],
|
|
"satisfied": true,
|
|
"source_sha": "09f9a67b106b711c1c826bf56f04c7d4129bd4f0e6e78339b501eea3e2a1d9a0",
|
|
"subsystem": "motion",
|
|
"title": "lid_policy=hold parks the job in Door and a cycle start resumes it"
|
|
},
|
|
{
|
|
"always": false,
|
|
"covers": [
|
|
[
|
|
"grblhal-glowforge",
|
|
"src/**"
|
|
],
|
|
[
|
|
"kernel-module-glowforge",
|
|
"**"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/super.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/liveness.*"
|
|
]
|
|
],
|
|
"fingerprint": "aa4ddf08486ad1f047a2261aef3851ca53475e015700104771ee1ee3b4cb6740",
|
|
"hardware": "api",
|
|
"id": "motion.step-timing-under-load",
|
|
"inherited": true,
|
|
"kind": "auto",
|
|
"record": {
|
|
"answers": [],
|
|
"campaign": "c-20260919202934-3d3a",
|
|
"duration_s": 30,
|
|
"evidence": {
|
|
"baseline": {
|
|
"post": [],
|
|
"pre": []
|
|
},
|
|
"batch": {
|
|
"group": "unattended",
|
|
"ts": "2026-09-19T20:29:34Z"
|
|
},
|
|
"clamp_lines": [],
|
|
"controller_cpu_pct": 26.6,
|
|
"fixture": {
|
|
"channels": [
|
|
"lid",
|
|
"interlock",
|
|
"button"
|
|
],
|
|
"hostname": "<REDACTED-1>",
|
|
"ip": "<IP-1>",
|
|
"released": []
|
|
},
|
|
"hog_nice": 5,
|
|
"legs": 20,
|
|
"mode": {
|
|
"detail": "already in grbl mode",
|
|
"found": "grbl",
|
|
"needs": "grbl",
|
|
"ok": true,
|
|
"switched": false
|
|
},
|
|
"motion_s": 26.3,
|
|
"rt_priorities": [
|
|
9,
|
|
10
|
|
],
|
|
"threads": 4
|
|
},
|
|
"fingerprint": "aa4ddf08486ad1f047a2261aef3851ca53475e015700104771ee1ee3b4cb6740",
|
|
"image": "20260919202327 (dev)",
|
|
"log": [
|
|
"20:50:46 start motion.step-timing-under-load (auto, api) in campaign c-20260919202934-3d3a",
|
|
"20:50:46 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
|
|
"20:50:46 fixture: <REDACTED-1> at <IP-1> covers lid, interlock, button",
|
|
"20:50:46 queued by the unattended queue opened 2026-09-19T20:29:34Z",
|
|
"20:50:46 baseline: pre: clean",
|
|
"20:50:46 mode: test needs grbl - already in grbl mode",
|
|
"20:50:47 controller threads: 4, SCHED_FIFO priorities: [9, 10]",
|
|
"20:50:47 CPU hog started (pid 5085, nice 5)",
|
|
"20:50:47 connect: Idle",
|
|
"20:51:13 20 legs in 26.3 s, controller CPU 26.6 %",
|
|
"20:51:16 CPU hog stopped",
|
|
"20:51:16 PASS: 20 legs at 2000 mm/min against a nice-5 CPU hog, no clamped events",
|
|
"20:51:16 baseline: post: clean",
|
|
"20:51:16 result PASS"
|
|
],
|
|
"manifest_sha": "2d41354cdfb037d942fbe328e2ae0594efadd92e976d1c4512ca461b5f864a7e",
|
|
"message": "",
|
|
"result": "PASS",
|
|
"test": "motion.step-timing-under-load",
|
|
"ts": "2026-09-19T20:51:16Z"
|
|
},
|
|
"requires": [
|
|
"kernel.latch-locked-idle",
|
|
"motion.jog-roundtrip"
|
|
],
|
|
"satisfied": true,
|
|
"source_sha": "d7630ac3a31644bf0c8f998e18b34bc7eac4027d329f81c5c6270417ed1f9c24",
|
|
"subsystem": "motion",
|
|
"title": "Step timing holds while userspace competes for the core"
|
|
},
|
|
{
|
|
"always": false,
|
|
"covers": [
|
|
[
|
|
"forgectrl",
|
|
"src/cool.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/coolfmt.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/diag.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/gates.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/airflow.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/accel.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/settings.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/status.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/ui/**"
|
|
],
|
|
[
|
|
"grblhal-glowforge",
|
|
"src/glowforge_cooling.*"
|
|
],
|
|
[
|
|
"kernel-module-glowforge",
|
|
"src/thermal*"
|
|
],
|
|
[
|
|
"kernel-module-glowforge",
|
|
"src/pic*"
|
|
]
|
|
],
|
|
"fingerprint": "1e6daa23c83881e6eb2480be3e700b3bf0d01d1221664d2f939925d1d5305a4c",
|
|
"hardware": "api",
|
|
"id": "cooling.aa-offset-calibrate",
|
|
"inherited": true,
|
|
"kind": "auto",
|
|
"record": {
|
|
"answers": [],
|
|
"campaign": "c-20260919220954-20d3",
|
|
"duration_s": 92,
|
|
"evidence": {
|
|
"baseline": {
|
|
"post": [],
|
|
"pre": []
|
|
},
|
|
"fixture": {
|
|
"channels": [
|
|
"lid",
|
|
"interlock",
|
|
"button"
|
|
],
|
|
"hostname": "<REDACTED-1>",
|
|
"ip": "<IP-1>",
|
|
"released": []
|
|
},
|
|
"prerequisites": {
|
|
"missing": [
|
|
"kernel.latch-locked-idle"
|
|
],
|
|
"overridden": true,
|
|
"ts": "2026-09-19T22:09:54Z"
|
|
},
|
|
"result": {
|
|
"offset_counts": 15.4,
|
|
"recommend": 15.4,
|
|
"spread_counts": 1.0,
|
|
"steps": [
|
|
[
|
|
14.9,
|
|
15.3
|
|
],
|
|
[
|
|
-15.9,
|
|
-15.6
|
|
],
|
|
[
|
|
15.9,
|
|
15.0
|
|
],
|
|
[
|
|
-15.5,
|
|
-15.5
|
|
],
|
|
[
|
|
15.3,
|
|
15.4
|
|
],
|
|
[
|
|
-15.1,
|
|
-15.1
|
|
]
|
|
]
|
|
}
|
|
},
|
|
"fingerprint": "1e6daa23c83881e6eb2480be3e700b3bf0d01d1221664d2f939925d1d5305a4c",
|
|
"image": "20260919214619 (dev)",
|
|
"log": [
|
|
"22:09:54 start cooling.aa-offset-calibrate (auto, api) in campaign c-20260919220954-20d3",
|
|
"22:09:54 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
|
|
"22:09:54 fixture: <REDACTED-1> at <IP-1> covers lid, interlock, button",
|
|
"22:09:54 prerequisites overridden by the operator - not satisfied: kernel.latch-locked-idle",
|
|
"22:09:54 baseline: pre: clean",
|
|
"22:09:54 POST /diag/aa-offset-calibrate -> 202 {'started': True}",
|
|
"22:09:54 phase: stopping the motion controller",
|
|
"22:09:56 phase: settling with the fans idle",
|
|
"22:10:10 phase: cycle 1/3: air assist to run",
|
|
"22:10:22 phase: cycle 1/3: air assist to idle",
|
|
"22:10:25 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
|
|
"22:10:34 phase: cycle 2/3: air assist to run",
|
|
"22:10:49 phase: cycle 2/3: air assist to idle",
|
|
"22:10:57 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
|
|
"22:11:01 phase: cycle 3/3: air assist to run",
|
|
"22:11:13 phase: cycle 3/3: air assist to idle",
|
|
"22:11:27 phase: done",
|
|
"22:11:27 diag: 0:00 start: air assist 204 <-> 1023, 3 cycles",
|
|
"22:11:27 diag: 0:28 edge 1 (to run): down +14.9, up +15.3 counts",
|
|
"22:11:27 diag: 0:40 edge 2 (to idle): down -15.9, up -15.6 counts",
|
|
"22:11:27 diag: 0:53 edge 3 (to run): down +15.9, up +15.0 counts",
|
|
"22:11:27 diag: 1:06 edge 4 (to idle): down -15.5, up -15.5 counts",
|
|
"22:11:27 diag: 1:18 edge 5 (to run): down +15.3, up +15.4 counts",
|
|
"22:11:27 diag: 1:31 edge 6 (to idle): down -15.1, up -15.1 counts",
|
|
"22:11:27 diag: 1:31 offset 15.4 counts (spread 1.0) over 6 edges",
|
|
"22:11:27 diag: 1:31 done",
|
|
"22:11:27 offset 15.4 counts, spread 1.0, recommend 15.4, edges [[14.9, 15.3], [-15.9, -15.6], [15.9, 15.0], [-15.5, -15.5], [15.3, 15.4], [-15.1, -15.1]]",
|
|
"22:11:27 baseline: post: clean",
|
|
"22:11:27 result PASS"
|
|
],
|
|
"manifest_sha": "5dbf1f84b9aea447033e38de4b79d4fe8af2309af74367f0befbe9429d44d170",
|
|
"message": "",
|
|
"result": "PASS",
|
|
"test": "cooling.aa-offset-calibrate",
|
|
"ts": "2026-09-19T22:11:27Z"
|
|
},
|
|
"requires": [
|
|
"kernel.latch-locked-idle"
|
|
],
|
|
"satisfied": true,
|
|
"source_sha": "8a0e62a4adfe5c8d21b4aed6b91aa01532145a3bdef2bd29667d8f7afc3c974b",
|
|
"subsystem": "cooling",
|
|
"title": "The air-assist ground shift on the coolant readings measures cleanly"
|
|
},
|
|
{
|
|
"always": false,
|
|
"covers": [
|
|
[
|
|
"forgectrl",
|
|
"src/cool.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/coolfmt.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/diag.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/gates.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/airflow.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/accel.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/settings.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/status.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/ui/**"
|
|
],
|
|
[
|
|
"grblhal-glowforge",
|
|
"src/glowforge_cooling.*"
|
|
],
|
|
[
|
|
"kernel-module-glowforge",
|
|
"src/thermal*"
|
|
],
|
|
[
|
|
"kernel-module-glowforge",
|
|
"src/pic*"
|
|
]
|
|
],
|
|
"fingerprint": "4589b677d9cd1e6888d0834e6c63dcc58b11e3b30845c7334d1bb18add310e0a",
|
|
"hardware": "api",
|
|
"id": "cooling.flow-verify",
|
|
"inherited": false,
|
|
"kind": "auto",
|
|
"record": {
|
|
"answers": [],
|
|
"campaign": "c-20260919222216-7903",
|
|
"duration_s": 161,
|
|
"evidence": {
|
|
"baseline": {
|
|
"post": [],
|
|
"pre": []
|
|
},
|
|
"batch": {
|
|
"group": "unattended",
|
|
"ts": "2026-09-19T22:23:01Z"
|
|
},
|
|
"fixture": {
|
|
"channels": [
|
|
"lid",
|
|
"interlock",
|
|
"button"
|
|
],
|
|
"hostname": "<REDACTED-1>",
|
|
"ip": "<IP-1>",
|
|
"released": []
|
|
},
|
|
"result": {
|
|
"flow_dt": 8.9,
|
|
"flow_rise": 11.4,
|
|
"margin_flow": 3.1,
|
|
"margin_noflow": 3.1,
|
|
"noflow_dt": 12.2,
|
|
"noflow_rise": 17.6,
|
|
"pass": true,
|
|
"thin_margin": false,
|
|
"threshold": 14.5
|
|
}
|
|
},
|
|
"fingerprint": "4589b677d9cd1e6888d0834e6c63dcc58b11e3b30845c7334d1bb18add310e0a",
|
|
"image": "20260919221704 (dev)",
|
|
"log": [
|
|
"22:24:38 start cooling.flow-verify (auto, api) in campaign c-20260919222216-7903",
|
|
"22:24:38 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
|
|
"22:24:38 fixture: <REDACTED-1> at <IP-1> covers lid, interlock, button",
|
|
"22:24:38 queued by the unattended queue opened 2026-09-19T22:23:01Z",
|
|
"22:24:38 baseline: pre: clean",
|
|
"22:24:38 POST /diag/flow-verify -> 202 {'started': True}",
|
|
"22:24:38 phase: stopping the motion controller (down 0.0 C, up 0.0 C)",
|
|
"22:24:40 phase: settling before trial 1/1 (pump on) (down 24.5 C, up 24.6 C)",
|
|
"22:24:54 phase: trial 1/1: heater 40% for 50 s (pump on) (down 24.6 C, up 24.0 C)",
|
|
"22:25:09 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
|
|
"22:25:40 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
|
|
"22:25:46 phase: settling before trial 1/1 (pump off) (down 35.0 C, up 25.1 C)",
|
|
"22:26:11 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
|
|
"22:26:24 phase: trial 1/1: heater 40% for 50 s (pump off) (down 23.5 C, up 23.2 C)",
|
|
"22:26:42 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
|
|
"22:27:13 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
|
|
"22:27:19 phase: done (down 40.6 C, up 28.4 C)",
|
|
"22:27:19 diag: 0:00 start: duty 40%, window 50 s, threshold 14.5 C",
|
|
"22:27:19 diag: 1:07 trial 1/1 flow: rise 11.4 C, dT 8.9 C",
|
|
"22:27:19 diag: 2:39 trial 1/1 no-flow: rise 17.6 C, dT 12.2 C",
|
|
"22:27:19 diag: 2:39 verdict: PASS (flow 11.4 / threshold 14.5 / no-flow 17.6)",
|
|
"22:27:19 diag: 2:39 done",
|
|
"22:27:19 verdict: pass=True threshold=14.5 flow_rise=11.4 noflow_rise=17.6 margins 3.1/3.1 thin=False",
|
|
"22:27:19 baseline: post: clean",
|
|
"22:27:19 result PASS"
|
|
],
|
|
"manifest_sha": "58495afe066c6964484fb07d5664895a4e742e65509c81c10056d9303570f182",
|
|
"message": "",
|
|
"result": "PASS",
|
|
"test": "cooling.flow-verify",
|
|
"ts": "2026-09-19T22:27:19Z"
|
|
},
|
|
"requires": [
|
|
"kernel.latch-locked-idle"
|
|
],
|
|
"satisfied": true,
|
|
"source_sha": "17bc0a3d43e99e60953f0e28f3b17bd3f8f9bedfcb6bda5db4429bf0b17f4bfa",
|
|
"subsystem": "cooling",
|
|
"title": "Coolant flow check separates flow from no-flow"
|
|
},
|
|
{
|
|
"always": false,
|
|
"covers": [
|
|
[
|
|
"forgectrl",
|
|
"src/cool.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/coolfmt.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/diag.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/gates.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/airflow.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/accel.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/settings.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/status.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/ui/**"
|
|
],
|
|
[
|
|
"grblhal-glowforge",
|
|
"src/glowforge_cooling.*"
|
|
],
|
|
[
|
|
"kernel-module-glowforge",
|
|
"src/thermal*"
|
|
],
|
|
[
|
|
"kernel-module-glowforge",
|
|
"src/pic*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/super.c"
|
|
]
|
|
],
|
|
"fingerprint": "021e754dbe30f1e9a742c3421857474784432566f4fead796b3eaf6b1551d5e8",
|
|
"hardware": "api",
|
|
"id": "cooling.fans-quiet-after-motion",
|
|
"inherited": false,
|
|
"kind": "auto",
|
|
"record": {
|
|
"answers": [],
|
|
"campaign": "c-20260919222216-7903",
|
|
"duration_s": 60,
|
|
"evidence": {
|
|
"after": {
|
|
"air_assist": 2222,
|
|
"exhaust": 0,
|
|
"intake_1": 728,
|
|
"intake_2": 729
|
|
},
|
|
"baseline": {
|
|
"post": [],
|
|
"pre": []
|
|
},
|
|
"batch": {
|
|
"group": "unattended",
|
|
"ts": "2026-09-19T22:23:01Z"
|
|
},
|
|
"before": {
|
|
"air_assist": 2242,
|
|
"exhaust": 0,
|
|
"intake_1": 730,
|
|
"intake_2": 734
|
|
},
|
|
"during_m8": {
|
|
"air_assist": 10980,
|
|
"exhaust": 7819,
|
|
"intake_1": 1266,
|
|
"intake_2": 1311
|
|
},
|
|
"duty_after": {
|
|
"thermal/exhaust_pwm": 0,
|
|
"thermal/intake_pwm": 0
|
|
},
|
|
"duty_after_restart": {
|
|
"thermal/exhaust_pwm": 0,
|
|
"thermal/intake_pwm": 0
|
|
},
|
|
"duty_m8": {
|
|
"thermal/exhaust_pwm": 65535,
|
|
"thermal/intake_pwm": 43278
|
|
},
|
|
"fixture": {
|
|
"channels": [
|
|
"lid",
|
|
"interlock",
|
|
"button"
|
|
],
|
|
"hostname": "<REDACTED-1>",
|
|
"ip": "<IP-1>",
|
|
"released": []
|
|
},
|
|
"idle_ref_s": 20.2,
|
|
"kstate_at_restart": "disabled",
|
|
"mode": {
|
|
"detail": "already in grbl mode",
|
|
"found": "grbl",
|
|
"needs": "grbl",
|
|
"ok": true,
|
|
"switched": false
|
|
},
|
|
"restart_idle_s": 20.0,
|
|
"settle_s": 15.2
|
|
},
|
|
"fingerprint": "021e754dbe30f1e9a742c3421857474784432566f4fead796b3eaf6b1551d5e8",
|
|
"image": "20260919221704 (dev)",
|
|
"log": [
|
|
"22:27:19 start cooling.fans-quiet-after-motion (auto, api) in campaign c-20260919222216-7903",
|
|
"22:27:19 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
|
|
"22:27:19 fixture: <REDACTED-1> at <IP-1> covers lid, interlock, button",
|
|
"22:27:19 queued by the unattended queue opened 2026-09-19T22:23:01Z",
|
|
"22:27:19 baseline: pre: clean",
|
|
"22:27:19 mode: test needs grbl - already in grbl mode",
|
|
"22:27:24 idle ref: phase idle duty {'thermal/exhaust_pwm': 0, 'thermal/intake_pwm': 0} fans {'air_assist': 2225, 'exhaust': 1011, 'intake_1': 1309, 'intake_2': 1348}",
|
|
"22:27:29 idle ref: phase idle duty {'thermal/exhaust_pwm': 0, 'thermal/intake_pwm': 0} fans {'air_assist': 2250, 'exhaust': 0, 'intake_1': 772, 'intake_2': 788}",
|
|
"22:27:35 idle ref: phase idle duty {'thermal/exhaust_pwm': 0, 'thermal/intake_pwm': 0} fans {'air_assist': 2245, 'exhaust': 0, 'intake_1': 727, 'intake_2': 734}",
|
|
"22:27:40 idle ref: phase idle duty {'thermal/exhaust_pwm': 0, 'thermal/intake_pwm': 0} fans {'air_assist': 2242, 'exhaust': 0, 'intake_1': 730, 'intake_2': 734}",
|
|
"22:27:40 idle reference after 20.2 s: {'air_assist': 2242, 'exhaust': 0, 'intake_1': 730, 'intake_2': 734}",
|
|
"22:27:44 fans during M8: {'air_assist': 10980, 'exhaust': 7819, 'intake_1': 1266, 'intake_2': 1311} (duty {'thermal/exhaust_pwm': 65535, 'thermal/intake_pwm': 43278})",
|
|
"22:27:49 cooldown + 5 s: phase idle duty {'thermal/exhaust_pwm': 0, 'thermal/intake_pwm': 0} fans {'air_assist': 2345, 'exhaust': 1913, 'intake_1': 849, 'intake_2': 863}",
|
|
"22:27:50 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
|
|
"22:27:54 cooldown + 10 s: phase idle duty {'thermal/exhaust_pwm': 0, 'thermal/intake_pwm': 0} fans {'air_assist': 2214, 'exhaust': 520, 'intake_1': 730, 'intake_2': 738}",
|
|
"22:27:59 cooldown + 15 s: phase idle duty {'thermal/exhaust_pwm': 0, 'thermal/intake_pwm': 0} fans {'air_assist': 2222, 'exhaust': 0, 'intake_1': 725, 'intake_2': 734}",
|
|
"22:27:59 fans after: {'air_assist': 2222, 'exhaust': 0, 'intake_1': 728, 'intake_2': 729} duty {'thermal/exhaust_pwm': 0, 'thermal/intake_pwm': 0} (settled in 15.2 s)",
|
|
"22:28:00 forgectrl stop -> rc 0",
|
|
"22:28:00 forgectrl start with cnc/state=disabled -> rc 0",
|
|
"22:28:05 after the restart + 5 s: controller stopped duty {'thermal/exhaust_pwm': 0, 'thermal/intake_pwm': 0}",
|
|
"22:28:10 after the restart + 10 s: controller stopped duty {'thermal/exhaust_pwm': 0, 'thermal/intake_pwm': 0}",
|
|
"22:28:15 after the restart + 15 s: controller stopped duty {'thermal/exhaust_pwm': 0, 'thermal/intake_pwm': 0}",
|
|
"22:28:20 after the restart + 20 s: controller running duty {'thermal/exhaust_pwm': 0, 'thermal/intake_pwm': 0}",
|
|
"22:28:20 baseline: post: clean",
|
|
"22:28:20 result PASS"
|
|
],
|
|
"manifest_sha": "58495afe066c6964484fb07d5664895a4e742e65509c81c10056d9303570f182",
|
|
"message": "",
|
|
"result": "PASS",
|
|
"test": "cooling.fans-quiet-after-motion",
|
|
"ts": "2026-09-19T22:28:20Z"
|
|
},
|
|
"requires": [
|
|
"motion.pacing"
|
|
],
|
|
"satisfied": true,
|
|
"source_sha": "4071067b752ac09940f190060265a1cf6485ff54793ce4a8498b0ecae0ef6cda",
|
|
"subsystem": "cooling",
|
|
"title": "Fan profile returns to idle after motion, after M8/M9, and after a daemon restart on a busy machine"
|
|
},
|
|
{
|
|
"always": false,
|
|
"covers": [
|
|
[
|
|
"forgectrl",
|
|
"src/cool.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/coolfmt.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/diag.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/gates.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/airflow.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/accel.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/settings.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/status.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/ui/**"
|
|
],
|
|
[
|
|
"grblhal-glowforge",
|
|
"src/glowforge_cooling.*"
|
|
],
|
|
[
|
|
"kernel-module-glowforge",
|
|
"src/thermal*"
|
|
],
|
|
[
|
|
"kernel-module-glowforge",
|
|
"src/pic*"
|
|
]
|
|
],
|
|
"fingerprint": "c424b96b4223e3bca6420bc0f5470f7b5917bc4641581206330de453a7ae2958",
|
|
"hardware": "api",
|
|
"id": "cooling.gate-off",
|
|
"inherited": false,
|
|
"kind": "auto",
|
|
"record": {
|
|
"answers": [],
|
|
"campaign": "c-20260919222216-7903",
|
|
"duration_s": 7,
|
|
"evidence": {
|
|
"baseline": {
|
|
"post": [],
|
|
"pre": []
|
|
},
|
|
"batch": {
|
|
"group": "unattended",
|
|
"ts": "2026-09-19T22:23:01Z"
|
|
},
|
|
"fixture": {
|
|
"channels": [
|
|
"lid",
|
|
"interlock",
|
|
"button"
|
|
],
|
|
"hostname": "<REDACTED-1>",
|
|
"ip": "<IP-1>",
|
|
"released": []
|
|
},
|
|
"mode": {
|
|
"detail": "already in grbl mode",
|
|
"found": "grbl",
|
|
"needs": "grbl",
|
|
"ok": true,
|
|
"switched": false
|
|
},
|
|
"off": {
|
|
"accel_watch": "watch",
|
|
"armed": false,
|
|
"down_c": 24.18,
|
|
"fan_gates": {
|
|
"air_assist": {
|
|
"floor": 6093,
|
|
"reading": 5597,
|
|
"state": "grace"
|
|
},
|
|
"exhaust": {
|
|
"floor": 6416,
|
|
"reading": 6227,
|
|
"state": "grace"
|
|
},
|
|
"intake_1": {
|
|
"floor": 2277,
|
|
"reading": 1086,
|
|
"state": "grace"
|
|
},
|
|
"intake_2": {
|
|
"floor": 2277,
|
|
"reading": 1106,
|
|
"state": "grace"
|
|
},
|
|
"purge": {
|
|
"floor": 345,
|
|
"reading": 629,
|
|
"state": "grace"
|
|
}
|
|
},
|
|
"fire_ok": true,
|
|
"fire_watch": "armed",
|
|
"gates_off": [
|
|
"coolant_max"
|
|
],
|
|
"hold": false,
|
|
"limits": {
|
|
"air_assist_min_rpm": 6093,
|
|
"coolant_critical_c": 38.0,
|
|
"coolant_max_c": 60.0,
|
|
"coolant_min_c": 5.0,
|
|
"coolant_resume_c": 31.0,
|
|
"coolant_source": "local",
|
|
"exhaust_min_rpm": 6416,
|
|
"intake_min_rpm": 2277
|
|
},
|
|
"phase": "run",
|
|
"quiet_hold": false,
|
|
"reason": "",
|
|
"report_age_s": 1.0,
|
|
"resume_ok": true,
|
|
"up_c": 24.1,
|
|
"verdict": "OK"
|
|
},
|
|
"off_state": "off",
|
|
"orig": {
|
|
"cool_temp_max": "",
|
|
"cool_temp_resume": ""
|
|
},
|
|
"restored": {
|
|
"accel_watch": "watch",
|
|
"armed": false,
|
|
"down_c": 24.18,
|
|
"fan_gates": {
|
|
"air_assist": {
|
|
"floor": 6093,
|
|
"reading": 5631,
|
|
"state": "grace"
|
|
},
|
|
"exhaust": {
|
|
"floor": 6416,
|
|
"reading": 5410,
|
|
"state": "grace"
|
|
},
|
|
"intake_1": {
|
|
"floor": 2277,
|
|
"reading": 1473,
|
|
"state": "grace"
|
|
},
|
|
"intake_2": {
|
|
"floor": 2277,
|
|
"reading": 1466,
|
|
"state": "grace"
|
|
},
|
|
"purge": {
|
|
"floor": 345,
|
|
"reading": 629,
|
|
"state": "grace"
|
|
}
|
|
},
|
|
"fire_ok": true,
|
|
"fire_watch": "armed",
|
|
"gates_off": [],
|
|
"hold": false,
|
|
"limits": {
|
|
"air_assist_min_rpm": 6093,
|
|
"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": 6416,
|
|
"intake_min_rpm": 2277
|
|
},
|
|
"phase": "run",
|
|
"quiet_hold": false,
|
|
"reason": "",
|
|
"report_age_s": 0.0,
|
|
"resume_ok": true,
|
|
"up_c": 24.18,
|
|
"verdict": "OK"
|
|
},
|
|
"temps": {
|
|
"chassis_c": 27.6,
|
|
"soc_c": 39.4,
|
|
"soc_throttle": 0,
|
|
"supply_raw": 554
|
|
},
|
|
"trip": {
|
|
"accel_watch": "watch",
|
|
"armed": false,
|
|
"down_c": 24.73,
|
|
"fan_gates": {
|
|
"air_assist": {
|
|
"floor": 6093,
|
|
"reading": 2241,
|
|
"state": "grace"
|
|
},
|
|
"exhaust": {
|
|
"floor": 6416,
|
|
"reading": 0,
|
|
"state": "grace"
|
|
},
|
|
"intake_1": {
|
|
"floor": 2277,
|
|
"reading": 726,
|
|
"state": "grace"
|
|
},
|
|
"intake_2": {
|
|
"floor": 2277,
|
|
"reading": 735,
|
|
"state": "grace"
|
|
},
|
|
"purge": {
|
|
"floor": 345,
|
|
"reading": 633,
|
|
"state": "grace"
|
|
}
|
|
},
|
|
"fire_ok": false,
|
|
"fire_watch": "armed",
|
|
"gates_off": [],
|
|
"hold": true,
|
|
"limits": {
|
|
"air_assist_min_rpm": 6093,
|
|
"coolant_critical_c": 38.0,
|
|
"coolant_max_c": 6.0,
|
|
"coolant_min_c": 5.0,
|
|
"coolant_resume_c": 5.0,
|
|
"coolant_source": "local",
|
|
"exhaust_min_rpm": 6416,
|
|
"intake_min_rpm": 2277
|
|
},
|
|
"phase": "run",
|
|
"quiet_hold": false,
|
|
"reason": "coolant 24.7 C over 6 C limit - hold until 5 C",
|
|
"report_age_s": 1.0,
|
|
"resume_ok": false,
|
|
"up_c": 24.73,
|
|
"verdict": "OVERTEMP"
|
|
},
|
|
"trip_state": "warn"
|
|
},
|
|
"fingerprint": "c424b96b4223e3bca6420bc0f5470f7b5917bc4641581206330de453a7ae2958",
|
|
"image": "20260919221704 (dev)",
|
|
"log": [
|
|
"22:28:20 start cooling.gate-off (auto, api) in campaign c-20260919222216-7903",
|
|
"22:28:20 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
|
|
"22:28:20 fixture: <REDACTED-1> at <IP-1> covers lid, interlock, button",
|
|
"22:28:20 queued by the unattended queue opened 2026-09-19T22:23:01Z",
|
|
"22:28:20 baseline: pre: clean",
|
|
"22:28:20 mode: test needs grbl - already in grbl mode",
|
|
"22:28:20 original: {'cool_temp_max': '', 'cool_temp_resume': ''}",
|
|
"22:28:22 trip leg: verdict OVERTEMP fire_ok False hold True gates_off [] (after 1 s)",
|
|
"22:28:24 off leg: verdict OK fire_ok True hold False gates_off ['coolant_max'] (after 1 s)",
|
|
"22:28:26 restored: verdict OK fire_ok True hold False gates_off [] (after 1 s)",
|
|
"22:28:27 restored ceiling 33 reports state ok",
|
|
"22:28:28 baseline: post: clean",
|
|
"22:28:28 result PASS"
|
|
],
|
|
"manifest_sha": "58495afe066c6964484fb07d5664895a4e742e65509c81c10056d9303570f182",
|
|
"message": "",
|
|
"result": "PASS",
|
|
"test": "cooling.gate-off",
|
|
"ts": "2026-09-19T22:28:28Z"
|
|
},
|
|
"requires": [
|
|
"kernel.latch-locked-idle"
|
|
],
|
|
"satisfied": true,
|
|
"source_sha": "5892fe7caf350720e240f2e71d7e64846cb1ae41ca59b6e2404e646433875590",
|
|
"subsystem": "cooling",
|
|
"title": "A gate setting trips inside its range and is off at its far end"
|
|
},
|
|
{
|
|
"always": false,
|
|
"covers": [
|
|
[
|
|
"forgectrl",
|
|
"src/cool.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/coolfmt.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/diag.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/gates.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/airflow.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/accel.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/settings.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/status.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/ui/**"
|
|
],
|
|
[
|
|
"grblhal-glowforge",
|
|
"src/glowforge_cooling.*"
|
|
],
|
|
[
|
|
"kernel-module-glowforge",
|
|
"src/thermal*"
|
|
],
|
|
[
|
|
"kernel-module-glowforge",
|
|
"src/pic*"
|
|
]
|
|
],
|
|
"fingerprint": "0cba7b858cadf8d62549826abd4d741b96fca2879e4b0042b8920e7695482215",
|
|
"hardware": "api",
|
|
"id": "cooling.floor-and-warm-up",
|
|
"inherited": false,
|
|
"kind": "auto",
|
|
"record": {
|
|
"answers": [],
|
|
"campaign": "c-20260919222216-7903",
|
|
"duration_s": 101,
|
|
"evidence": {
|
|
"baseline": {
|
|
"post": [],
|
|
"pre": []
|
|
},
|
|
"batch": {
|
|
"group": "unattended",
|
|
"ts": "2026-09-19T22:23:01Z"
|
|
},
|
|
"both_off": {
|
|
"accel_watch": "watch",
|
|
"armed": false,
|
|
"down_c": 31.54,
|
|
"fan_gates": {
|
|
"air_assist": {
|
|
"floor": 6093,
|
|
"reading": 5593,
|
|
"state": "grace"
|
|
},
|
|
"exhaust": {
|
|
"floor": 6416,
|
|
"reading": 3727,
|
|
"state": "grace"
|
|
},
|
|
"intake_1": {
|
|
"floor": 2277,
|
|
"reading": 1827,
|
|
"state": "grace"
|
|
},
|
|
"intake_2": {
|
|
"floor": 2277,
|
|
"reading": 1811,
|
|
"state": "grace"
|
|
},
|
|
"purge": {
|
|
"floor": 345,
|
|
"reading": 628,
|
|
"state": "grace"
|
|
}
|
|
},
|
|
"fire_ok": true,
|
|
"fire_watch": "armed",
|
|
"gates_off": [
|
|
"coolant_min",
|
|
"warm_up"
|
|
],
|
|
"hold": false,
|
|
"limits": {
|
|
"air_assist_min_rpm": 6093,
|
|
"coolant_critical_c": 38.0,
|
|
"coolant_max_c": 33.0,
|
|
"coolant_min_c": 0.0,
|
|
"coolant_resume_c": 31.0,
|
|
"coolant_source": "local",
|
|
"exhaust_min_rpm": 6416,
|
|
"intake_min_rpm": 2277
|
|
},
|
|
"phase": "run",
|
|
"quiet_hold": false,
|
|
"reason": "",
|
|
"report_age_s": 1.0,
|
|
"resume_ok": true,
|
|
"up_c": 26.72,
|
|
"verdict": "OK"
|
|
},
|
|
"fixture": {
|
|
"channels": [
|
|
"lid",
|
|
"interlock",
|
|
"button"
|
|
],
|
|
"hostname": "<REDACTED-1>",
|
|
"ip": "<IP-1>",
|
|
"released": []
|
|
},
|
|
"floor": {
|
|
"accel_watch": "watch",
|
|
"armed": false,
|
|
"down_c": 33.4,
|
|
"fan_gates": {
|
|
"air_assist": {
|
|
"floor": 6093,
|
|
"reading": 3776,
|
|
"state": "grace"
|
|
},
|
|
"exhaust": {
|
|
"floor": 6416,
|
|
"reading": 4557,
|
|
"state": "grace"
|
|
},
|
|
"intake_1": {
|
|
"floor": 2277,
|
|
"reading": 1638,
|
|
"state": "grace"
|
|
},
|
|
"intake_2": {
|
|
"floor": 2277,
|
|
"reading": 1619,
|
|
"state": "grace"
|
|
},
|
|
"purge": {
|
|
"floor": 345,
|
|
"reading": 628,
|
|
"state": "grace"
|
|
}
|
|
},
|
|
"fire_ok": false,
|
|
"fire_watch": "armed",
|
|
"gates_off": [
|
|
"warm_up"
|
|
],
|
|
"hold": true,
|
|
"limits": {
|
|
"air_assist_min_rpm": 6093,
|
|
"coolant_critical_c": 38.0,
|
|
"coolant_max_c": 33.0,
|
|
"coolant_min_c": 29.3,
|
|
"coolant_resume_c": 31.0,
|
|
"coolant_source": "local",
|
|
"exhaust_min_rpm": 6416,
|
|
"intake_min_rpm": 2277
|
|
},
|
|
"phase": "run",
|
|
"quiet_hold": false,
|
|
"reason": "COLD: coolant 27.0 C under the 29.3 C floor - fire blocked until 30.3 C",
|
|
"report_age_s": 1.0,
|
|
"resume_ok": false,
|
|
"up_c": 26.96,
|
|
"verdict": "COLD"
|
|
},
|
|
"mode": {
|
|
"detail": "already in grbl mode",
|
|
"found": "grbl",
|
|
"needs": "grbl",
|
|
"ok": true,
|
|
"switched": false
|
|
},
|
|
"orig": {
|
|
"cool_temp_min": "",
|
|
"cool_temp_start": ""
|
|
},
|
|
"restored": {
|
|
"accel_watch": "watch",
|
|
"armed": false,
|
|
"down_c": 30.13,
|
|
"fan_gates": {
|
|
"air_assist": {
|
|
"floor": 6093,
|
|
"reading": 5610,
|
|
"state": "grace"
|
|
},
|
|
"exhaust": {
|
|
"floor": 6416,
|
|
"reading": 3669,
|
|
"state": "grace"
|
|
},
|
|
"intake_1": {
|
|
"floor": 2277,
|
|
"reading": 2098,
|
|
"state": "grace"
|
|
},
|
|
"intake_2": {
|
|
"floor": 2277,
|
|
"reading": 2095,
|
|
"state": "grace"
|
|
},
|
|
"purge": {
|
|
"floor": 345,
|
|
"reading": 626,
|
|
"state": "grace"
|
|
}
|
|
},
|
|
"fire_ok": true,
|
|
"fire_watch": "armed",
|
|
"gates_off": [],
|
|
"hold": false,
|
|
"limits": {
|
|
"air_assist_min_rpm": 6093,
|
|
"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": 6416,
|
|
"intake_min_rpm": 2277
|
|
},
|
|
"phase": "run",
|
|
"quiet_hold": false,
|
|
"reason": "",
|
|
"report_age_s": 1.0,
|
|
"resume_ok": true,
|
|
"up_c": 26.32,
|
|
"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": 24.02,
|
|
"fan_gates": {
|
|
"air_assist": {
|
|
"floor": 6093,
|
|
"reading": 3707,
|
|
"state": "idle"
|
|
},
|
|
"exhaust": {
|
|
"floor": 6416,
|
|
"reading": 2870,
|
|
"state": "idle"
|
|
},
|
|
"intake_1": {
|
|
"floor": 2277,
|
|
"reading": 1477,
|
|
"state": "idle"
|
|
},
|
|
"intake_2": {
|
|
"floor": 2277,
|
|
"reading": 1465,
|
|
"state": "idle"
|
|
},
|
|
"purge": {
|
|
"floor": 345,
|
|
"reading": 629,
|
|
"state": "idle"
|
|
}
|
|
},
|
|
"fire_ok": false,
|
|
"fire_watch": "armed",
|
|
"gates_off": [],
|
|
"hold": true,
|
|
"limits": {
|
|
"air_assist_min_rpm": 6093,
|
|
"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": 6416,
|
|
"intake_min_rpm": 2277
|
|
},
|
|
"phase": "warm-up",
|
|
"quiet_hold": false,
|
|
"reason": "",
|
|
"report_age_s": 1.0,
|
|
"resume_ok": false,
|
|
"up_c": 23.87,
|
|
"verdict": "WARMUP"
|
|
},
|
|
"warmup_release": {
|
|
"accel_watch": "watch",
|
|
"armed": false,
|
|
"down_c": 38.72,
|
|
"fan_gates": {
|
|
"air_assist": {
|
|
"floor": 6093,
|
|
"reading": 10730,
|
|
"state": "grace"
|
|
},
|
|
"exhaust": {
|
|
"floor": 6416,
|
|
"reading": 4233,
|
|
"state": "grace"
|
|
},
|
|
"intake_1": {
|
|
"floor": 2277,
|
|
"reading": 808,
|
|
"state": "grace"
|
|
},
|
|
"intake_2": {
|
|
"floor": 2277,
|
|
"reading": 827,
|
|
"state": "grace"
|
|
},
|
|
"purge": {
|
|
"floor": 345,
|
|
"reading": 627,
|
|
"state": "grace"
|
|
}
|
|
},
|
|
"fire_ok": true,
|
|
"fire_watch": "armed",
|
|
"gates_off": [],
|
|
"hold": false,
|
|
"limits": {
|
|
"air_assist_min_rpm": 6093,
|
|
"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": 6416,
|
|
"intake_min_rpm": 2277
|
|
},
|
|
"phase": "run",
|
|
"quiet_hold": false,
|
|
"reason": "",
|
|
"report_age_s": 0.7,
|
|
"resume_ok": true,
|
|
"up_c": 27.52,
|
|
"verdict": "OK"
|
|
},
|
|
"warmup_release_s": 90
|
|
},
|
|
"fingerprint": "0cba7b858cadf8d62549826abd4d741b96fca2879e4b0042b8920e7695482215",
|
|
"image": "20260919221704 (dev)",
|
|
"log": [
|
|
"22:28:28 start cooling.floor-and-warm-up (auto, api) in campaign c-20260919222216-7903",
|
|
"22:28:28 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
|
|
"22:28:28 fixture: <REDACTED-1> at <IP-1> covers lid, interlock, button",
|
|
"22:28:28 queued by the unattended queue opened 2026-09-19T22:23:01Z",
|
|
"22:28:28 baseline: pre: clean",
|
|
"22:28:28 mode: test needs grbl - already in grbl mode",
|
|
"22:28:28 original: {'cool_temp_min': '', 'cool_temp_start': ''}",
|
|
"22:28:30 warm-up hold: verdict WARMUP phase warm-up fire_ok False hold True (after 1 s)",
|
|
"22:28:58 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
|
|
"22:29:29 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
|
|
"22:30:00 warm-up release after 90 s: verdict OK phase run up 27.52 (gate 25.5)",
|
|
"22:30:00 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
|
|
"22:30:04 floor: verdict COLD fire_ok False hold True gates_off ['warm_up'] (after 1 s)",
|
|
"22:30:06 both off: verdict OK fire_ok True hold False gates_off ['coolant_min', 'warm_up'] (after 1 s)",
|
|
"22:30:08 restored: verdict OK fire_ok True hold False gates_off [] (after 1 s)",
|
|
"22:30:09 baseline: post: clean",
|
|
"22:30:09 result PASS"
|
|
],
|
|
"manifest_sha": "58495afe066c6964484fb07d5664895a4e742e65509c81c10056d9303570f182",
|
|
"message": "",
|
|
"result": "PASS",
|
|
"test": "cooling.floor-and-warm-up",
|
|
"ts": "2026-09-19T22:30:09Z"
|
|
},
|
|
"requires": [
|
|
"kernel.latch-locked-idle",
|
|
"cooling.gate-off"
|
|
],
|
|
"satisfied": true,
|
|
"source_sha": "fd551dac7fc832bac7949deb1b6398b61e00a659312925ba5d04d7a108fe1048",
|
|
"subsystem": "cooling",
|
|
"title": "The coolant floor blocks fire and the warm-up gate holds a cold start"
|
|
},
|
|
{
|
|
"always": false,
|
|
"covers": [
|
|
[
|
|
"forgectrl",
|
|
"src/cool.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/coolfmt.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/diag.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/gates.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/airflow.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/accel.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/settings.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/status.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/ui/**"
|
|
],
|
|
[
|
|
"grblhal-glowforge",
|
|
"src/glowforge_cooling.*"
|
|
],
|
|
[
|
|
"kernel-module-glowforge",
|
|
"src/thermal*"
|
|
],
|
|
[
|
|
"kernel-module-glowforge",
|
|
"src/pic*"
|
|
]
|
|
],
|
|
"fingerprint": "6d79d35afd76c69a116b211c8902983ec8968d94258a12d7ef7a816bdd3be6f3",
|
|
"hardware": "api",
|
|
"id": "cooling.tec-drive",
|
|
"inherited": false,
|
|
"kind": "auto",
|
|
"record": {
|
|
"answers": [],
|
|
"campaign": "c-20260919222216-7903",
|
|
"duration_s": 8,
|
|
"evidence": {
|
|
"baseline": {
|
|
"post": [],
|
|
"pre": []
|
|
},
|
|
"batch": {
|
|
"group": "unattended",
|
|
"ts": "2026-09-19T22:23:01Z"
|
|
},
|
|
"fixture": {
|
|
"channels": [
|
|
"lid",
|
|
"interlock",
|
|
"button"
|
|
],
|
|
"hostname": "<REDACTED-1>",
|
|
"ip": "<IP-1>",
|
|
"released": []
|
|
},
|
|
"mode": {
|
|
"detail": "already in grbl mode",
|
|
"found": "grbl",
|
|
"needs": "grbl",
|
|
"ok": true,
|
|
"switched": false
|
|
},
|
|
"orig": {
|
|
"cool_tec_off_c": "",
|
|
"cool_tec_on_c": "",
|
|
"cool_tec_present": "0"
|
|
},
|
|
"restored": {
|
|
"accel_watch": "watch",
|
|
"armed": false,
|
|
"down_c": 27.12,
|
|
"fan_gates": {
|
|
"air_assist": {
|
|
"floor": 6093,
|
|
"reading": 5560,
|
|
"state": "grace"
|
|
},
|
|
"exhaust": {
|
|
"floor": 6416,
|
|
"reading": 3815,
|
|
"state": "grace"
|
|
},
|
|
"intake_1": {
|
|
"floor": 2277,
|
|
"reading": 2277,
|
|
"state": "grace"
|
|
},
|
|
"intake_2": {
|
|
"floor": 2277,
|
|
"reading": 2330,
|
|
"state": "grace"
|
|
},
|
|
"purge": {
|
|
"floor": 345,
|
|
"reading": 627,
|
|
"state": "grace"
|
|
}
|
|
},
|
|
"fire_ok": true,
|
|
"fire_watch": "armed",
|
|
"gates_off": [],
|
|
"hold": false,
|
|
"limits": {
|
|
"air_assist_min_rpm": 6093,
|
|
"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": 6416,
|
|
"intake_min_rpm": 2277
|
|
},
|
|
"phase": "run",
|
|
"quiet_hold": false,
|
|
"reason": "",
|
|
"report_age_s": 1.0,
|
|
"resume_ok": true,
|
|
"up_c": 25.36,
|
|
"verdict": "OK"
|
|
},
|
|
"tec_after_session": 0,
|
|
"tec_not_fitted": 0,
|
|
"tec_on_after_s": 1
|
|
},
|
|
"fingerprint": "6d79d35afd76c69a116b211c8902983ec8968d94258a12d7ef7a816bdd3be6f3",
|
|
"image": "20260919221704 (dev)",
|
|
"log": [
|
|
"22:30:10 start cooling.tec-drive (auto, api) in campaign c-20260919222216-7903",
|
|
"22:30:10 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
|
|
"22:30:10 fixture: <REDACTED-1> at <IP-1> covers lid, interlock, button",
|
|
"22:30:10 queued by the unattended queue opened 2026-09-19T22:23:01Z",
|
|
"22:30:10 baseline: pre: clean",
|
|
"22:30:10 mode: test needs grbl - already in grbl mode",
|
|
"22:30:10 original: {'cool_tec_present': '0', 'cool_tec_on_c': '', 'cool_tec_off_c': ''}",
|
|
"22:30:11 fitted, in session: thermal/tec_on=1 after 1 s",
|
|
"22:30:14 after the session: phase idle thermal/tec_on=0",
|
|
"22:30:15 tec leg 2: verdict OK fire_ok True hold False gates_off [] (after 1 s)",
|
|
"22:30:17 restored: verdict OK fire_ok True hold False gates_off [] (after 1 s)",
|
|
"22:30:18 baseline: post: clean",
|
|
"22:30:18 result PASS"
|
|
],
|
|
"manifest_sha": "58495afe066c6964484fb07d5664895a4e742e65509c81c10056d9303570f182",
|
|
"message": "",
|
|
"result": "PASS",
|
|
"test": "cooling.tec-drive",
|
|
"ts": "2026-09-19T22:30:18Z"
|
|
},
|
|
"requires": [
|
|
"kernel.latch-locked-idle"
|
|
],
|
|
"satisfied": true,
|
|
"source_sha": "ce3eda32cf2bb1ca8d0e30c55be4f0c4a50ca5f77083e18620e8f391c79df323",
|
|
"subsystem": "cooling",
|
|
"title": "The TEC runs on its hysteresis only with airflow and only when declared fitted"
|
|
},
|
|
{
|
|
"always": false,
|
|
"covers": [
|
|
[
|
|
"forgectrl",
|
|
"src/cool.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/coolfmt.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/diag.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/gates.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/airflow.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/accel.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/settings.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/status.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/ui/**"
|
|
],
|
|
[
|
|
"grblhal-glowforge",
|
|
"src/glowforge_cooling.*"
|
|
],
|
|
[
|
|
"kernel-module-glowforge",
|
|
"src/thermal*"
|
|
],
|
|
[
|
|
"kernel-module-glowforge",
|
|
"src/pic*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/super.*"
|
|
]
|
|
],
|
|
"fingerprint": "342e6d1e88440516ab00c8ed5c6b7f954505a3ba7aa387c118fd5ab004b93a3a",
|
|
"hardware": "api",
|
|
"id": "cooling.fire-watch-tiers",
|
|
"inherited": false,
|
|
"kind": "auto",
|
|
"record": {
|
|
"answers": [],
|
|
"campaign": "c-20260919222216-7903",
|
|
"duration_s": 15,
|
|
"evidence": {
|
|
"alert": {
|
|
"accel_watch": "watch",
|
|
"armed": false,
|
|
"down_c": 26.72,
|
|
"fan_gates": {
|
|
"air_assist": {
|
|
"floor": 6093,
|
|
"reading": 10745,
|
|
"state": "grace"
|
|
},
|
|
"exhaust": {
|
|
"floor": 6416,
|
|
"reading": 4373,
|
|
"state": "grace"
|
|
},
|
|
"intake_1": {
|
|
"floor": 2277,
|
|
"reading": 2108,
|
|
"state": "grace"
|
|
},
|
|
"intake_2": {
|
|
"floor": 2277,
|
|
"reading": 2200,
|
|
"state": "grace"
|
|
},
|
|
"purge": {
|
|
"floor": 345,
|
|
"reading": 627,
|
|
"state": "grace"
|
|
}
|
|
},
|
|
"fire_ok": false,
|
|
"fire_watch": "alert",
|
|
"gates_off": [],
|
|
"hold": true,
|
|
"limits": {
|
|
"air_assist_min_rpm": 6093,
|
|
"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": 6416,
|
|
"intake_min_rpm": 2277
|
|
},
|
|
"phase": "run",
|
|
"quiet_hold": false,
|
|
"reason": "lid IR flame alert (quartiles 47 48) - job held, fire blocked until the signal clears",
|
|
"report_age_s": 1.0,
|
|
"resume_ok": false,
|
|
"up_c": 25.6,
|
|
"verdict": "FLAME"
|
|
},
|
|
"baseline": {
|
|
"post": [],
|
|
"pre": []
|
|
},
|
|
"batch": {
|
|
"group": "unattended",
|
|
"ts": "2026-09-19T22:23:01Z"
|
|
},
|
|
"critical": {
|
|
"accel_watch": "watch",
|
|
"armed": false,
|
|
"down_c": 26.0,
|
|
"fan_gates": {
|
|
"air_assist": {
|
|
"floor": 6093,
|
|
"reading": 10854,
|
|
"state": "grace"
|
|
},
|
|
"exhaust": {
|
|
"floor": 6416,
|
|
"reading": 4470,
|
|
"state": "grace"
|
|
},
|
|
"intake_1": {
|
|
"floor": 2277,
|
|
"reading": 4145,
|
|
"state": "grace"
|
|
},
|
|
"intake_2": {
|
|
"floor": 2277,
|
|
"reading": 4136,
|
|
"state": "grace"
|
|
},
|
|
"purge": {
|
|
"floor": 345,
|
|
"reading": 627,
|
|
"state": "grace"
|
|
}
|
|
},
|
|
"fire_ok": false,
|
|
"fire_watch": "ALARM",
|
|
"gates_off": [],
|
|
"hold": true,
|
|
"limits": {
|
|
"air_assist_min_rpm": 6093,
|
|
"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": 6416,
|
|
"intake_min_rpm": 2277
|
|
},
|
|
"phase": "run",
|
|
"quiet_hold": false,
|
|
"reason": "LID IR FIRE SIGNAL (quartiles 48 48) - motion stopped, laser locked, smoke airflow held",
|
|
"report_age_s": 0.2,
|
|
"resume_ok": false,
|
|
"up_c": 26.0,
|
|
"verdict": "FIRE"
|
|
},
|
|
"fixture": {
|
|
"channels": [
|
|
"lid",
|
|
"interlock",
|
|
"button"
|
|
],
|
|
"hostname": "<REDACTED-1>",
|
|
"ip": "<IP-1>",
|
|
"released": []
|
|
},
|
|
"interlock_circuit": 45,
|
|
"lid_ir_idle": [
|
|
48,
|
|
49,
|
|
52,
|
|
54
|
|
],
|
|
"mode": {
|
|
"detail": "already in grbl mode",
|
|
"found": "grbl",
|
|
"needs": "grbl",
|
|
"ok": true,
|
|
"switched": false
|
|
},
|
|
"off": {
|
|
"accel_watch": "watch",
|
|
"armed": false,
|
|
"down_c": 24.89,
|
|
"fan_gates": {
|
|
"air_assist": {
|
|
"floor": 6093,
|
|
"reading": 5652,
|
|
"state": "grace"
|
|
},
|
|
"exhaust": {
|
|
"floor": 6416,
|
|
"reading": 4896,
|
|
"state": "grace"
|
|
},
|
|
"intake_1": {
|
|
"floor": 2277,
|
|
"reading": 3872,
|
|
"state": "grace"
|
|
},
|
|
"intake_2": {
|
|
"floor": 2277,
|
|
"reading": 3869,
|
|
"state": "grace"
|
|
},
|
|
"purge": {
|
|
"floor": 345,
|
|
"reading": 628,
|
|
"state": "grace"
|
|
}
|
|
},
|
|
"fire_ok": true,
|
|
"fire_watch": "watch",
|
|
"gates_off": [
|
|
"flame_q1_alert",
|
|
"flame_q1_critical",
|
|
"flame_q2_alert",
|
|
"flame_q2_critical"
|
|
],
|
|
"hold": false,
|
|
"limits": {
|
|
"air_assist_min_rpm": 6093,
|
|
"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": 6416,
|
|
"intake_min_rpm": 2277
|
|
},
|
|
"phase": "run",
|
|
"quiet_hold": false,
|
|
"reason": "",
|
|
"report_age_s": 1.0,
|
|
"resume_ok": true,
|
|
"up_c": 24.65,
|
|
"verdict": "OK"
|
|
},
|
|
"orig": {
|
|
"cool_fire_q1_alert": "",
|
|
"cool_fire_q1_critical": "",
|
|
"cool_fire_q2_alert": "",
|
|
"cool_fire_q2_critical": ""
|
|
},
|
|
"restart": {
|
|
"mode_after": {
|
|
"controller": "running",
|
|
"gated": false,
|
|
"local": false,
|
|
"mode": "grbl",
|
|
"motion": "verified",
|
|
"pid": 1945,
|
|
"why": ""
|
|
},
|
|
"pid_before": 1560
|
|
},
|
|
"restored": {
|
|
"accel_watch": "watch",
|
|
"armed": false,
|
|
"down_c": 24.81,
|
|
"fan_gates": {
|
|
"air_assist": {
|
|
"floor": 6093,
|
|
"reading": 5618,
|
|
"state": "grace"
|
|
},
|
|
"exhaust": {
|
|
"floor": 6416,
|
|
"reading": 3762,
|
|
"state": "grace"
|
|
},
|
|
"intake_1": {
|
|
"floor": 2277,
|
|
"reading": 3940,
|
|
"state": "grace"
|
|
},
|
|
"intake_2": {
|
|
"floor": 2277,
|
|
"reading": 3932,
|
|
"state": "grace"
|
|
},
|
|
"purge": {
|
|
"floor": 345,
|
|
"reading": 627,
|
|
"state": "grace"
|
|
}
|
|
},
|
|
"fire_ok": true,
|
|
"fire_watch": "armed",
|
|
"gates_off": [],
|
|
"hold": false,
|
|
"limits": {
|
|
"air_assist_min_rpm": 6093,
|
|
"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": 6416,
|
|
"intake_min_rpm": 2277
|
|
},
|
|
"phase": "run",
|
|
"quiet_hold": false,
|
|
"reason": "",
|
|
"report_age_s": 1.0,
|
|
"resume_ok": true,
|
|
"up_c": 24.65,
|
|
"verdict": "OK"
|
|
}
|
|
},
|
|
"fingerprint": "342e6d1e88440516ab00c8ed5c6b7f954505a3ba7aa387c118fd5ab004b93a3a",
|
|
"image": "20260919221704 (dev)",
|
|
"log": [
|
|
"22:30:18 start cooling.fire-watch-tiers (auto, api) in campaign c-20260919222216-7903",
|
|
"22:30:18 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
|
|
"22:30:18 fixture: <REDACTED-1> at <IP-1> covers lid, interlock, button",
|
|
"22:30:18 queued by the unattended queue opened 2026-09-19T22:23:01Z",
|
|
"22:30:18 baseline: pre: clean",
|
|
"22:30:18 mode: test needs grbl - already in grbl mode",
|
|
"22:30:18 original: {'cool_fire_q1_alert': '', 'cool_fire_q1_critical': '', 'cool_fire_q2_alert': '', 'cool_fire_q2_critical': ''}",
|
|
"22:30:21 alert leg: verdict FLAME fire_watch alert hold True fire_ok False",
|
|
"22:30:24 post-alert: verdict OK fire_ok True hold False gates_off [] (after 1 s)",
|
|
"22:30:27 critical leg: verdict FIRE fire_watch ALARM interlock_circuit 45",
|
|
"22:30:28 after FIRE: {'pid_before': 1560, 'mode_after': {'mode': 'grbl', 'controller': 'running', 'pid': 1945, 'motion': 'verified', 'gated': False, 'local': False, 'why': ''}}",
|
|
"22:30:30 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)",
|
|
"22:30:32 restored: verdict OK fire_ok True hold False gates_off [] (after 1 s)",
|
|
"22:30:33 baseline: post: clean",
|
|
"22:30:33 result PASS"
|
|
],
|
|
"manifest_sha": "58495afe066c6964484fb07d5664895a4e742e65509c81c10056d9303570f182",
|
|
"message": "",
|
|
"result": "PASS",
|
|
"test": "cooling.fire-watch-tiers",
|
|
"ts": "2026-09-19T22:30:33Z"
|
|
},
|
|
"requires": [
|
|
"kernel.latch-locked-idle"
|
|
],
|
|
"satisfied": true,
|
|
"source_sha": "47b56bf7aa7a2645bed88e7ccebec9fd4b05d927b210591838e8e881b233436f",
|
|
"subsystem": "cooling",
|
|
"title": "The lid-IR fire watch pauses at its alert and fails at its critical"
|
|
},
|
|
{
|
|
"always": false,
|
|
"covers": [
|
|
[
|
|
"forgectrl",
|
|
"src/cool.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/coolfmt.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/diag.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/gates.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/airflow.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/accel.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/settings.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/status.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/ui/**"
|
|
],
|
|
[
|
|
"grblhal-glowforge",
|
|
"src/glowforge_cooling.*"
|
|
],
|
|
[
|
|
"kernel-module-glowforge",
|
|
"src/thermal*"
|
|
],
|
|
[
|
|
"kernel-module-glowforge",
|
|
"src/pic*"
|
|
]
|
|
],
|
|
"fingerprint": "b41fbd7aca1dae6d5f6aa0450abf2dc64f9a16626b538d77939b1dcce74b1511",
|
|
"hardware": "api",
|
|
"id": "cooling.crash-watch-plumbing",
|
|
"inherited": false,
|
|
"kind": "auto",
|
|
"record": {
|
|
"answers": [],
|
|
"campaign": "c-20260919222216-7903",
|
|
"duration_s": 7,
|
|
"evidence": {
|
|
"baseline": {
|
|
"post": [],
|
|
"pre": []
|
|
},
|
|
"batch": {
|
|
"group": "unattended",
|
|
"ts": "2026-09-19T22:23:01Z"
|
|
},
|
|
"fixture": {
|
|
"channels": [
|
|
"lid",
|
|
"interlock",
|
|
"button"
|
|
],
|
|
"hostname": "<REDACTED-1>",
|
|
"ip": "<IP-1>",
|
|
"released": []
|
|
},
|
|
"mode": {
|
|
"detail": "already in grbl mode",
|
|
"found": "grbl",
|
|
"needs": "grbl",
|
|
"ok": true,
|
|
"switched": false
|
|
},
|
|
"off": {
|
|
"accel_watch": "watch",
|
|
"armed": false,
|
|
"down_c": 24.89,
|
|
"fan_gates": {
|
|
"air_assist": {
|
|
"floor": 6093,
|
|
"reading": 5610,
|
|
"state": "grace"
|
|
},
|
|
"exhaust": {
|
|
"floor": 6416,
|
|
"reading": 3590,
|
|
"state": "grace"
|
|
},
|
|
"intake_1": {
|
|
"floor": 2277,
|
|
"reading": 3223,
|
|
"state": "grace"
|
|
},
|
|
"intake_2": {
|
|
"floor": 2277,
|
|
"reading": 3209,
|
|
"state": "grace"
|
|
},
|
|
"purge": {
|
|
"floor": 345,
|
|
"reading": 629,
|
|
"state": "grace"
|
|
}
|
|
},
|
|
"fire_ok": true,
|
|
"fire_watch": "armed",
|
|
"gates_off": [
|
|
"crash_x_alert",
|
|
"crash_y_alert",
|
|
"crash_abort"
|
|
],
|
|
"hold": false,
|
|
"limits": {
|
|
"air_assist_min_rpm": 6093,
|
|
"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": 6416,
|
|
"intake_min_rpm": 2277
|
|
},
|
|
"phase": "run",
|
|
"quiet_hold": false,
|
|
"reason": "",
|
|
"report_age_s": 1.0,
|
|
"resume_ok": true,
|
|
"up_c": 24.42,
|
|
"verdict": "OK"
|
|
},
|
|
"orig": {
|
|
"cool_accel_abort": "",
|
|
"cool_accel_x_alert": "",
|
|
"cool_accel_y_alert": ""
|
|
},
|
|
"restored": {
|
|
"accel_watch": "watch",
|
|
"armed": false,
|
|
"down_c": 24.73,
|
|
"fan_gates": {
|
|
"air_assist": {
|
|
"floor": 6093,
|
|
"reading": 5626,
|
|
"state": "grace"
|
|
},
|
|
"exhaust": {
|
|
"floor": 6416,
|
|
"reading": 3689,
|
|
"state": "grace"
|
|
},
|
|
"intake_1": {
|
|
"floor": 2277,
|
|
"reading": 3613,
|
|
"state": "grace"
|
|
},
|
|
"intake_2": {
|
|
"floor": 2277,
|
|
"reading": 3637,
|
|
"state": "grace"
|
|
},
|
|
"purge": {
|
|
"floor": 345,
|
|
"reading": 628,
|
|
"state": "grace"
|
|
}
|
|
},
|
|
"fire_ok": true,
|
|
"fire_watch": "armed",
|
|
"gates_off": [],
|
|
"hold": false,
|
|
"limits": {
|
|
"air_assist_min_rpm": 6093,
|
|
"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": 6416,
|
|
"intake_min_rpm": 2277
|
|
},
|
|
"phase": "run",
|
|
"quiet_hold": false,
|
|
"reason": "",
|
|
"report_age_s": 0.0,
|
|
"resume_ok": true,
|
|
"up_c": 24.65,
|
|
"verdict": "OK"
|
|
},
|
|
"unarmed": {
|
|
"accel_watch": "watch",
|
|
"armed": false,
|
|
"down_c": 25.21,
|
|
"fan_gates": {
|
|
"air_assist": {
|
|
"floor": 6093,
|
|
"reading": 2870,
|
|
"state": "grace"
|
|
},
|
|
"exhaust": {
|
|
"floor": 6416,
|
|
"reading": 2104,
|
|
"state": "grace"
|
|
},
|
|
"intake_1": {
|
|
"floor": 2277,
|
|
"reading": 2894,
|
|
"state": "grace"
|
|
},
|
|
"intake_2": {
|
|
"floor": 2277,
|
|
"reading": 2888,
|
|
"state": "grace"
|
|
},
|
|
"purge": {
|
|
"floor": 345,
|
|
"reading": 629,
|
|
"state": "grace"
|
|
}
|
|
},
|
|
"fire_ok": true,
|
|
"fire_watch": "armed",
|
|
"gates_off": [],
|
|
"hold": false,
|
|
"limits": {
|
|
"air_assist_min_rpm": 6093,
|
|
"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": 6416,
|
|
"intake_min_rpm": 2277
|
|
},
|
|
"phase": "run",
|
|
"quiet_hold": false,
|
|
"reason": "",
|
|
"report_age_s": 1.0,
|
|
"resume_ok": true,
|
|
"up_c": 25.05,
|
|
"verdict": "OK"
|
|
}
|
|
},
|
|
"fingerprint": "b41fbd7aca1dae6d5f6aa0450abf2dc64f9a16626b538d77939b1dcce74b1511",
|
|
"image": "20260919221704 (dev)",
|
|
"log": [
|
|
"22:30:33 start cooling.crash-watch-plumbing (auto, api) in campaign c-20260919222216-7903",
|
|
"22:30:33 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
|
|
"22:30:33 fixture: <REDACTED-1> at <IP-1> covers lid, interlock, button",
|
|
"22:30:33 queued by the unattended queue opened 2026-09-19T22:23:01Z",
|
|
"22:30:34 baseline: pre: clean",
|
|
"22:30:34 mode: test needs grbl - already in grbl mode",
|
|
"22:30:34 original: {'cool_accel_x_alert': '', 'cool_accel_y_alert': '', 'cool_accel_abort': ''}",
|
|
"22:30:35 unarmed session: verdict OK fire_ok True hold False gates_off [] (after 1 s)",
|
|
"22:30:37 watch off: verdict OK fire_ok True hold False gates_off ['crash_x_alert', 'crash_y_alert', 'crash_abort'] (after 1 s)",
|
|
"22:30:39 restored: verdict OK fire_ok True hold False gates_off [] (after 1 s)",
|
|
"22:30:41 baseline: post: clean",
|
|
"22:30:41 result PASS"
|
|
],
|
|
"manifest_sha": "58495afe066c6964484fb07d5664895a4e742e65509c81c10056d9303570f182",
|
|
"message": "",
|
|
"result": "PASS",
|
|
"test": "cooling.crash-watch-plumbing",
|
|
"ts": "2026-09-19T22:30:41Z"
|
|
},
|
|
"requires": [
|
|
"kernel.latch-locked-idle"
|
|
],
|
|
"satisfied": true,
|
|
"source_sha": "11a841e37106cbe6e279add4ced69a674eb2df4d7dafc846b55996d159d327f7",
|
|
"subsystem": "cooling",
|
|
"title": "The crash watch stays off the accelerometer unarmed and its gates say off"
|
|
},
|
|
{
|
|
"always": false,
|
|
"covers": [
|
|
[
|
|
"forgectrl",
|
|
"src/cool.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/coolfmt.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/diag.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/gates.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/airflow.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/accel.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/settings.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/status.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/ui/**"
|
|
],
|
|
[
|
|
"grblhal-glowforge",
|
|
"src/glowforge_cooling.*"
|
|
],
|
|
[
|
|
"kernel-module-glowforge",
|
|
"src/thermal*"
|
|
],
|
|
[
|
|
"kernel-module-glowforge",
|
|
"src/pic*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/main.c"
|
|
]
|
|
],
|
|
"fingerprint": "b2f596483e810d4c267787c2f0d2c17922e409fc7bb75cd295411cc9dde193d2",
|
|
"hardware": "api",
|
|
"id": "cooling.critical-tier",
|
|
"inherited": false,
|
|
"kind": "auto",
|
|
"record": {
|
|
"answers": [],
|
|
"campaign": "c-20260919222216-7903",
|
|
"duration_s": 8,
|
|
"evidence": {
|
|
"baseline": {
|
|
"post": [],
|
|
"pre": []
|
|
},
|
|
"batch": {
|
|
"group": "unattended",
|
|
"ts": "2026-09-19T22:23:01Z"
|
|
},
|
|
"ceiling_off_accepted": 200,
|
|
"critical": {
|
|
"accel_watch": "watch",
|
|
"armed": false,
|
|
"down_c": 24.57,
|
|
"fan_gates": {
|
|
"air_assist": {
|
|
"floor": 6093,
|
|
"reading": 3711,
|
|
"state": "grace"
|
|
},
|
|
"exhaust": {
|
|
"floor": 6416,
|
|
"reading": 2895,
|
|
"state": "grace"
|
|
},
|
|
"intake_1": {
|
|
"floor": 2277,
|
|
"reading": 3471,
|
|
"state": "grace"
|
|
},
|
|
"intake_2": {
|
|
"floor": 2277,
|
|
"reading": 3436,
|
|
"state": "grace"
|
|
},
|
|
"purge": {
|
|
"floor": 345,
|
|
"reading": 629,
|
|
"state": "grace"
|
|
}
|
|
},
|
|
"fire_ok": false,
|
|
"fire_watch": "armed",
|
|
"gates_off": [],
|
|
"hold": true,
|
|
"limits": {
|
|
"air_assist_min_rpm": 6093,
|
|
"coolant_critical_c": 7.0,
|
|
"coolant_max_c": 6.0,
|
|
"coolant_min_c": 5.0,
|
|
"coolant_resume_c": 5.0,
|
|
"coolant_source": "local",
|
|
"exhaust_min_rpm": 6416,
|
|
"intake_min_rpm": 2277
|
|
},
|
|
"phase": "run",
|
|
"quiet_hold": false,
|
|
"reason": "CRITICAL: coolant 24.4 C at or over the 7 C critical line - hold, no resume this job",
|
|
"report_age_s": 0.0,
|
|
"resume_ok": false,
|
|
"up_c": 24.42,
|
|
"verdict": "CRITICAL"
|
|
},
|
|
"critical_after": {
|
|
"accel_watch": "watch",
|
|
"armed": false,
|
|
"down_c": 24.89,
|
|
"fan_gates": {
|
|
"air_assist": {
|
|
"floor": 6093,
|
|
"reading": 5614,
|
|
"state": "idle"
|
|
},
|
|
"exhaust": {
|
|
"floor": 6416,
|
|
"reading": 6172,
|
|
"state": "idle"
|
|
},
|
|
"intake_1": {
|
|
"floor": 2277,
|
|
"reading": 3860,
|
|
"state": "idle"
|
|
},
|
|
"intake_2": {
|
|
"floor": 2277,
|
|
"reading": 3781,
|
|
"state": "idle"
|
|
},
|
|
"purge": {
|
|
"floor": 345,
|
|
"reading": 628,
|
|
"state": "idle"
|
|
}
|
|
},
|
|
"fire_ok": false,
|
|
"fire_watch": "armed",
|
|
"gates_off": [],
|
|
"hold": true,
|
|
"limits": {
|
|
"air_assist_min_rpm": 6093,
|
|
"coolant_critical_c": 7.0,
|
|
"coolant_max_c": 6.0,
|
|
"coolant_min_c": 5.0,
|
|
"coolant_resume_c": 5.0,
|
|
"coolant_source": "local",
|
|
"exhaust_min_rpm": 6416,
|
|
"intake_min_rpm": 2277
|
|
},
|
|
"phase": "thermal",
|
|
"quiet_hold": false,
|
|
"reason": "coolant 24.4 C over 6 C limit - hold until 5 C",
|
|
"report_age_s": 1.0,
|
|
"resume_ok": false,
|
|
"up_c": 24.81,
|
|
"verdict": "OVERTEMP"
|
|
},
|
|
"critical_off": {
|
|
"accel_watch": "watch",
|
|
"armed": false,
|
|
"down_c": 24.65,
|
|
"fan_gates": {
|
|
"air_assist": {
|
|
"floor": 6093,
|
|
"reading": 3706,
|
|
"state": "grace"
|
|
},
|
|
"exhaust": {
|
|
"floor": 6416,
|
|
"reading": 6495,
|
|
"state": "grace"
|
|
},
|
|
"intake_1": {
|
|
"floor": 2277,
|
|
"reading": 3361,
|
|
"state": "grace"
|
|
},
|
|
"intake_2": {
|
|
"floor": 2277,
|
|
"reading": 3300,
|
|
"state": "grace"
|
|
},
|
|
"purge": {
|
|
"floor": 345,
|
|
"reading": 628,
|
|
"state": "grace"
|
|
}
|
|
},
|
|
"fire_ok": false,
|
|
"fire_watch": "armed",
|
|
"gates_off": [
|
|
"coolant_critical"
|
|
],
|
|
"hold": true,
|
|
"limits": {
|
|
"air_assist_min_rpm": 6093,
|
|
"coolant_critical_c": 7.0,
|
|
"coolant_max_c": 6.0,
|
|
"coolant_min_c": 5.0,
|
|
"coolant_resume_c": 5.0,
|
|
"coolant_source": "local",
|
|
"exhaust_min_rpm": 6416,
|
|
"intake_min_rpm": 2277
|
|
},
|
|
"phase": "run",
|
|
"quiet_hold": false,
|
|
"reason": "",
|
|
"report_age_s": 1.0,
|
|
"resume_ok": false,
|
|
"up_c": 24.42,
|
|
"verdict": "OVERTEMP"
|
|
},
|
|
"cross_check": {
|
|
"body": "cool_temp_critical_c must be above cool_temp_max",
|
|
"status": 400
|
|
},
|
|
"fixture": {
|
|
"channels": [
|
|
"lid",
|
|
"interlock",
|
|
"button"
|
|
],
|
|
"hostname": "<REDACTED-1>",
|
|
"ip": "<IP-1>",
|
|
"released": []
|
|
},
|
|
"mode": {
|
|
"detail": "already in grbl mode",
|
|
"found": "grbl",
|
|
"needs": "grbl",
|
|
"ok": true,
|
|
"switched": false
|
|
},
|
|
"orig": {
|
|
"cool_temp_critical_c": "",
|
|
"cool_temp_max": "",
|
|
"cool_temp_resume": ""
|
|
},
|
|
"restored": {
|
|
"accel_watch": "watch",
|
|
"armed": false,
|
|
"down_c": 24.42,
|
|
"fan_gates": {
|
|
"air_assist": {
|
|
"floor": 6093,
|
|
"reading": 3717,
|
|
"state": "grace"
|
|
},
|
|
"exhaust": {
|
|
"floor": 6416,
|
|
"reading": 5425,
|
|
"state": "grace"
|
|
},
|
|
"intake_1": {
|
|
"floor": 2277,
|
|
"reading": 3253,
|
|
"state": "grace"
|
|
},
|
|
"intake_2": {
|
|
"floor": 2277,
|
|
"reading": 3201,
|
|
"state": "grace"
|
|
},
|
|
"purge": {
|
|
"floor": 345,
|
|
"reading": 628,
|
|
"state": "grace"
|
|
}
|
|
},
|
|
"fire_ok": true,
|
|
"fire_watch": "armed",
|
|
"gates_off": [],
|
|
"hold": false,
|
|
"limits": {
|
|
"air_assist_min_rpm": 6093,
|
|
"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": 6416,
|
|
"intake_min_rpm": 2277
|
|
},
|
|
"phase": "run",
|
|
"quiet_hold": false,
|
|
"reason": "",
|
|
"report_age_s": 1.0,
|
|
"resume_ok": true,
|
|
"up_c": 24.57,
|
|
"verdict": "OK"
|
|
}
|
|
},
|
|
"fingerprint": "b2f596483e810d4c267787c2f0d2c17922e409fc7bb75cd295411cc9dde193d2",
|
|
"image": "20260919221704 (dev)",
|
|
"log": [
|
|
"22:30:41 start cooling.critical-tier (auto, api) in campaign c-20260919222216-7903",
|
|
"22:30:41 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
|
|
"22:30:41 fixture: <REDACTED-1> at <IP-1> covers lid, interlock, button",
|
|
"22:30:41 queued by the unattended queue opened 2026-09-19T22:23:01Z",
|
|
"22:30:41 baseline: pre: clean",
|
|
"22:30:41 mode: test needs grbl - already in grbl mode",
|
|
"22:30:41 original: {'cool_temp_max': '', 'cool_temp_resume': '', 'cool_temp_critical_c': ''}",
|
|
"22:30:43 critical leg: verdict CRITICAL fire_ok False hold True gates_off [] (after 1 s)",
|
|
"22:30:46 critical off leg: verdict OVERTEMP fire_ok False hold True gates_off ['coolant_critical'] (after 1 s)",
|
|
"22:30:48 restored: verdict OK fire_ok True hold False gates_off [] (after 1 s)",
|
|
"22:30:49 baseline: post: clean",
|
|
"22:30:49 result PASS"
|
|
],
|
|
"manifest_sha": "58495afe066c6964484fb07d5664895a4e742e65509c81c10056d9303570f182",
|
|
"message": "",
|
|
"result": "PASS",
|
|
"test": "cooling.critical-tier",
|
|
"ts": "2026-09-19T22:30:49Z"
|
|
},
|
|
"requires": [
|
|
"cooling.gate-off"
|
|
],
|
|
"satisfied": true,
|
|
"source_sha": "d54481e5a59ee89fc76336c41ecc37bc94fc879fa32c748ab7e41c8d43a1f2e9",
|
|
"subsystem": "cooling",
|
|
"title": "The coolant critical line is a fault above the ceiling's pause"
|
|
},
|
|
{
|
|
"always": false,
|
|
"covers": [
|
|
[
|
|
"forgectrl",
|
|
"src/cool.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/coolfmt.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/diag.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/gates.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/airflow.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/accel.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/settings.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/status.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/ui/**"
|
|
],
|
|
[
|
|
"grblhal-glowforge",
|
|
"src/glowforge_cooling.*"
|
|
],
|
|
[
|
|
"kernel-module-glowforge",
|
|
"src/thermal*"
|
|
],
|
|
[
|
|
"kernel-module-glowforge",
|
|
"src/pic*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/main.c"
|
|
]
|
|
],
|
|
"fingerprint": "211e9586fc24bc27a23b2716879fdd738fe0ba35ef6c70fd613db7e201662235",
|
|
"hardware": "api",
|
|
"id": "cooling.fan-gate-trips",
|
|
"inherited": false,
|
|
"kind": "auto",
|
|
"record": {
|
|
"answers": [],
|
|
"campaign": "c-20260919222216-7903",
|
|
"duration_s": 44,
|
|
"evidence": {
|
|
"baseline": {
|
|
"post": [],
|
|
"pre": []
|
|
},
|
|
"batch": {
|
|
"group": "unattended",
|
|
"ts": "2026-09-19T22:23:01Z"
|
|
},
|
|
"exhaust_off": {
|
|
"cool": {
|
|
"accel_watch": "watch",
|
|
"armed": false,
|
|
"down_c": 23.94,
|
|
"fan_gates": {
|
|
"air_assist": {
|
|
"floor": 6093,
|
|
"reading": 5703,
|
|
"state": "grace"
|
|
},
|
|
"exhaust": {
|
|
"floor": 0,
|
|
"reading": 7247,
|
|
"state": "off"
|
|
},
|
|
"intake_1": {
|
|
"floor": 2277,
|
|
"reading": 3800,
|
|
"state": "grace"
|
|
},
|
|
"intake_2": {
|
|
"floor": 2277,
|
|
"reading": 3819,
|
|
"state": "grace"
|
|
},
|
|
"purge": {
|
|
"floor": 345,
|
|
"reading": 628,
|
|
"state": "grace"
|
|
}
|
|
},
|
|
"fire_ok": true,
|
|
"fire_watch": "armed",
|
|
"gates_off": [
|
|
"exhaust"
|
|
],
|
|
"hold": false,
|
|
"limits": {
|
|
"air_assist_min_rpm": 6093,
|
|
"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": 0,
|
|
"intake_min_rpm": 2277
|
|
},
|
|
"phase": "run",
|
|
"quiet_hold": false,
|
|
"reason": "",
|
|
"report_age_s": 1.0,
|
|
"resume_ok": true,
|
|
"up_c": 23.87,
|
|
"verdict": "OK"
|
|
},
|
|
"gate": {
|
|
"floor": 0,
|
|
"reading": 7247,
|
|
"state": "off"
|
|
}
|
|
},
|
|
"exhaust_trip": {
|
|
"cool": {
|
|
"accel_watch": "watch",
|
|
"armed": false,
|
|
"down_c": 24.97,
|
|
"fan_gates": {
|
|
"air_assist": {
|
|
"floor": 6093,
|
|
"reading": 10965,
|
|
"state": "ok"
|
|
},
|
|
"exhaust": {
|
|
"floor": 20000,
|
|
"reading": 11672,
|
|
"state": "TRIPPED"
|
|
},
|
|
"intake_1": {
|
|
"floor": 2277,
|
|
"reading": 4162,
|
|
"state": "ok"
|
|
},
|
|
"intake_2": {
|
|
"floor": 2277,
|
|
"reading": 4171,
|
|
"state": "ok"
|
|
},
|
|
"purge": {
|
|
"floor": 345,
|
|
"reading": 628,
|
|
"state": "ok"
|
|
}
|
|
},
|
|
"fire_ok": false,
|
|
"fire_watch": "armed",
|
|
"gates_off": [],
|
|
"hold": true,
|
|
"limits": {
|
|
"air_assist_min_rpm": 6093,
|
|
"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": 20000,
|
|
"intake_min_rpm": 2277
|
|
},
|
|
"phase": "run",
|
|
"quiet_hold": false,
|
|
"reason": "AIRFLOW: exhaust 11672 under the 20000 floor for 3 s (duty 65535, reads 65535) - hold, no resume this job",
|
|
"report_age_s": 1.0,
|
|
"resume_ok": false,
|
|
"up_c": 24.57,
|
|
"verdict": "AIRFLOW"
|
|
},
|
|
"gate": {
|
|
"floor": 20000,
|
|
"reading": 11672,
|
|
"state": "TRIPPED"
|
|
}
|
|
},
|
|
"exhaust_trip_after": {
|
|
"accel_watch": "watch",
|
|
"armed": false,
|
|
"down_c": 24.57,
|
|
"fan_gates": {
|
|
"air_assist": {
|
|
"floor": 6093,
|
|
"reading": 5665,
|
|
"state": "idle"
|
|
},
|
|
"exhaust": {
|
|
"floor": 20000,
|
|
"reading": 7171,
|
|
"state": "idle"
|
|
},
|
|
"intake_1": {
|
|
"floor": 2277,
|
|
"reading": 3788,
|
|
"state": "idle"
|
|
},
|
|
"intake_2": {
|
|
"floor": 2277,
|
|
"reading": 3823,
|
|
"state": "idle"
|
|
},
|
|
"purge": {
|
|
"floor": 345,
|
|
"reading": 629,
|
|
"state": "idle"
|
|
}
|
|
},
|
|
"fire_ok": true,
|
|
"fire_watch": "armed",
|
|
"gates_off": [],
|
|
"hold": false,
|
|
"limits": {
|
|
"air_assist_min_rpm": 6093,
|
|
"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": 20000,
|
|
"intake_min_rpm": 2277
|
|
},
|
|
"phase": "idle",
|
|
"quiet_hold": false,
|
|
"reason": "AIRFLOW: exhaust 11672 under the 20000 floor for 3 s (duty 65535, reads 65535) - hold, no resume this job",
|
|
"report_age_s": 1.0,
|
|
"resume_ok": true,
|
|
"up_c": 24.42,
|
|
"verdict": "OK"
|
|
},
|
|
"fixture": {
|
|
"channels": [
|
|
"lid",
|
|
"interlock",
|
|
"button"
|
|
],
|
|
"hostname": "<REDACTED-1>",
|
|
"ip": "<IP-1>",
|
|
"released": []
|
|
},
|
|
"mode": {
|
|
"detail": "already in grbl mode",
|
|
"found": "grbl",
|
|
"needs": "grbl",
|
|
"ok": true,
|
|
"switched": false
|
|
},
|
|
"orig": {
|
|
"cool_fan_grace_s": "12",
|
|
"cool_purge_min_current": "345",
|
|
"cool_tach_exhaust_min_rpm": "6416"
|
|
},
|
|
"purge_trip": {
|
|
"cool": {
|
|
"accel_watch": "watch",
|
|
"armed": false,
|
|
"down_c": 23.94,
|
|
"fan_gates": {
|
|
"air_assist": {
|
|
"floor": 6093,
|
|
"reading": 10981,
|
|
"state": "ok"
|
|
},
|
|
"exhaust": {
|
|
"floor": 6416,
|
|
"reading": 11620,
|
|
"state": "ok"
|
|
},
|
|
"intake_1": {
|
|
"floor": 2277,
|
|
"reading": 4165,
|
|
"state": "ok"
|
|
},
|
|
"intake_2": {
|
|
"floor": 2277,
|
|
"reading": 4178,
|
|
"state": "ok"
|
|
},
|
|
"purge": {
|
|
"floor": 1023,
|
|
"reading": 627,
|
|
"state": "TRIPPED"
|
|
}
|
|
},
|
|
"fire_ok": false,
|
|
"fire_watch": "armed",
|
|
"gates_off": [],
|
|
"hold": true,
|
|
"limits": {
|
|
"air_assist_min_rpm": 6093,
|
|
"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": 6416,
|
|
"intake_min_rpm": 2277
|
|
},
|
|
"phase": "run",
|
|
"quiet_hold": false,
|
|
"reason": "AIRFLOW: purge 627 under the 1023 floor for 3 s - hold, no resume this job",
|
|
"report_age_s": 0.0,
|
|
"resume_ok": false,
|
|
"up_c": 24.26,
|
|
"verdict": "AIRFLOW"
|
|
},
|
|
"gate": {
|
|
"floor": 1023,
|
|
"reading": 627,
|
|
"state": "TRIPPED"
|
|
}
|
|
},
|
|
"restored": {
|
|
"air_assist": {
|
|
"floor": 6093,
|
|
"reading": 10965,
|
|
"state": "ok"
|
|
},
|
|
"exhaust": {
|
|
"floor": 6416,
|
|
"reading": 11631,
|
|
"state": "ok"
|
|
},
|
|
"intake_1": {
|
|
"floor": 2277,
|
|
"reading": 4196,
|
|
"state": "ok"
|
|
},
|
|
"intake_2": {
|
|
"floor": 2277,
|
|
"reading": 4185,
|
|
"state": "ok"
|
|
},
|
|
"purge": {
|
|
"floor": 345,
|
|
"reading": 627,
|
|
"state": "ok"
|
|
}
|
|
}
|
|
},
|
|
"fingerprint": "211e9586fc24bc27a23b2716879fdd738fe0ba35ef6c70fd613db7e201662235",
|
|
"image": "20260919221704 (dev)",
|
|
"log": [
|
|
"22:30:49 start cooling.fan-gate-trips (auto, api) in campaign c-20260919222216-7903",
|
|
"22:30:49 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
|
|
"22:30:49 fixture: <REDACTED-1> at <IP-1> covers lid, interlock, button",
|
|
"22:30:49 queued by the unattended queue opened 2026-09-19T22:23:01Z",
|
|
"22:30:49 baseline: pre: clean",
|
|
"22:30:49 mode: test needs grbl - already in grbl mode",
|
|
"22:30:49 original: {'cool_tach_exhaust_min_rpm': '6416', 'cool_purge_min_current': '345', 'cool_fan_grace_s': '12'}",
|
|
"22:31:02 exhaust trip leg: verdict AIRFLOW fire_ok False hold True gates_off [] (after 12 s)",
|
|
"22:31:16 purge trip leg: verdict AIRFLOW fire_ok False hold True gates_off [] (after 12 s)",
|
|
"22:31:18 exhaust off leg: verdict OK fire_ok True hold False gates_off ['exhaust'] (after 1 s)",
|
|
"22:31:20 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
|
|
"22:31:32 restored: verdict OK fire_ok True hold False gates_off [] (after 13 s)",
|
|
"22:31:33 fans at run duty: {'exhaust': '11631/6416', 'intake_1': '4196/2277', 'intake_2': '4185/2277', 'air_assist': '10965/6093', 'purge': '627/345'}",
|
|
"22:31:34 baseline: post: clean",
|
|
"22:31:34 result PASS"
|
|
],
|
|
"manifest_sha": "58495afe066c6964484fb07d5664895a4e742e65509c81c10056d9303570f182",
|
|
"message": "",
|
|
"result": "PASS",
|
|
"test": "cooling.fan-gate-trips",
|
|
"ts": "2026-09-19T22:31:34Z"
|
|
},
|
|
"requires": [
|
|
"cooling.gate-off"
|
|
],
|
|
"satisfied": true,
|
|
"source_sha": "d761feb5051ba3b3f0b3149816d4783347fe356a78fbe3a1bc7b66bfea46fc53",
|
|
"subsystem": "cooling",
|
|
"title": "A fan under its floor past the grace is a fault; a floor of zero is off"
|
|
},
|
|
{
|
|
"always": false,
|
|
"covers": [
|
|
[
|
|
"forgectrl",
|
|
"src/cool.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/coolfmt.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/diag.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/gates.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/airflow.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/accel.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/settings.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/status.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/ui/**"
|
|
],
|
|
[
|
|
"grblhal-glowforge",
|
|
"src/glowforge_cooling.*"
|
|
],
|
|
[
|
|
"kernel-module-glowforge",
|
|
"src/thermal*"
|
|
],
|
|
[
|
|
"kernel-module-glowforge",
|
|
"src/pic*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/main.c"
|
|
]
|
|
],
|
|
"fingerprint": "262472320b58421c41a68673b13a774fd1a3e2d492e9a71edb60edb33d6cc854",
|
|
"hardware": "api",
|
|
"id": "cooling.flow-under-load",
|
|
"inherited": true,
|
|
"kind": "live",
|
|
"record": {
|
|
"answers": [],
|
|
"campaign": "c-20260919215024-c402",
|
|
"duration_s": 95,
|
|
"evidence": {
|
|
"actions": [
|
|
{
|
|
"by": "operator",
|
|
"channel": "button",
|
|
"state": "presence",
|
|
"took_s": 5.58,
|
|
"ts": "2026-09-19T21:51:20Z"
|
|
},
|
|
{
|
|
"by": "fixture",
|
|
"channel": "button",
|
|
"state": "arm",
|
|
"took_s": 0.25,
|
|
"ts": "2026-09-19T21:51:20Z"
|
|
}
|
|
],
|
|
"baseline": {
|
|
"post": [],
|
|
"pre": []
|
|
},
|
|
"batch": {
|
|
"group": "attended",
|
|
"ts": "2026-09-19T21:50:24Z"
|
|
},
|
|
"check_s": 50,
|
|
"disarm_after_m2_s": 0.1,
|
|
"dt_c": 9.0,
|
|
"emission_peak": 255,
|
|
"fixture": {
|
|
"channels": [
|
|
"lid",
|
|
"interlock",
|
|
"button"
|
|
],
|
|
"hostname": "<REDACTED-1>",
|
|
"ip": "<IP-1>",
|
|
"released": []
|
|
},
|
|
"heater_seen": true,
|
|
"job_to_verdict_s": 72.2,
|
|
"kind": "coolant flow verified",
|
|
"laser_share_c": 1.6,
|
|
"limit_c": 14.5,
|
|
"mode": {
|
|
"detail": "already in grbl mode",
|
|
"found": "grbl",
|
|
"needs": "grbl",
|
|
"ok": true,
|
|
"switched": false
|
|
},
|
|
"operator": {
|
|
"ack_live": true,
|
|
"ts": "2026-09-19T21:51:13Z"
|
|
},
|
|
"prerequisites": {
|
|
"missing": [
|
|
"cooling.flow-verify"
|
|
],
|
|
"overridden": true,
|
|
"ts": "2026-09-19T21:51:13Z"
|
|
},
|
|
"raw_rise_c": 13.1,
|
|
"rise_c": 11.5,
|
|
"verdict_line": "coolant flow verified (heater rise 11.5 C, dT 9.0 C; laser 1.6 off 13.1)",
|
|
"verdicts_seen": []
|
|
},
|
|
"fingerprint": "262472320b58421c41a68673b13a774fd1a3e2d492e9a71edb60edb33d6cc854",
|
|
"image": "20260919214619 (dev)",
|
|
"log": [
|
|
"21:51:13 start cooling.flow-under-load (live, api) in campaign c-20260919215024-c402",
|
|
"21:51:13 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
|
|
"21:51:13 fixture: <REDACTED-1> at <IP-1> covers lid, interlock, button",
|
|
"21:51:13 prerequisites overridden by the operator - not satisfied: cooling.flow-verify",
|
|
"21:51:13 queued by the attended queue opened 2026-09-19T21:50:24Z",
|
|
"21:51:13 baseline: pre: clean",
|
|
"21:51:13 mode: test needs grbl - already in grbl mode",
|
|
"21:51:14 connect: Idle",
|
|
"21:51:14 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:51:14 READY: waiting for the operator's press on the machine (the bench then does every press in this test)",
|
|
"21:51:20 READY: operator present (press after 5.6 s); the bench takes the presses",
|
|
"21:51:20 ARM: the fixture presses when the button lights (the bench's arm_press opt-in)",
|
|
"21:51:20 ARM press by the fixture, button lit after 0.3 s",
|
|
"21:51:44 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
|
|
"21:52:14 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
|
|
"21:52:32 M2: ['ok']",
|
|
"21:52:32 engine: coolant flow verified (heater rise 11.5 C, dT 9.0 C; laser 1.6 off 13.1)",
|
|
"21:52:32 PASS: lit through the window, raw rise 13.1 C, laser 1.6 C off, judged 11.5 C against 14.5 (dT 9.0), window closed 0.1 s after M2",
|
|
"21:52:45 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
|
|
"21:52:48 baseline: cool: run/armed=False/hold=False ended on its own after 16 s; the engine's own post-job work, not a leftover",
|
|
"21:52:48 baseline: post: clean",
|
|
"21:52:48 result PASS"
|
|
],
|
|
"manifest_sha": "5dbf1f84b9aea447033e38de4b79d4fe8af2309af74367f0befbe9429d44d170",
|
|
"message": "",
|
|
"result": "PASS",
|
|
"test": "cooling.flow-under-load",
|
|
"ts": "2026-09-19T21:52:48Z"
|
|
},
|
|
"requires": [
|
|
"laser.emission-witness",
|
|
"cooling.flow-verify"
|
|
],
|
|
"satisfied": true,
|
|
"source_sha": "c82f70246fed87f5fdf66d47aff6e1ec73dddf30594a6cb9b5ad5a6c450dbbad",
|
|
"subsystem": "cooling",
|
|
"title": "The flow check reads true with the tube lit through its window"
|
|
},
|
|
{
|
|
"always": false,
|
|
"covers": [
|
|
[
|
|
"forgectrl",
|
|
"src/cool.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/coolfmt.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/diag.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/gates.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/airflow.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/accel.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/settings.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/status.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/ui/**"
|
|
],
|
|
[
|
|
"grblhal-glowforge",
|
|
"src/glowforge_cooling.*"
|
|
],
|
|
[
|
|
"kernel-module-glowforge",
|
|
"src/thermal*"
|
|
],
|
|
[
|
|
"kernel-module-glowforge",
|
|
"src/pic*"
|
|
],
|
|
[
|
|
"kernel-module-glowforge",
|
|
"src/head*"
|
|
]
|
|
],
|
|
"fingerprint": "32b066be135a60b45c8ae9fdbc865c4e8c88f9658fb3dc43cd7cabf0f9768124",
|
|
"hardware": "api",
|
|
"id": "cooling.fan-duty-readback",
|
|
"inherited": false,
|
|
"kind": "auto",
|
|
"record": {
|
|
"answers": [],
|
|
"campaign": "c-20260919222216-7903",
|
|
"duration_s": 15,
|
|
"evidence": {
|
|
"baseline": {
|
|
"post": [],
|
|
"pre": []
|
|
},
|
|
"batch": {
|
|
"group": "unattended",
|
|
"ts": "2026-09-19T22:23:01Z"
|
|
},
|
|
"fixture": {
|
|
"channels": [
|
|
"lid",
|
|
"interlock",
|
|
"button"
|
|
],
|
|
"hostname": "<REDACTED-1>",
|
|
"ip": "<IP-1>",
|
|
"released": []
|
|
},
|
|
"idle_duties": {
|
|
"head/air_assist_pwm": 204,
|
|
"thermal/exhaust_pwm": 0,
|
|
"thermal/intake_pwm": 0
|
|
},
|
|
"mode": {
|
|
"detail": "already in grbl mode",
|
|
"found": "grbl",
|
|
"needs": "grbl",
|
|
"ok": true,
|
|
"switched": false
|
|
},
|
|
"put_back": {
|
|
"after_s": 0.5,
|
|
"duties": {
|
|
"head/air_assist_pwm": 1023,
|
|
"thermal/exhaust_pwm": 65535
|
|
}
|
|
},
|
|
"run_duties": {
|
|
"head/air_assist_pwm": 1023,
|
|
"thermal/exhaust_pwm": 65535,
|
|
"thermal/intake_pwm": 43278
|
|
},
|
|
"verdict_after": {
|
|
"hold": false,
|
|
"reason": "",
|
|
"verdict": "OK"
|
|
}
|
|
},
|
|
"fingerprint": "32b066be135a60b45c8ae9fdbc865c4e8c88f9658fb3dc43cd7cabf0f9768124",
|
|
"image": "20260919221704 (dev)",
|
|
"log": [
|
|
"22:31:34 start cooling.fan-duty-readback (auto, api) in campaign c-20260919222216-7903",
|
|
"22:31:34 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
|
|
"22:31:34 fixture: <REDACTED-1> at <IP-1> covers lid, interlock, button",
|
|
"22:31:34 queued by the unattended queue opened 2026-09-19T22:23:01Z",
|
|
"22:31:34 baseline: pre: clean",
|
|
"22:31:34 mode: test needs grbl - already in grbl mode",
|
|
"22:31:36 readback: verdict OK phase run fire_ok True hold False (after 1 s)",
|
|
"22:31:38 duties at run: {'head/air_assist_pwm': 1023, 'thermal/exhaust_pwm': 65535, 'thermal/intake_pwm': 43278}",
|
|
"22:31:38 written behind the engine's back: {'head/air_assist_pwm': 204, 'thermal/exhaust_pwm': 0}",
|
|
"22:31:38 put back after 0.5 s: {'head/air_assist_pwm': 1023, 'thermal/exhaust_pwm': 65535}",
|
|
"22:31:49 duties at idle: {'head/air_assist_pwm': 204, 'thermal/exhaust_pwm': 0, 'thermal/intake_pwm': 0}",
|
|
"22:31:49 baseline: post: clean",
|
|
"22:31:49 result PASS"
|
|
],
|
|
"manifest_sha": "58495afe066c6964484fb07d5664895a4e742e65509c81c10056d9303570f182",
|
|
"message": "",
|
|
"result": "PASS",
|
|
"test": "cooling.fan-duty-readback",
|
|
"ts": "2026-09-19T22:31:49Z"
|
|
},
|
|
"requires": [
|
|
"kernel.latch-locked-idle"
|
|
],
|
|
"satisfied": true,
|
|
"source_sha": "bbbd0f6fef4bf5068bff619365b57515198d4296a383e469012d14e3b4d276be",
|
|
"subsystem": "cooling",
|
|
"title": "A fan duty a device lost is read back and put back inside a tick"
|
|
},
|
|
{
|
|
"always": false,
|
|
"covers": [
|
|
[
|
|
"forgectrl",
|
|
"src/cool.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/coolfmt.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/diag.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/gates.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/airflow.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/accel.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/settings.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/status.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/ui/**"
|
|
],
|
|
[
|
|
"grblhal-glowforge",
|
|
"src/glowforge_cooling.*"
|
|
],
|
|
[
|
|
"kernel-module-glowforge",
|
|
"src/thermal*"
|
|
],
|
|
[
|
|
"kernel-module-glowforge",
|
|
"src/pic*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/super.*"
|
|
]
|
|
],
|
|
"fingerprint": "c9205b747ca145f15f69de67b742776bbbbb9a9d8b4882e3cfa4728bb07a108b",
|
|
"hardware": "api",
|
|
"id": "cooling.fail-tier-stop",
|
|
"inherited": false,
|
|
"kind": "operator",
|
|
"record": {
|
|
"answers": [],
|
|
"campaign": "c-20260919222216-7903",
|
|
"duration_s": 19,
|
|
"evidence": {
|
|
"actions": [
|
|
{
|
|
"by": "operator",
|
|
"channel": "button",
|
|
"state": "arm",
|
|
"ts": "2026-09-19T22:31:51Z"
|
|
}
|
|
],
|
|
"baseline": {
|
|
"post": [],
|
|
"pre": []
|
|
},
|
|
"batch": {
|
|
"group": "unattended",
|
|
"ts": "2026-09-19T22:23:01Z"
|
|
},
|
|
"fixture": {
|
|
"channels": [
|
|
"lid",
|
|
"interlock",
|
|
"button"
|
|
],
|
|
"hostname": "<REDACTED-1>",
|
|
"ip": "<IP-1>",
|
|
"released": []
|
|
},
|
|
"mode": {
|
|
"detail": "already in grbl mode",
|
|
"found": "grbl",
|
|
"needs": "grbl",
|
|
"ok": true,
|
|
"switched": false
|
|
},
|
|
"orig": {
|
|
"cool_accel_abort": "",
|
|
"cool_accel_x_alert": "",
|
|
"cool_accel_y_alert": ""
|
|
},
|
|
"result": {
|
|
"emission": 0,
|
|
"engine_lines": [
|
|
"2026-09-19T22:31:52.328349+00:00 forgectrl[1525] WARNING cool: HEAD CRASH SIGNAL (axes xy) - motion stopped, laser locked"
|
|
],
|
|
"fault_cleared_s": 0.005414485931396484,
|
|
"kernel": "idle",
|
|
"latch_locked": true,
|
|
"mode_after": {
|
|
"controller": "running",
|
|
"gated": false,
|
|
"local": false,
|
|
"mode": "grbl",
|
|
"motion": "verified",
|
|
"pid": 2309,
|
|
"why": ""
|
|
},
|
|
"super_lines": [
|
|
"2026-09-19T22:31:52.328650+00:00 forgectrl[1525] WARNING super: head crash signal - the controller is stopped and started again"
|
|
]
|
|
}
|
|
},
|
|
"fingerprint": "c9205b747ca145f15f69de67b742776bbbbb9a9d8b4882e3cfa4728bb07a108b",
|
|
"image": "20260919221704 (dev)",
|
|
"log": [
|
|
"22:31:50 start cooling.fail-tier-stop (operator, api) in campaign c-20260919222216-7903",
|
|
"22:31:50 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
|
|
"22:31:50 fixture: <REDACTED-1> at <IP-1> covers lid, interlock, button",
|
|
"22:31:50 fixture: running unattended (no prompt can be answered)",
|
|
"22:31:50 queued by the unattended queue opened 2026-09-19T22:23:01Z",
|
|
"22:31:50 baseline: pre: clean",
|
|
"22:31:50 mode: test needs grbl - already in grbl mode",
|
|
"22:31:51 connect: Idle",
|
|
"22:31:51 READY (fixture performs the step): DARK JOB (S0, nothing fires). Bed clear with 40 mm of free +X travel, lid closed. The head moves 20 mm and the controller restarts on its own.",
|
|
"22:31:51 NOTICE: The button lights white: press it to arm. The machine fires after your press.",
|
|
"22:31:52 the crash tier tripped after 1.045210361480713 s",
|
|
"22:31:53 after the crash tier: {'mode_after': {'mode': 'grbl', 'controller': 'running', 'pid': 2309, 'motion': 'verified', 'gated': False, 'local': False, 'why': ''}, 'engine_lines': ['2026-09-19T22:31:52.328349+00:00 forgectrl[1525] WARNING cool: HEAD CRASH SIGNAL (axes xy) - motion stopped, laser locked'], 'super_lines': ['2026-09-19T22:31:52.328650+00:00 forgectrl[1525] WARNING super: head crash signal - the controller is stopped and started again'], 'emission': 0, 'kernel': 'idle', 'latch_locked': True}",
|
|
"22:31:53 the crash fault ended with the run session after 0.005414485931396484 s: {'phase': 'smoke', 'verdict': 'OK', 'hold': False, 'armed': False}",
|
|
"22:31:53 restore thresholds: POST /settings {'cool_accel_x_alert': '', 'cool_accel_y_alert': '', 'cool_accel_abort': ''} -> 200",
|
|
"22:31:53 PASS: the crash tier stopped the job, locked the latch, and the supervisor restarted the controller (pid 1945 -> 2309)",
|
|
"22:32:09 baseline: cool: smoke/armed=False/hold=False ended on its own after 16 s; the engine's own post-job work, not a leftover",
|
|
"22:32:10 baseline: post: clean",
|
|
"22:32:10 result PASS"
|
|
],
|
|
"manifest_sha": "58495afe066c6964484fb07d5664895a4e742e65509c81c10056d9303570f182",
|
|
"message": "",
|
|
"result": "PASS",
|
|
"test": "cooling.fail-tier-stop",
|
|
"ts": "2026-09-19T22:32:10Z"
|
|
},
|
|
"requires": [
|
|
"cooling.crash-watch-plumbing",
|
|
"motion.deadman"
|
|
],
|
|
"satisfied": true,
|
|
"source_sha": "00cb0813fcd86b552c66dfef2e7c074949646343e0bc63e1b66744981893b145",
|
|
"subsystem": "cooling",
|
|
"title": "A fail-tier verdict ends the controller: CRASH stops motion, locks the laser, and the supervisor restarts the controller"
|
|
},
|
|
{
|
|
"always": false,
|
|
"covers": [
|
|
[
|
|
"grblhal-glowforge",
|
|
"src/**"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/main.c"
|
|
]
|
|
],
|
|
"fingerprint": "b647b86f01a8f5b4acd4bd5e227b172ae681235709d46dbf41ecd6e46de9decb",
|
|
"hardware": "api",
|
|
"id": "laser.power-floor",
|
|
"inherited": true,
|
|
"kind": "auto",
|
|
"record": {
|
|
"answers": [],
|
|
"campaign": "c-20260919210959-8780",
|
|
"duration_s": 0,
|
|
"evidence": {
|
|
"baseline": {
|
|
"post": [],
|
|
"pre": []
|
|
},
|
|
"batch": {
|
|
"group": "unattended",
|
|
"ts": "2026-09-19T21:09:59Z"
|
|
},
|
|
"configured_floor": 14.0,
|
|
"fixture": {
|
|
"channels": [
|
|
"lid",
|
|
"interlock",
|
|
"button"
|
|
],
|
|
"hostname": "<REDACTED-1>",
|
|
"ip": "<IP-1>",
|
|
"released": []
|
|
},
|
|
"mode": {
|
|
"detail": "already in grbl mode",
|
|
"found": "grbl",
|
|
"needs": "grbl",
|
|
"ok": true,
|
|
"switched": false
|
|
},
|
|
"pwmsar_floor": 17,
|
|
"settings": {
|
|
"$30": 1000.0,
|
|
"$31": 0.0,
|
|
"$32": 1.0,
|
|
"$35": 14.0,
|
|
"$36": 100.0
|
|
}
|
|
},
|
|
"fingerprint": "b647b86f01a8f5b4acd4bd5e227b172ae681235709d46dbf41ecd6e46de9decb",
|
|
"image": "20260919210531 (dev)",
|
|
"log": [
|
|
"21:11:53 start laser.power-floor (auto, api) in campaign c-20260919210959-8780",
|
|
"21:11:53 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
|
|
"21:11:53 fixture: <REDACTED-1> at <IP-1> covers lid, interlock, button",
|
|
"21:11:53 queued by the unattended queue opened 2026-09-19T21:09:59Z",
|
|
"21:11:53 baseline: pre: clean",
|
|
"21:11:53 mode: test needs grbl - already in grbl mode",
|
|
"21:11:53 $35=14.0% -> PWMSAR 17 of 127 ($31=0.0, $32=1.0, $36=100.0)",
|
|
"21:11:53 PASS: nonzero S never commands less than PWMSAR 17",
|
|
"21:11:53 baseline: post: clean",
|
|
"21:11:53 result PASS"
|
|
],
|
|
"manifest_sha": "5221f3466ae2497ca49fbb8cbe5d4eff49fab0f8c627190416aa2320948f69c4",
|
|
"message": "",
|
|
"result": "PASS",
|
|
"test": "laser.power-floor",
|
|
"ts": "2026-09-19T21:11:53Z"
|
|
},
|
|
"requires": [],
|
|
"satisfied": true,
|
|
"source_sha": "abb43f2b4d25a62142dc91365d52eb704ab1d43f86b52823b3eb9bb8bf9678e0",
|
|
"subsystem": "laser",
|
|
"title": "The derived floor is the one in force"
|
|
},
|
|
{
|
|
"always": true,
|
|
"covers": [
|
|
[
|
|
"grblhal-glowforge",
|
|
"src/**"
|
|
],
|
|
[
|
|
"kernel-module-glowforge",
|
|
"**"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/super.c"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/cool.c"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/status.c"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/main.c"
|
|
]
|
|
],
|
|
"fingerprint": "5a48764d4967d6e6e923c00bbac93ecebfc8a6cda4d0d1f6015a30452742b6c9",
|
|
"hardware": "api",
|
|
"id": "laser.emission-witness",
|
|
"inherited": false,
|
|
"kind": "live",
|
|
"record": {
|
|
"answers": [
|
|
{
|
|
"answer": "Yes",
|
|
"question": "Did the laser mark a 20 mm square outline on the scrap, all four sides?",
|
|
"ts": "2026-09-19T22:22:46Z"
|
|
}
|
|
],
|
|
"campaign": "c-20260919222216-7903",
|
|
"duration_s": 41,
|
|
"evidence": {
|
|
"actions": [
|
|
{
|
|
"by": "operator",
|
|
"channel": "button",
|
|
"state": "presence",
|
|
"took_s": 5.28,
|
|
"ts": "2026-09-19T22:22:22Z"
|
|
},
|
|
{
|
|
"by": "fixture",
|
|
"channel": "button",
|
|
"state": "arm",
|
|
"took_s": 0.26,
|
|
"ts": "2026-09-19T22:22:22Z"
|
|
}
|
|
],
|
|
"armed_seen": true,
|
|
"baseline": {
|
|
"post": [],
|
|
"pre": []
|
|
},
|
|
"batch": {
|
|
"group": "attended",
|
|
"ts": "2026-09-19T22:22:16Z"
|
|
},
|
|
"beam": {
|
|
"delta": 1042,
|
|
"digital_seen": true,
|
|
"idle": 1838,
|
|
"peak": 2880,
|
|
"samples": 97
|
|
},
|
|
"button_dark": false,
|
|
"button_latch_set_at": [],
|
|
"button_latch_unlocked_max": 0,
|
|
"button_latch_unlocked_samples": 46,
|
|
"disarm_after_idle_s": 0.0,
|
|
"emission_end": 0,
|
|
"emission_peak": 150,
|
|
"exhaust_at_first_fire": 11706,
|
|
"exhaust_floor": 6416.0,
|
|
"fixture": {
|
|
"channels": [
|
|
"lid",
|
|
"interlock",
|
|
"button"
|
|
],
|
|
"hostname": "<REDACTED-1>",
|
|
"ip": "<IP-1>",
|
|
"released": []
|
|
},
|
|
"hv_enable_back_lit": true,
|
|
"hv_enable_dipped": true,
|
|
"hv_max": 1023,
|
|
"hv_min": 0,
|
|
"idle_airflow_fire": [],
|
|
"lid_ir_peak": [
|
|
51,
|
|
50,
|
|
54,
|
|
55
|
|
],
|
|
"mode": {
|
|
"detail": "already in grbl mode",
|
|
"found": "grbl",
|
|
"needs": "grbl",
|
|
"ok": true,
|
|
"switched": false
|
|
},
|
|
"operator": {
|
|
"ack_live": true,
|
|
"ts": "2026-09-19T22:22:16Z"
|
|
},
|
|
"pgood_peak": 255,
|
|
"pre_fire": {
|
|
"armed": false,
|
|
"beam": 1838,
|
|
"beam_d": 0,
|
|
"button": false,
|
|
"button_latch": 1,
|
|
"button_lit": false,
|
|
"emission": 0,
|
|
"exhaust": 0,
|
|
"faults": 0,
|
|
"fire_watch": "armed",
|
|
"gstate": null,
|
|
"homed": false,
|
|
"hv": 0,
|
|
"hv_enable": false,
|
|
"il": 45,
|
|
"ir": [
|
|
49,
|
|
48,
|
|
52,
|
|
53
|
|
],
|
|
"kstate": "idle",
|
|
"lid": true,
|
|
"locked": true,
|
|
"msgs": "",
|
|
"pgood": 255,
|
|
"phase": "idle",
|
|
"t": 1789856537.117594,
|
|
"verdict": "OK"
|
|
},
|
|
"prerequisites": {
|
|
"missing": [
|
|
"kernel.latch-locked-idle",
|
|
"kernel.k1-k2"
|
|
],
|
|
"overridden": true,
|
|
"ts": "2026-09-19T22:22:16Z"
|
|
},
|
|
"samples": 97,
|
|
"trail": [
|
|
[
|
|
0.0,
|
|
null,
|
|
"idle",
|
|
0,
|
|
false,
|
|
"idle",
|
|
45,
|
|
1,
|
|
true,
|
|
true,
|
|
false,
|
|
false,
|
|
1839,
|
|
0,
|
|
null
|
|
],
|
|
[
|
|
0.05,
|
|
"Idle",
|
|
"idle",
|
|
0,
|
|
true,
|
|
"idle",
|
|
37,
|
|
1,
|
|
true,
|
|
true,
|
|
false,
|
|
false,
|
|
1839,
|
|
0,
|
|
"[MSG:Info: press the button to start the laser job]"
|
|
],
|
|
[
|
|
0.25,
|
|
"Idle",
|
|
"idle",
|
|
0,
|
|
true,
|
|
"idle",
|
|
33,
|
|
0,
|
|
false,
|
|
true,
|
|
false,
|
|
false,
|
|
1840,
|
|
0,
|
|
null
|
|
],
|
|
[
|
|
0.46,
|
|
"Idle",
|
|
"idle",
|
|
0,
|
|
true,
|
|
"idle",
|
|
33,
|
|
0,
|
|
false,
|
|
true,
|
|
true,
|
|
false,
|
|
1839,
|
|
0,
|
|
null
|
|
],
|
|
[
|
|
0.66,
|
|
"Idle",
|
|
"idle",
|
|
0,
|
|
true,
|
|
"idle",
|
|
33,
|
|
0,
|
|
false,
|
|
true,
|
|
false,
|
|
false,
|
|
1837,
|
|
0,
|
|
null
|
|
],
|
|
[
|
|
0.86,
|
|
"Idle",
|
|
"idle",
|
|
0,
|
|
true,
|
|
"run",
|
|
33,
|
|
0,
|
|
false,
|
|
true,
|
|
false,
|
|
false,
|
|
1839,
|
|
0,
|
|
null
|
|
],
|
|
[
|
|
1.06,
|
|
"Idle",
|
|
"idle",
|
|
0,
|
|
true,
|
|
"run",
|
|
33,
|
|
0,
|
|
false,
|
|
true,
|
|
false,
|
|
false,
|
|
1839,
|
|
0,
|
|
null
|
|
],
|
|
[
|
|
1.26,
|
|
"Idle",
|
|
"idle",
|
|
0,
|
|
true,
|
|
"run",
|
|
33,
|
|
0,
|
|
false,
|
|
true,
|
|
false,
|
|
false,
|
|
1839,
|
|
0,
|
|
null
|
|
],
|
|
[
|
|
1.49,
|
|
"Idle",
|
|
"idle",
|
|
0,
|
|
true,
|
|
"run",
|
|
33,
|
|
0,
|
|
false,
|
|
true,
|
|
false,
|
|
false,
|
|
1838,
|
|
0,
|
|
null
|
|
],
|
|
[
|
|
1.7,
|
|
"Idle",
|
|
"idle",
|
|
0,
|
|
true,
|
|
"run",
|
|
33,
|
|
0,
|
|
false,
|
|
true,
|
|
false,
|
|
false,
|
|
1838,
|
|
0,
|
|
null
|
|
],
|
|
[
|
|
1.9,
|
|
"Idle",
|
|
"idle",
|
|
0,
|
|
true,
|
|
"run",
|
|
33,
|
|
0,
|
|
false,
|
|
true,
|
|
false,
|
|
false,
|
|
1839,
|
|
0,
|
|
null
|
|
],
|
|
[
|
|
2.1,
|
|
"Idle",
|
|
"idle",
|
|
0,
|
|
true,
|
|
"run",
|
|
33,
|
|
0,
|
|
false,
|
|
true,
|
|
false,
|
|
false,
|
|
1838,
|
|
0,
|
|
null
|
|
],
|
|
[
|
|
2.3,
|
|
"Idle",
|
|
"idle",
|
|
0,
|
|
true,
|
|
"run",
|
|
33,
|
|
0,
|
|
false,
|
|
true,
|
|
false,
|
|
false,
|
|
1839,
|
|
0,
|
|
null
|
|
],
|
|
[
|
|
2.5,
|
|
"Idle",
|
|
"idle",
|
|
0,
|
|
true,
|
|
"run",
|
|
33,
|
|
0,
|
|
false,
|
|
true,
|
|
false,
|
|
false,
|
|
1838,
|
|
0,
|
|
null
|
|
],
|
|
[
|
|
2.71,
|
|
"Idle",
|
|
"idle",
|
|
0,
|
|
true,
|
|
"run",
|
|
33,
|
|
0,
|
|
false,
|
|
true,
|
|
false,
|
|
false,
|
|
1840,
|
|
0,
|
|
null
|
|
],
|
|
[
|
|
2.92,
|
|
"Idle",
|
|
"idle",
|
|
0,
|
|
true,
|
|
"run",
|
|
33,
|
|
0,
|
|
false,
|
|
true,
|
|
false,
|
|
false,
|
|
1836,
|
|
0,
|
|
null
|
|
],
|
|
[
|
|
3.13,
|
|
"Idle",
|
|
"idle",
|
|
0,
|
|
true,
|
|
"run",
|
|
33,
|
|
0,
|
|
false,
|
|
true,
|
|
false,
|
|
false,
|
|
1841,
|
|
0,
|
|
null
|
|
],
|
|
[
|
|
3.33,
|
|
"Idle",
|
|
"idle",
|
|
0,
|
|
true,
|
|
"run",
|
|
33,
|
|
0,
|
|
false,
|
|
true,
|
|
false,
|
|
false,
|
|
1835,
|
|
0,
|
|
null
|
|
],
|
|
[
|
|
3.53,
|
|
"Idle",
|
|
"idle",
|
|
0,
|
|
true,
|
|
"run",
|
|
33,
|
|
0,
|
|
false,
|
|
true,
|
|
false,
|
|
false,
|
|
1839,
|
|
0,
|
|
null
|
|
],
|
|
[
|
|
3.75,
|
|
"Idle",
|
|
"idle",
|
|
0,
|
|
true,
|
|
"run",
|
|
33,
|
|
0,
|
|
false,
|
|
true,
|
|
false,
|
|
false,
|
|
1837,
|
|
0,
|
|
null
|
|
],
|
|
[
|
|
3.95,
|
|
"Idle",
|
|
"idle",
|
|
0,
|
|
true,
|
|
"run",
|
|
33,
|
|
0,
|
|
false,
|
|
true,
|
|
false,
|
|
false,
|
|
1837,
|
|
0,
|
|
null
|
|
],
|
|
[
|
|
4.15,
|
|
"Idle",
|
|
"idle",
|
|
0,
|
|
true,
|
|
"run",
|
|
33,
|
|
0,
|
|
false,
|
|
true,
|
|
false,
|
|
false,
|
|
1835,
|
|
0,
|
|
null
|
|
],
|
|
[
|
|
4.35,
|
|
"Idle",
|
|
"idle",
|
|
0,
|
|
true,
|
|
"run",
|
|
33,
|
|
0,
|
|
false,
|
|
true,
|
|
false,
|
|
false,
|
|
1836,
|
|
0,
|
|
null
|
|
],
|
|
[
|
|
4.55,
|
|
"Idle",
|
|
"idle",
|
|
0,
|
|
true,
|
|
"run",
|
|
33,
|
|
0,
|
|
false,
|
|
true,
|
|
false,
|
|
false,
|
|
1836,
|
|
0,
|
|
null
|
|
],
|
|
[
|
|
4.75,
|
|
"Idle",
|
|
"idle",
|
|
0,
|
|
true,
|
|
"run",
|
|
33,
|
|
0,
|
|
false,
|
|
true,
|
|
false,
|
|
false,
|
|
1838,
|
|
0,
|
|
null
|
|
],
|
|
[
|
|
4.95,
|
|
"Idle",
|
|
"idle",
|
|
0,
|
|
true,
|
|
"run",
|
|
33,
|
|
0,
|
|
false,
|
|
true,
|
|
false,
|
|
false,
|
|
1836,
|
|
0,
|
|
null
|
|
],
|
|
[
|
|
5.15,
|
|
"Idle",
|
|
"idle",
|
|
0,
|
|
true,
|
|
"run",
|
|
33,
|
|
0,
|
|
false,
|
|
true,
|
|
false,
|
|
false,
|
|
1837,
|
|
0,
|
|
null
|
|
],
|
|
[
|
|
5.35,
|
|
"Idle",
|
|
"idle",
|
|
0,
|
|
true,
|
|
"run",
|
|
33,
|
|
0,
|
|
false,
|
|
true,
|
|
false,
|
|
false,
|
|
1835,
|
|
0,
|
|
null
|
|
],
|
|
[
|
|
5.55,
|
|
"Idle",
|
|
"idle",
|
|
0,
|
|
true,
|
|
"run",
|
|
33,
|
|
0,
|
|
false,
|
|
true,
|
|
false,
|
|
false,
|
|
1834,
|
|
0,
|
|
null
|
|
],
|
|
[
|
|
5.75,
|
|
"Idle",
|
|
"idle",
|
|
0,
|
|
true,
|
|
"run",
|
|
33,
|
|
0,
|
|
false,
|
|
true,
|
|
false,
|
|
false,
|
|
1834,
|
|
0,
|
|
null
|
|
],
|
|
[
|
|
5.95,
|
|
"Idle",
|
|
"idle",
|
|
0,
|
|
true,
|
|
"run",
|
|
33,
|
|
0,
|
|
false,
|
|
true,
|
|
false,
|
|
false,
|
|
1836,
|
|
0,
|
|
null
|
|
],
|
|
[
|
|
6.15,
|
|
"Idle",
|
|
"idle",
|
|
0,
|
|
true,
|
|
"run",
|
|
33,
|
|
0,
|
|
false,
|
|
true,
|
|
false,
|
|
false,
|
|
1835,
|
|
0,
|
|
null
|
|
],
|
|
[
|
|
6.35,
|
|
"Run",
|
|
"idle",
|
|
0,
|
|
true,
|
|
"run",
|
|
33,
|
|
0,
|
|
false,
|
|
true,
|
|
false,
|
|
false,
|
|
1836,
|
|
0,
|
|
"[MSG:Info: laser armed (density, floor 14 %, curve custom)]"
|
|
],
|
|
[
|
|
6.56,
|
|
"Run",
|
|
"running",
|
|
0,
|
|
true,
|
|
"run",
|
|
1,
|
|
0,
|
|
false,
|
|
true,
|
|
false,
|
|
true,
|
|
1835,
|
|
0,
|
|
null
|
|
],
|
|
[
|
|
6.78,
|
|
"Run",
|
|
"running",
|
|
0,
|
|
true,
|
|
"run",
|
|
2,
|
|
0,
|
|
false,
|
|
true,
|
|
false,
|
|
true,
|
|
2880,
|
|
401,
|
|
null
|
|
],
|
|
[
|
|
6.99,
|
|
"Run",
|
|
"running",
|
|
0,
|
|
true,
|
|
"run",
|
|
1,
|
|
0,
|
|
false,
|
|
true,
|
|
false,
|
|
true,
|
|
2876,
|
|
239,
|
|
null
|
|
],
|
|
[
|
|
7.21,
|
|
"Run",
|
|
"running",
|
|
60,
|
|
true,
|
|
"run",
|
|
1,
|
|
0,
|
|
false,
|
|
true,
|
|
false,
|
|
true,
|
|
2822,
|
|
345,
|
|
null
|
|
],
|
|
[
|
|
7.43,
|
|
"Run",
|
|
"running",
|
|
60,
|
|
true,
|
|
"run",
|
|
2,
|
|
0,
|
|
false,
|
|
true,
|
|
false,
|
|
true,
|
|
2809,
|
|
528,
|
|
null
|
|
],
|
|
[
|
|
7.63,
|
|
"Run",
|
|
"running",
|
|
60,
|
|
true,
|
|
"run",
|
|
2,
|
|
0,
|
|
false,
|
|
true,
|
|
false,
|
|
true,
|
|
2791,
|
|
612,
|
|
null
|
|
],
|
|
[
|
|
7.84,
|
|
"Run",
|
|
"running",
|
|
60,
|
|
true,
|
|
"run",
|
|
1,
|
|
0,
|
|
false,
|
|
true,
|
|
false,
|
|
true,
|
|
2811,
|
|
257,
|
|
null
|
|
],
|
|
[
|
|
8.05,
|
|
"Run",
|
|
"running",
|
|
150,
|
|
true,
|
|
"run",
|
|
2,
|
|
0,
|
|
false,
|
|
true,
|
|
false,
|
|
true,
|
|
2785,
|
|
231,
|
|
null
|
|
],
|
|
[
|
|
8.27,
|
|
"Run",
|
|
"running",
|
|
150,
|
|
true,
|
|
"run",
|
|
1,
|
|
0,
|
|
false,
|
|
true,
|
|
false,
|
|
true,
|
|
2757,
|
|
419,
|
|
null
|
|
],
|
|
[
|
|
8.47,
|
|
"Run",
|
|
"running",
|
|
150,
|
|
true,
|
|
"run",
|
|
2,
|
|
0,
|
|
false,
|
|
true,
|
|
false,
|
|
true,
|
|
2802,
|
|
743,
|
|
null
|
|
],
|
|
[
|
|
8.68,
|
|
"Run",
|
|
"running",
|
|
150,
|
|
true,
|
|
"run",
|
|
1,
|
|
0,
|
|
false,
|
|
true,
|
|
false,
|
|
true,
|
|
2803,
|
|
308,
|
|
null
|
|
],
|
|
[
|
|
8.89,
|
|
"Run",
|
|
"running",
|
|
150,
|
|
true,
|
|
"run",
|
|
2,
|
|
0,
|
|
false,
|
|
true,
|
|
false,
|
|
true,
|
|
2778,
|
|
455,
|
|
null
|
|
],
|
|
[
|
|
9.1,
|
|
"Run",
|
|
"running",
|
|
150,
|
|
true,
|
|
"run",
|
|
2,
|
|
0,
|
|
false,
|
|
true,
|
|
false,
|
|
true,
|
|
2739,
|
|
235,
|
|
null
|
|
],
|
|
[
|
|
9.36,
|
|
"Run",
|
|
"running",
|
|
150,
|
|
true,
|
|
"run",
|
|
2,
|
|
0,
|
|
false,
|
|
true,
|
|
false,
|
|
true,
|
|
2719,
|
|
261,
|
|
null
|
|
],
|
|
[
|
|
9.56,
|
|
"Run",
|
|
"running",
|
|
150,
|
|
true,
|
|
"run",
|
|
1,
|
|
0,
|
|
false,
|
|
true,
|
|
false,
|
|
true,
|
|
2714,
|
|
247,
|
|
null
|
|
],
|
|
[
|
|
9.78,
|
|
"Run",
|
|
"running",
|
|
150,
|
|
true,
|
|
"run",
|
|
1,
|
|
0,
|
|
false,
|
|
true,
|
|
false,
|
|
true,
|
|
2707,
|
|
239,
|
|
null
|
|
],
|
|
[
|
|
9.99,
|
|
"Run",
|
|
"running",
|
|
150,
|
|
true,
|
|
"run",
|
|
1,
|
|
0,
|
|
false,
|
|
true,
|
|
false,
|
|
true,
|
|
2712,
|
|
958,
|
|
null
|
|
],
|
|
[
|
|
10.21,
|
|
"Run",
|
|
"running",
|
|
146,
|
|
true,
|
|
"run",
|
|
2,
|
|
0,
|
|
false,
|
|
true,
|
|
false,
|
|
true,
|
|
2706,
|
|
226,
|
|
null
|
|
],
|
|
[
|
|
10.42,
|
|
"Idle",
|
|
"running",
|
|
146,
|
|
true,
|
|
"run",
|
|
2,
|
|
0,
|
|
false,
|
|
true,
|
|
false,
|
|
true,
|
|
2681,
|
|
629,
|
|
null
|
|
],
|
|
[
|
|
10.66,
|
|
"Idle",
|
|
"idle",
|
|
146,
|
|
true,
|
|
"run",
|
|
1,
|
|
0,
|
|
false,
|
|
true,
|
|
false,
|
|
true,
|
|
1852,
|
|
0,
|
|
null
|
|
],
|
|
[
|
|
10.9,
|
|
"Idle",
|
|
"idle",
|
|
146,
|
|
true,
|
|
"run",
|
|
1,
|
|
0,
|
|
false,
|
|
true,
|
|
false,
|
|
true,
|
|
1849,
|
|
0,
|
|
null
|
|
],
|
|
[
|
|
11.14,
|
|
"Idle",
|
|
"idle",
|
|
90,
|
|
true,
|
|
"run",
|
|
33,
|
|
0,
|
|
false,
|
|
true,
|
|
false,
|
|
false,
|
|
1846,
|
|
0,
|
|
null
|
|
],
|
|
[
|
|
11.38,
|
|
"Idle",
|
|
"idle",
|
|
90,
|
|
true,
|
|
"run",
|
|
33,
|
|
0,
|
|
false,
|
|
true,
|
|
false,
|
|
false,
|
|
1844,
|
|
0,
|
|
null
|
|
],
|
|
[
|
|
11.62,
|
|
"Idle",
|
|
"idle",
|
|
90,
|
|
true,
|
|
"run",
|
|
33,
|
|
0,
|
|
false,
|
|
true,
|
|
false,
|
|
false,
|
|
1842,
|
|
0,
|
|
null
|
|
],
|
|
[
|
|
11.87,
|
|
"Idle",
|
|
"idle",
|
|
90,
|
|
true,
|
|
"run",
|
|
33,
|
|
0,
|
|
false,
|
|
true,
|
|
false,
|
|
false,
|
|
1845,
|
|
0,
|
|
null
|
|
],
|
|
[
|
|
12.11,
|
|
"Idle",
|
|
"idle",
|
|
0,
|
|
true,
|
|
"run",
|
|
33,
|
|
0,
|
|
false,
|
|
true,
|
|
false,
|
|
false,
|
|
1843,
|
|
0,
|
|
null
|
|
],
|
|
[
|
|
12.35,
|
|
"Idle",
|
|
"idle",
|
|
0,
|
|
true,
|
|
"run",
|
|
33,
|
|
0,
|
|
false,
|
|
true,
|
|
false,
|
|
false,
|
|
1845,
|
|
0,
|
|
null
|
|
],
|
|
[
|
|
12.59,
|
|
"Idle",
|
|
"idle",
|
|
0,
|
|
true,
|
|
"run",
|
|
33,
|
|
0,
|
|
false,
|
|
true,
|
|
false,
|
|
false,
|
|
1846,
|
|
0,
|
|
null
|
|
],
|
|
[
|
|
12.83,
|
|
"Run",
|
|
"idle",
|
|
0,
|
|
true,
|
|
"run",
|
|
33,
|
|
0,
|
|
false,
|
|
true,
|
|
false,
|
|
false,
|
|
1843,
|
|
0,
|
|
null
|
|
],
|
|
[
|
|
13.06,
|
|
"Run",
|
|
"running",
|
|
0,
|
|
true,
|
|
"run",
|
|
1,
|
|
0,
|
|
false,
|
|
true,
|
|
false,
|
|
true,
|
|
1843,
|
|
0,
|
|
null
|
|
],
|
|
[
|
|
13.27,
|
|
"Run",
|
|
"running",
|
|
0,
|
|
true,
|
|
"run",
|
|
1,
|
|
0,
|
|
false,
|
|
true,
|
|
false,
|
|
true,
|
|
2740,
|
|
1003,
|
|
null
|
|
],
|
|
[
|
|
13.48,
|
|
"Run",
|
|
"running",
|
|
0,
|
|
true,
|
|
"run",
|
|
2,
|
|
0,
|
|
false,
|
|
true,
|
|
false,
|
|
true,
|
|
2729,
|
|
216,
|
|
null
|
|
],
|
|
[
|
|
13.69,
|
|
"Run",
|
|
"running",
|
|
0,
|
|
true,
|
|
"run",
|
|
1,
|
|
0,
|
|
false,
|
|
true,
|
|
false,
|
|
true,
|
|
2722,
|
|
1023,
|
|
null
|
|
],
|
|
[
|
|
13.91,
|
|
"Run",
|
|
"running",
|
|
0,
|
|
true,
|
|
"run",
|
|
2,
|
|
0,
|
|
false,
|
|
true,
|
|
false,
|
|
true,
|
|
2680,
|
|
887,
|
|
null
|
|
],
|
|
[
|
|
14.11,
|
|
"Run",
|
|
"running",
|
|
134,
|
|
true,
|
|
"run",
|
|
1,
|
|
0,
|
|
false,
|
|
true,
|
|
false,
|
|
true,
|
|
2707,
|
|
323,
|
|
null
|
|
],
|
|
[
|
|
14.31,
|
|
"Run",
|
|
"running",
|
|
134,
|
|
true,
|
|
"run",
|
|
1,
|
|
0,
|
|
false,
|
|
true,
|
|
false,
|
|
true,
|
|
2701,
|
|
242,
|
|
null
|
|
],
|
|
[
|
|
14.51,
|
|
"Run",
|
|
"running",
|
|
134,
|
|
true,
|
|
"run",
|
|
1,
|
|
0,
|
|
false,
|
|
true,
|
|
false,
|
|
true,
|
|
2709,
|
|
414,
|
|
null
|
|
],
|
|
[
|
|
14.71,
|
|
"Run",
|
|
"running",
|
|
134,
|
|
true,
|
|
"run",
|
|
2,
|
|
0,
|
|
false,
|
|
true,
|
|
false,
|
|
true,
|
|
2718,
|
|
246,
|
|
null
|
|
],
|
|
[
|
|
14.97,
|
|
"Run",
|
|
"running",
|
|
134,
|
|
true,
|
|
"run",
|
|
1,
|
|
0,
|
|
false,
|
|
true,
|
|
false,
|
|
true,
|
|
2701,
|
|
290,
|
|
null
|
|
],
|
|
[
|
|
15.18,
|
|
"Run",
|
|
"running",
|
|
148,
|
|
true,
|
|
"run",
|
|
2,
|
|
0,
|
|
false,
|
|
true,
|
|
false,
|
|
true,
|
|
2753,
|
|
478,
|
|
null
|
|
],
|
|
[
|
|
15.39,
|
|
"Run",
|
|
"running",
|
|
148,
|
|
true,
|
|
"run",
|
|
1,
|
|
0,
|
|
false,
|
|
true,
|
|
false,
|
|
true,
|
|
2701,
|
|
538,
|
|
null
|
|
],
|
|
[
|
|
15.61,
|
|
"Run",
|
|
"running",
|
|
148,
|
|
true,
|
|
"run",
|
|
1,
|
|
0,
|
|
false,
|
|
true,
|
|
false,
|
|
true,
|
|
2767,
|
|
682,
|
|
null
|
|
],
|
|
[
|
|
15.82,
|
|
"Run",
|
|
"running",
|
|
148,
|
|
true,
|
|
"run",
|
|
1,
|
|
0,
|
|
false,
|
|
true,
|
|
false,
|
|
true,
|
|
2749,
|
|
165,
|
|
null
|
|
],
|
|
[
|
|
16.01,
|
|
"Run",
|
|
"running",
|
|
147,
|
|
true,
|
|
"run",
|
|
2,
|
|
0,
|
|
false,
|
|
true,
|
|
false,
|
|
true,
|
|
2693,
|
|
298,
|
|
null
|
|
],
|
|
[
|
|
16.22,
|
|
"Run",
|
|
"running",
|
|
147,
|
|
true,
|
|
"run",
|
|
2,
|
|
0,
|
|
false,
|
|
true,
|
|
false,
|
|
true,
|
|
2757,
|
|
205,
|
|
null
|
|
],
|
|
[
|
|
16.43,
|
|
"Run",
|
|
"running",
|
|
147,
|
|
true,
|
|
"run",
|
|
2,
|
|
0,
|
|
false,
|
|
true,
|
|
false,
|
|
true,
|
|
2788,
|
|
256,
|
|
null
|
|
],
|
|
[
|
|
16.63,
|
|
"Run",
|
|
"running",
|
|
147,
|
|
true,
|
|
"run",
|
|
2,
|
|
0,
|
|
false,
|
|
true,
|
|
false,
|
|
true,
|
|
2748,
|
|
741,
|
|
null
|
|
],
|
|
[
|
|
16.83,
|
|
"Run",
|
|
"running",
|
|
147,
|
|
true,
|
|
"run",
|
|
1,
|
|
0,
|
|
false,
|
|
true,
|
|
false,
|
|
true,
|
|
2806,
|
|
191,
|
|
"[MSG:Pgm End]"
|
|
],
|
|
[
|
|
17.09,
|
|
"Idle",
|
|
"running",
|
|
147,
|
|
true,
|
|
"run",
|
|
1,
|
|
0,
|
|
false,
|
|
true,
|
|
false,
|
|
true,
|
|
2477,
|
|
340,
|
|
"[MSG:Info: laser disarmed - latch locked]"
|
|
],
|
|
[
|
|
17.3,
|
|
"Idle",
|
|
"idle",
|
|
147,
|
|
false,
|
|
"run",
|
|
13,
|
|
1,
|
|
true,
|
|
true,
|
|
false,
|
|
true,
|
|
1848,
|
|
0,
|
|
null
|
|
],
|
|
[
|
|
17.5,
|
|
"Idle",
|
|
"idle",
|
|
147,
|
|
false,
|
|
"run",
|
|
13,
|
|
1,
|
|
true,
|
|
true,
|
|
false,
|
|
true,
|
|
1844,
|
|
0,
|
|
null
|
|
],
|
|
[
|
|
17.7,
|
|
"Idle",
|
|
"idle",
|
|
147,
|
|
false,
|
|
"run",
|
|
45,
|
|
1,
|
|
true,
|
|
true,
|
|
false,
|
|
false,
|
|
1843,
|
|
0,
|
|
null
|
|
],
|
|
[
|
|
17.91,
|
|
"Idle",
|
|
"idle",
|
|
147,
|
|
false,
|
|
"smoke",
|
|
45,
|
|
1,
|
|
true,
|
|
true,
|
|
false,
|
|
false,
|
|
1843,
|
|
0,
|
|
null
|
|
],
|
|
[
|
|
18.12,
|
|
"Idle",
|
|
"idle",
|
|
13,
|
|
false,
|
|
"smoke",
|
|
45,
|
|
1,
|
|
true,
|
|
true,
|
|
false,
|
|
false,
|
|
1844,
|
|
0,
|
|
null
|
|
],
|
|
[
|
|
18.33,
|
|
"Idle",
|
|
"idle",
|
|
13,
|
|
false,
|
|
"smoke",
|
|
45,
|
|
1,
|
|
true,
|
|
true,
|
|
false,
|
|
false,
|
|
1844,
|
|
0,
|
|
null
|
|
],
|
|
[
|
|
18.53,
|
|
"Idle",
|
|
"idle",
|
|
13,
|
|
false,
|
|
"smoke",
|
|
45,
|
|
1,
|
|
true,
|
|
true,
|
|
false,
|
|
false,
|
|
1844,
|
|
0,
|
|
null
|
|
],
|
|
[
|
|
18.73,
|
|
"Idle",
|
|
"idle",
|
|
13,
|
|
false,
|
|
"smoke",
|
|
45,
|
|
1,
|
|
true,
|
|
true,
|
|
false,
|
|
false,
|
|
1841,
|
|
0,
|
|
null
|
|
],
|
|
[
|
|
18.93,
|
|
"Idle",
|
|
"idle",
|
|
13,
|
|
false,
|
|
"smoke",
|
|
45,
|
|
1,
|
|
true,
|
|
true,
|
|
false,
|
|
false,
|
|
1843,
|
|
0,
|
|
null
|
|
],
|
|
[
|
|
19.13,
|
|
"Idle",
|
|
"idle",
|
|
0,
|
|
false,
|
|
"smoke",
|
|
45,
|
|
1,
|
|
true,
|
|
true,
|
|
false,
|
|
false,
|
|
1844,
|
|
0,
|
|
null
|
|
],
|
|
[
|
|
19.33,
|
|
"Idle",
|
|
"idle",
|
|
0,
|
|
false,
|
|
"smoke",
|
|
45,
|
|
1,
|
|
true,
|
|
true,
|
|
false,
|
|
false,
|
|
1841,
|
|
0,
|
|
null
|
|
],
|
|
[
|
|
19.53,
|
|
"Idle",
|
|
"idle",
|
|
0,
|
|
false,
|
|
"smoke",
|
|
45,
|
|
1,
|
|
true,
|
|
true,
|
|
false,
|
|
false,
|
|
1840,
|
|
0,
|
|
null
|
|
],
|
|
[
|
|
19.73,
|
|
"Idle",
|
|
"idle",
|
|
0,
|
|
false,
|
|
"smoke",
|
|
45,
|
|
1,
|
|
true,
|
|
true,
|
|
false,
|
|
false,
|
|
1839,
|
|
0,
|
|
null
|
|
],
|
|
[
|
|
19.93,
|
|
"Idle",
|
|
"idle",
|
|
0,
|
|
false,
|
|
"smoke",
|
|
45,
|
|
1,
|
|
true,
|
|
true,
|
|
false,
|
|
false,
|
|
1841,
|
|
0,
|
|
null
|
|
],
|
|
[
|
|
20.13,
|
|
"Idle",
|
|
"idle",
|
|
0,
|
|
false,
|
|
"smoke",
|
|
45,
|
|
1,
|
|
true,
|
|
true,
|
|
false,
|
|
false,
|
|
1840,
|
|
0,
|
|
null
|
|
]
|
|
],
|
|
"trail_fields": [
|
|
"t",
|
|
"gstate",
|
|
"kstate",
|
|
"emission",
|
|
"armed",
|
|
"phase",
|
|
"il",
|
|
"button_latch",
|
|
"locked",
|
|
"lid",
|
|
"button",
|
|
"hv_enable",
|
|
"beam",
|
|
"hv",
|
|
"msgs"
|
|
]
|
|
},
|
|
"fingerprint": "5a48764d4967d6e6e923c00bbac93ecebfc8a6cda4d0d1f6015a30452742b6c9",
|
|
"image": "20260919221704 (dev)",
|
|
"log": [
|
|
"22:22:16 start laser.emission-witness (live, api) in campaign c-20260919222216-7903",
|
|
"22:22:16 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
|
|
"22:22:16 fixture: <REDACTED-1> at <IP-1> covers lid, interlock, button",
|
|
"22:22:16 prerequisites overridden by the operator - not satisfied: kernel.latch-locked-idle, kernel.k1-k2",
|
|
"22:22:16 queued by the attended queue opened 2026-09-19T22:22:16Z",
|
|
"22:22:16 baseline: pre: clean",
|
|
"22:22:16 mode: test needs grbl - already in grbl mode",
|
|
"22:22:17 connect: Idle",
|
|
"22:22:17 pre-fire: emission=0 hv=0 armed=False verdict=OK",
|
|
"22:22:17 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.",
|
|
"22:22:17 READY: waiting for the operator's press on the machine (the bench then does every press in this test)",
|
|
"22:22:22 READY: operator present (press after 5.3 s); the bench takes the presses",
|
|
"22:22:22 ARM: the fixture presses when the button lights (the bench's arm_press opt-in)",
|
|
"22:22:23 ARM press by the fixture, button lit after 0.3 s",
|
|
"22:22:43 beam detector: idle 1838, peak 2880, digital asserted True",
|
|
"22:22:43 emission_samples peak=150 end=0; hv 0..1023; lid_ir peak [51, 50, 54, 55]; armed seen True",
|
|
"22:22:43 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",
|
|
"22:22:43 exhaust at the first emission sample: 11706 rpm (floor 6416)",
|
|
"22:22:43 time-to-disarm after Idle: 0.0 s",
|
|
"22:22:43 button dark after 0.0 s",
|
|
"22:22:43 PROMPT: Did the laser mark a 20 mm square outline on the scrap, all four sides?",
|
|
"22:22:46 ANSWER: Yes",
|
|
"22:22:46 PASS: emission peak 150 -> 0, HV 0..1023, beam +1042, disarmed 0.0 s after Idle, button dark, mark confirmed",
|
|
"22:22:47 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
|
|
"22:22:57 baseline: cool: smoke/armed=False/hold=False ended on its own after 11 s; the engine's own post-job work, not a leftover",
|
|
"22:22:57 baseline: post: clean",
|
|
"22:22:57 result PASS"
|
|
],
|
|
"manifest_sha": "58495afe066c6964484fb07d5664895a4e742e65509c81c10056d9303570f182",
|
|
"message": "",
|
|
"result": "PASS",
|
|
"test": "laser.emission-witness",
|
|
"ts": "2026-09-19T22:22:57Z"
|
|
},
|
|
"requires": [
|
|
"kernel.latch-locked-idle",
|
|
"kernel.k1-k2",
|
|
"motion.jog-roundtrip"
|
|
],
|
|
"satisfied": true,
|
|
"source_sha": "5f5c26cf97a30e96822396cf870509a24293a2ce1ce8a71489f442b62fbe46be",
|
|
"subsystem": "laser",
|
|
"title": "Live emission witness (S400 vector mark) and job-based disarm"
|
|
},
|
|
{
|
|
"always": false,
|
|
"covers": [
|
|
[
|
|
"grblhal-glowforge",
|
|
"src/**"
|
|
],
|
|
[
|
|
"kernel-module-glowforge",
|
|
"**"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/super.c"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/cool.c"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/status.c"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/main.c"
|
|
]
|
|
],
|
|
"fingerprint": "82bbf7c0e7afed49290c1d2045d2f4b9373265ca663330521014749f3f054b88",
|
|
"hardware": "api",
|
|
"id": "laser.m5-rapid-dark",
|
|
"inherited": true,
|
|
"kind": "live",
|
|
"record": {
|
|
"answers": [],
|
|
"campaign": "c-20260919215024-c402",
|
|
"duration_s": 39,
|
|
"evidence": {
|
|
"actions": [
|
|
{
|
|
"by": "operator",
|
|
"channel": "button",
|
|
"state": "presence",
|
|
"took_s": 4.1,
|
|
"ts": "2026-09-19T21:52:54Z"
|
|
},
|
|
{
|
|
"by": "fixture",
|
|
"channel": "button",
|
|
"state": "arm",
|
|
"took_s": 0.25,
|
|
"ts": "2026-09-19T21:52:54Z"
|
|
}
|
|
],
|
|
"baseline": {
|
|
"post": [],
|
|
"pre": []
|
|
},
|
|
"batch": {
|
|
"group": "attended",
|
|
"ts": "2026-09-19T21:50:24Z"
|
|
},
|
|
"emission_peak": 146,
|
|
"fixture": {
|
|
"channels": [
|
|
"lid",
|
|
"interlock",
|
|
"button"
|
|
],
|
|
"hostname": "<REDACTED-1>",
|
|
"ip": "<IP-1>",
|
|
"released": []
|
|
},
|
|
"hv_tail_max": 0,
|
|
"mode": {
|
|
"detail": "already in grbl mode",
|
|
"found": "grbl",
|
|
"needs": "grbl",
|
|
"ok": true,
|
|
"switched": false
|
|
},
|
|
"operator": {
|
|
"ack_live": true,
|
|
"ts": "2026-09-19T21:52:49Z"
|
|
},
|
|
"relit_first": null,
|
|
"relit_samples": 0,
|
|
"samples": 85,
|
|
"tail_samples": 52
|
|
},
|
|
"fingerprint": "82bbf7c0e7afed49290c1d2045d2f4b9373265ca663330521014749f3f054b88",
|
|
"image": "20260919214619 (dev)",
|
|
"log": [
|
|
"21:52:48 start laser.m5-rapid-dark (live, api) in campaign c-20260919215024-c402",
|
|
"21:52:49 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
|
|
"21:52:49 fixture: <REDACTED-1> at <IP-1> covers lid, interlock, button",
|
|
"21:52:49 queued by the attended queue opened 2026-09-19T21:50:24Z",
|
|
"21:52:49 baseline: pre: clean",
|
|
"21:52:49 mode: test needs grbl - already in grbl mode",
|
|
"21:52:49 connect: Idle",
|
|
"21:52:49 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:52:49 READY: waiting for the operator's press on the machine (the bench then does every press in this test)",
|
|
"21:52:54 READY: operator present (press after 4.1 s); the bench takes the presses",
|
|
"21:52:54 ARM: the fixture presses when the button lights (the bench's arm_press opt-in)",
|
|
"21:52:54 ARM press by the fixture, button lit after 0.3 s",
|
|
"21:53:13 emission peak 146; dark from +7.0 s; 52 samples after it spanning 11.8 s, 0 with emission, HV max after dark 0",
|
|
"21:53:13 PASS: emission peak 146 on the G1, 0 through both rapids, HV 0 after the M5",
|
|
"21:53:19 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
|
|
"21:53:28 baseline: cool: smoke/armed=False/hold=False ended on its own after 15 s; the engine's own post-job work, not a leftover",
|
|
"21:53:28 baseline: post: clean",
|
|
"21:53:28 result PASS"
|
|
],
|
|
"manifest_sha": "5dbf1f84b9aea447033e38de4b79d4fe8af2309af74367f0befbe9429d44d170",
|
|
"message": "",
|
|
"result": "PASS",
|
|
"test": "laser.m5-rapid-dark",
|
|
"ts": "2026-09-19T21:53:28Z"
|
|
},
|
|
"requires": [
|
|
"laser.emission-witness"
|
|
],
|
|
"satisfied": true,
|
|
"source_sha": "50f30657a502eb2e4fe4dca5d48c3ca75c6936d6e572d26bf985b0ad30ddffb6",
|
|
"subsystem": "laser",
|
|
"title": "The rapids after an M5 ship dark"
|
|
},
|
|
{
|
|
"always": false,
|
|
"covers": [
|
|
[
|
|
"grblhal-glowforge",
|
|
"src/**"
|
|
],
|
|
[
|
|
"kernel-module-glowforge",
|
|
"**"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/super.c"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/cool.c"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/status.c"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/main.c"
|
|
]
|
|
],
|
|
"fingerprint": "95afb9fb4f87411975d8ba85fe0fd557abacb96607d71f8f5c98e69f3a90b1bf",
|
|
"hardware": "api",
|
|
"id": "laser.disarm-in-hold",
|
|
"inherited": true,
|
|
"kind": "live",
|
|
"record": {
|
|
"answers": [],
|
|
"campaign": "c-20260919215024-c402",
|
|
"duration_s": 228,
|
|
"evidence": {
|
|
"actions": [
|
|
{
|
|
"by": "operator",
|
|
"channel": "button",
|
|
"state": "presence",
|
|
"took_s": 9.34,
|
|
"ts": "2026-09-19T21:53:40Z"
|
|
},
|
|
{
|
|
"by": "fixture",
|
|
"channel": "button",
|
|
"state": "press",
|
|
"took_s": 137.83,
|
|
"ts": "2026-09-19T21:53:40Z"
|
|
}
|
|
],
|
|
"baseline": {
|
|
"post": [],
|
|
"pre": []
|
|
},
|
|
"batch": {
|
|
"group": "attended",
|
|
"ts": "2026-09-19T21:50:24Z"
|
|
},
|
|
"button_dark": false,
|
|
"disarmed_after_s": 60.7,
|
|
"fixture": {
|
|
"channels": [
|
|
"lid",
|
|
"interlock",
|
|
"button"
|
|
],
|
|
"hostname": "<REDACTED-1>",
|
|
"ip": "<IP-1>",
|
|
"released": []
|
|
},
|
|
"held_state": "Hold:1",
|
|
"left_at_mm": [
|
|
11.65,
|
|
0.0
|
|
],
|
|
"left_hold": null,
|
|
"mode": {
|
|
"detail": "already in grbl mode",
|
|
"found": "grbl",
|
|
"needs": "grbl",
|
|
"ok": true,
|
|
"switched": false
|
|
},
|
|
"operator": {
|
|
"ack_live": true,
|
|
"ts": "2026-09-19T21:53:29Z"
|
|
},
|
|
"returned_mm": [
|
|
2.7,
|
|
0.0
|
|
]
|
|
},
|
|
"fingerprint": "95afb9fb4f87411975d8ba85fe0fd557abacb96607d71f8f5c98e69f3a90b1bf",
|
|
"image": "20260919214619 (dev)",
|
|
"log": [
|
|
"21:53:28 start laser.disarm-in-hold (live, api) in campaign c-20260919215024-c402",
|
|
"21:53:29 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
|
|
"21:53:29 fixture: <REDACTED-1> at <IP-1> covers lid, interlock, button",
|
|
"21:53:29 queued by the attended queue opened 2026-09-19T21:50:24Z",
|
|
"21:53:29 baseline: pre: clean",
|
|
"21:53:29 mode: test needs grbl - already in grbl mode",
|
|
"21:53:29 connect: Idle",
|
|
"21:53:29 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:53:29 READY: waiting for the operator's press on the machine (the bench then does every press in this test)",
|
|
"21:53:40 READY: operator present (press after 9.3 s); the bench takes the presses",
|
|
"21:53:40 armed; waiting for motion to start (arm + your button press)...",
|
|
"21:53:40 ACT button press (fixture)",
|
|
"21:53:59 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
|
|
"21:54:30 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
|
|
"21:55:01 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
|
|
"21:55:33 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
|
|
"21:55:57 ACT button press: done after 137.8 s",
|
|
"21:55:57 moving under laser: Run; feed-hold in 2 s",
|
|
"21:55:59 feed-held mid-move: Hold:1; watching the disarm grace count down IN HOLD",
|
|
"21:56:05 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
|
|
"21:56:36 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
|
|
"21:57:03 returning the head: -11.650/+0.000 mm",
|
|
"21:57:03 button dark after 0.0 s",
|
|
"21:57:03 PASS: disarmed in Hold after 60.7 s, button dark",
|
|
"21:57:04 baseline: state: running reached idle on its own after 0 s; the machine finishing, not a leftover",
|
|
"21:57:07 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
|
|
"21:57:17 baseline: cool: smoke/armed=False/hold=False ended on its own after 13 s; the engine's own post-job work, not a leftover",
|
|
"21:57:17 baseline: post: clean",
|
|
"21:57:17 result PASS"
|
|
],
|
|
"manifest_sha": "5dbf1f84b9aea447033e38de4b79d4fe8af2309af74367f0befbe9429d44d170",
|
|
"message": "",
|
|
"result": "PASS",
|
|
"test": "laser.disarm-in-hold",
|
|
"ts": "2026-09-19T21:57:17Z"
|
|
},
|
|
"requires": [
|
|
"laser.emission-witness"
|
|
],
|
|
"satisfied": true,
|
|
"source_sha": "3de2fe4123e7478215a8810a398d06fa26065830b4481d8c07911d20d462a4b6",
|
|
"subsystem": "laser",
|
|
"title": "Disarm grace counts down in Hold"
|
|
},
|
|
{
|
|
"always": false,
|
|
"covers": [
|
|
[
|
|
"grblhal-glowforge",
|
|
"src/**"
|
|
],
|
|
[
|
|
"kernel-module-glowforge",
|
|
"**"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/super.c"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/cool.c"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/status.c"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/main.c"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/main.c"
|
|
]
|
|
],
|
|
"fingerprint": "a3dac2933f70a46837b485a4b31b37a44007d65cfaa26fdc281d6c6683ebfd3f",
|
|
"hardware": "api",
|
|
"id": "laser.armed-kill",
|
|
"inherited": true,
|
|
"kind": "live",
|
|
"record": {
|
|
"answers": [],
|
|
"campaign": "c-20260919215024-c402",
|
|
"duration_s": 49,
|
|
"evidence": {
|
|
"actions": [
|
|
{
|
|
"by": "operator",
|
|
"channel": "button",
|
|
"state": "presence",
|
|
"took_s": 5.84,
|
|
"ts": "2026-09-19T21:57:24Z"
|
|
},
|
|
{
|
|
"by": "fixture",
|
|
"channel": "button",
|
|
"state": "arm",
|
|
"took_s": 0.26,
|
|
"ts": "2026-09-19T21:57:24Z"
|
|
},
|
|
{
|
|
"by": "fixture",
|
|
"channel": "button",
|
|
"state": "arm",
|
|
"took_s": 0.26,
|
|
"ts": "2026-09-19T21:57:44Z"
|
|
}
|
|
],
|
|
"baseline": {
|
|
"post": [],
|
|
"pre": []
|
|
},
|
|
"batch": {
|
|
"group": "attended",
|
|
"ts": "2026-09-19T21:50:24Z"
|
|
},
|
|
"beam_at_fire_kill": 2741,
|
|
"beam_at_fire_stop": 2781,
|
|
"button_dark": false,
|
|
"expected": {
|
|
"kernel_not_running": true,
|
|
"mode_after_stop": {
|
|
"controller": "standby",
|
|
"gated": false,
|
|
"local": false,
|
|
"mode": "grbl",
|
|
"motion": "verified",
|
|
"pid": 0,
|
|
"why": ""
|
|
},
|
|
"post_s": 0.41,
|
|
"post_status": 200,
|
|
"tail_zero": true,
|
|
"trail": [
|
|
[
|
|
0.48,
|
|
23,
|
|
"idle",
|
|
false
|
|
],
|
|
[
|
|
0.68,
|
|
23,
|
|
"idle",
|
|
false
|
|
],
|
|
[
|
|
0.88,
|
|
39,
|
|
"idle",
|
|
false
|
|
],
|
|
[
|
|
1.08,
|
|
39,
|
|
"idle",
|
|
false
|
|
],
|
|
[
|
|
1.28,
|
|
39,
|
|
"idle",
|
|
false
|
|
],
|
|
[
|
|
1.48,
|
|
39,
|
|
"idle",
|
|
false
|
|
],
|
|
[
|
|
1.68,
|
|
39,
|
|
"idle",
|
|
false
|
|
],
|
|
[
|
|
1.88,
|
|
0,
|
|
"idle",
|
|
false
|
|
],
|
|
[
|
|
2.11,
|
|
0,
|
|
"idle",
|
|
false
|
|
],
|
|
[
|
|
2.3,
|
|
0,
|
|
"idle",
|
|
false
|
|
],
|
|
[
|
|
2.5,
|
|
0,
|
|
"idle",
|
|
false
|
|
],
|
|
[
|
|
2.7,
|
|
0,
|
|
"idle",
|
|
false
|
|
],
|
|
[
|
|
2.9,
|
|
0,
|
|
"idle",
|
|
false
|
|
],
|
|
[
|
|
3.15,
|
|
0,
|
|
"idle",
|
|
false
|
|
],
|
|
[
|
|
3.34,
|
|
0,
|
|
"idle",
|
|
false
|
|
],
|
|
[
|
|
3.54,
|
|
0,
|
|
"idle",
|
|
false
|
|
],
|
|
[
|
|
3.74,
|
|
0,
|
|
"idle",
|
|
false
|
|
],
|
|
[
|
|
3.94,
|
|
0,
|
|
"idle",
|
|
false
|
|
],
|
|
[
|
|
4.14,
|
|
0,
|
|
"idle",
|
|
false
|
|
],
|
|
[
|
|
4.34,
|
|
0,
|
|
"idle",
|
|
false
|
|
],
|
|
[
|
|
4.54,
|
|
0,
|
|
"idle",
|
|
false
|
|
],
|
|
[
|
|
4.74,
|
|
0,
|
|
"idle",
|
|
false
|
|
],
|
|
[
|
|
4.94,
|
|
0,
|
|
"idle",
|
|
false
|
|
],
|
|
[
|
|
5.14,
|
|
0,
|
|
"idle",
|
|
false
|
|
],
|
|
[
|
|
5.36,
|
|
0,
|
|
"idle",
|
|
false
|
|
],
|
|
[
|
|
5.56,
|
|
0,
|
|
"idle",
|
|
false
|
|
],
|
|
[
|
|
5.76,
|
|
0,
|
|
"idle",
|
|
false
|
|
],
|
|
[
|
|
5.96,
|
|
0,
|
|
"idle",
|
|
false
|
|
],
|
|
[
|
|
6.16,
|
|
0,
|
|
"idle",
|
|
false
|
|
],
|
|
[
|
|
6.36,
|
|
0,
|
|
"idle",
|
|
false
|
|
],
|
|
[
|
|
6.56,
|
|
0,
|
|
"idle",
|
|
false
|
|
],
|
|
[
|
|
6.76,
|
|
0,
|
|
"idle",
|
|
false
|
|
],
|
|
[
|
|
6.96,
|
|
0,
|
|
"idle",
|
|
false
|
|
],
|
|
[
|
|
7.15,
|
|
0,
|
|
"idle",
|
|
false
|
|
],
|
|
[
|
|
7.35,
|
|
0,
|
|
"idle",
|
|
false
|
|
],
|
|
[
|
|
7.56,
|
|
0,
|
|
"idle",
|
|
false
|
|
],
|
|
[
|
|
7.76,
|
|
0,
|
|
"idle",
|
|
false
|
|
],
|
|
[
|
|
7.96,
|
|
0,
|
|
"idle",
|
|
false
|
|
],
|
|
[
|
|
8.15,
|
|
0,
|
|
"idle",
|
|
false
|
|
],
|
|
[
|
|
8.35,
|
|
0,
|
|
"idle",
|
|
false
|
|
],
|
|
[
|
|
8.55,
|
|
0,
|
|
"idle",
|
|
false
|
|
]
|
|
],
|
|
"zero_at_s": 1.88
|
|
},
|
|
"fixture": {
|
|
"channels": [
|
|
"lid",
|
|
"interlock",
|
|
"button"
|
|
],
|
|
"hostname": "<REDACTED-1>",
|
|
"ip": "<IP-1>",
|
|
"released": []
|
|
},
|
|
"latch_locked_after_respawn": true,
|
|
"mode": {
|
|
"detail": "already in grbl mode",
|
|
"found": "grbl",
|
|
"needs": "grbl",
|
|
"ok": true,
|
|
"switched": false
|
|
},
|
|
"mode_after_kill": {
|
|
"controller": "running",
|
|
"gated": false,
|
|
"local": false,
|
|
"mode": "grbl",
|
|
"motion": "verified",
|
|
"pid": 2527,
|
|
"why": ""
|
|
},
|
|
"mode_after_start": {
|
|
"controller": "running",
|
|
"gated": false,
|
|
"local": false,
|
|
"mode": "grbl",
|
|
"motion": "verified",
|
|
"pid": 2449,
|
|
"why": ""
|
|
},
|
|
"operator": {
|
|
"ack_live": true,
|
|
"ts": "2026-09-19T21:57:17Z"
|
|
},
|
|
"sigkill": {
|
|
"fast": {
|
|
"kernel_stopped_at_s": 0.307,
|
|
"latch_locked_at_s": 0.068
|
|
},
|
|
"kernel_not_running": true,
|
|
"latch_locked": true,
|
|
"pid": 2449,
|
|
"tail_zero": true,
|
|
"trail": [
|
|
[
|
|
0.39,
|
|
120,
|
|
"idle",
|
|
false
|
|
],
|
|
[
|
|
0.59,
|
|
120,
|
|
"idle",
|
|
false
|
|
],
|
|
[
|
|
0.79,
|
|
120,
|
|
"idle",
|
|
false
|
|
],
|
|
[
|
|
0.99,
|
|
43,
|
|
"idle",
|
|
false
|
|
],
|
|
[
|
|
1.16,
|
|
43,
|
|
"idle",
|
|
false
|
|
],
|
|
[
|
|
1.33,
|
|
43,
|
|
"idle",
|
|
false
|
|
],
|
|
[
|
|
1.5,
|
|
43,
|
|
"idle",
|
|
false
|
|
],
|
|
[
|
|
1.67,
|
|
43,
|
|
"idle",
|
|
false
|
|
],
|
|
[
|
|
1.84,
|
|
0,
|
|
"idle",
|
|
false
|
|
],
|
|
[
|
|
2.02,
|
|
0,
|
|
"idle",
|
|
false
|
|
],
|
|
[
|
|
2.19,
|
|
0,
|
|
"idle",
|
|
false
|
|
],
|
|
[
|
|
2.36,
|
|
0,
|
|
"idle",
|
|
false
|
|
],
|
|
[
|
|
2.53,
|
|
0,
|
|
"idle",
|
|
false
|
|
],
|
|
[
|
|
2.7,
|
|
0,
|
|
"idle",
|
|
false
|
|
],
|
|
[
|
|
2.87,
|
|
0,
|
|
"idle",
|
|
false
|
|
],
|
|
[
|
|
3.07,
|
|
0,
|
|
"idle",
|
|
false
|
|
],
|
|
[
|
|
3.23,
|
|
0,
|
|
"idle",
|
|
false
|
|
],
|
|
[
|
|
3.4,
|
|
0,
|
|
"idle",
|
|
false
|
|
],
|
|
[
|
|
3.57,
|
|
0,
|
|
"idle",
|
|
false
|
|
],
|
|
[
|
|
3.74,
|
|
0,
|
|
"idle",
|
|
false
|
|
],
|
|
[
|
|
3.91,
|
|
0,
|
|
"idle",
|
|
false
|
|
],
|
|
[
|
|
4.08,
|
|
0,
|
|
"idle",
|
|
false
|
|
],
|
|
[
|
|
4.25,
|
|
0,
|
|
"idle",
|
|
false
|
|
],
|
|
[
|
|
4.42,
|
|
0,
|
|
"idle",
|
|
false
|
|
],
|
|
[
|
|
4.59,
|
|
0,
|
|
"idle",
|
|
false
|
|
],
|
|
[
|
|
4.76,
|
|
0,
|
|
"idle",
|
|
false
|
|
],
|
|
[
|
|
4.93,
|
|
0,
|
|
"idle",
|
|
false
|
|
],
|
|
[
|
|
5.1,
|
|
0,
|
|
"idle",
|
|
false
|
|
],
|
|
[
|
|
5.3,
|
|
0,
|
|
"idle",
|
|
false
|
|
],
|
|
[
|
|
5.47,
|
|
0,
|
|
"idle",
|
|
false
|
|
],
|
|
[
|
|
5.64,
|
|
0,
|
|
"idle",
|
|
false
|
|
],
|
|
[
|
|
5.81,
|
|
0,
|
|
"idle",
|
|
false
|
|
],
|
|
[
|
|
5.98,
|
|
0,
|
|
"idle",
|
|
false
|
|
],
|
|
[
|
|
6.15,
|
|
0,
|
|
"idle",
|
|
false
|
|
],
|
|
[
|
|
6.32,
|
|
0,
|
|
"idle",
|
|
false
|
|
],
|
|
[
|
|
6.49,
|
|
0,
|
|
"idle",
|
|
false
|
|
],
|
|
[
|
|
6.66,
|
|
0,
|
|
"idle",
|
|
false
|
|
],
|
|
[
|
|
6.83,
|
|
0,
|
|
"idle",
|
|
false
|
|
],
|
|
[
|
|
7.0,
|
|
0,
|
|
"idle",
|
|
false
|
|
],
|
|
[
|
|
7.17,
|
|
0,
|
|
"idle",
|
|
false
|
|
],
|
|
[
|
|
7.34,
|
|
0,
|
|
"idle",
|
|
false
|
|
]
|
|
],
|
|
"zero_at_s": 1.84
|
|
}
|
|
},
|
|
"fingerprint": "a3dac2933f70a46837b485a4b31b37a44007d65cfaa26fdc281d6c6683ebfd3f",
|
|
"image": "20260919214619 (dev)",
|
|
"log": [
|
|
"21:57:17 start laser.armed-kill (live, api) in campaign c-20260919215024-c402",
|
|
"21:57:17 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
|
|
"21:57:17 fixture: <REDACTED-1> at <IP-1> covers lid, interlock, button",
|
|
"21:57:17 queued by the attended queue opened 2026-09-19T21:50:24Z",
|
|
"21:57:17 baseline: pre: clean",
|
|
"21:57:17 mode: test needs grbl - already in grbl mode",
|
|
"21:57:18 connect: Idle",
|
|
"21:57:18 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:57:18 READY: waiting for the operator's press on the machine (the bench then does every press in this test)",
|
|
"21:57:24 READY: operator present (press after 5.8 s); the bench takes the presses",
|
|
"21:57:24 ARM: the fixture presses when the button lights (the bench's arm_press opt-in)",
|
|
"21:57:24 ARM press by the fixture, button lit after 0.3 s",
|
|
"21:57:28 emission live (23) - stopping the controller NOW",
|
|
"21:57:29 POST /controller/stop -> 200 {'stopped': True} (0.41 s)",
|
|
"21:57:37 post-stop (0.48, 23, 'idle', False)",
|
|
"21:57:37 post-stop (0.68, 23, 'idle', False)",
|
|
"21:57:37 post-stop (0.88, 39, 'idle', False)",
|
|
"21:57:37 post-stop (1.08, 39, 'idle', False)",
|
|
"21:57:37 post-stop (1.28, 39, 'idle', False)",
|
|
"21:57:37 post-stop (1.48, 39, 'idle', False)",
|
|
"21:57:37 post-stop (1.68, 39, 'idle', False)",
|
|
"21:57:37 post-stop (1.88, 0, 'idle', False)",
|
|
"21:57:37 post-stop (2.11, 0, 'idle', False)",
|
|
"21:57:37 post-stop (2.3, 0, 'idle', False)",
|
|
"21:57:37 post-stop (2.5, 0, 'idle', False)",
|
|
"21:57:37 post-stop (2.7, 0, 'idle', False)",
|
|
"21:57:37 post-stop (2.9, 0, 'idle', False)",
|
|
"21:57:37 post-stop (3.15, 0, 'idle', False)",
|
|
"21:57:37 post-stop (3.34, 0, 'idle', False)",
|
|
"21:57:37 post-stop (3.54, 0, 'idle', False)",
|
|
"21:57:37 post-stop (3.74, 0, 'idle', False)",
|
|
"21:57:37 post-stop (3.94, 0, 'idle', False)",
|
|
"21:57:37 post-stop (4.14, 0, 'idle', False)",
|
|
"21:57:37 post-stop (4.34, 0, 'idle', False)",
|
|
"21:57:37 post-stop (4.54, 0, 'idle', False)",
|
|
"21:57:37 post-stop (4.74, 0, 'idle', False)",
|
|
"21:57:37 post-stop (4.94, 0, 'idle', False)",
|
|
"21:57:37 post-stop (5.14, 0, 'idle', False)",
|
|
"21:57:37 post-stop (5.36, 0, 'idle', False)",
|
|
"21:57:37 post-stop (5.56, 0, 'idle', False)",
|
|
"21:57:37 post-stop (5.76, 0, 'idle', False)",
|
|
"21:57:37 post-stop (5.96, 0, 'idle', False)",
|
|
"21:57:37 post-stop (6.16, 0, 'idle', False)",
|
|
"21:57:37 post-stop (6.36, 0, 'idle', False)",
|
|
"21:57:37 post-stop (6.56, 0, 'idle', False)",
|
|
"21:57:37 post-stop (6.76, 0, 'idle', False)",
|
|
"21:57:37 post-stop (6.96, 0, 'idle', False)",
|
|
"21:57:37 post-stop (7.15, 0, 'idle', False)",
|
|
"21:57:37 post-stop (7.35, 0, 'idle', False)",
|
|
"21:57:37 post-stop (7.56, 0, 'idle', False)",
|
|
"21:57:37 post-stop (7.76, 0, 'idle', False)",
|
|
"21:57:37 post-stop (7.96, 0, 'idle', False)",
|
|
"21:57:37 post-stop (8.15, 0, 'idle', False)",
|
|
"21:57:37 post-stop (8.35, 0, 'idle', False)",
|
|
"21:57:37 post-stop (8.55, 0, 'idle', False)",
|
|
"21:57:37 emission first 0 at +1.88 s; last 2 s all zero: True; kernel not running: True",
|
|
"21:57:37 the controller is stopped (supervision held); restarting it (no motion, no laser)",
|
|
"21:57:37 POST /controller/start -> 200 {'started': True}",
|
|
"21:57:43 /mode after start: {'mode': 'grbl', 'controller': 'running', 'pid': 2449, 'motion': 'verified', 'gated': False, 'local': False, 'why': ''}",
|
|
"21:57:43 expected stop PASS: returned in 0.41 s, emission 0 at +1.88 s, controller restarted",
|
|
"21:57:44 connect: Idle",
|
|
"21:57:44 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:57:44 READY: presence already proved this test; the bench has the presses",
|
|
"21:57:44 ARM: the fixture presses when the button lights (the bench's arm_press opt-in)",
|
|
"21:57:44 ARM press by the fixture, button lit after 0.3 s",
|
|
"21:57:48 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
|
|
"21:57:48 emission live (120) - SIGKILL controller pid 2449 NOW",
|
|
"21:57:56 after the kill (sysfs): {'latch_locked_at_s': 0.068, 'kernel_stopped_at_s': 0.307}",
|
|
"21:57:56 post-kill (0.39, 120, 'idle', False)",
|
|
"21:57:56 post-kill (0.59, 120, 'idle', False)",
|
|
"21:57:56 post-kill (0.79, 120, 'idle', False)",
|
|
"21:57:56 post-kill (0.99, 43, 'idle', False)",
|
|
"21:57:56 post-kill (1.16, 43, 'idle', False)",
|
|
"21:57:56 post-kill (1.33, 43, 'idle', False)",
|
|
"21:57:56 post-kill (1.5, 43, 'idle', False)",
|
|
"21:57:56 post-kill (1.67, 43, 'idle', False)",
|
|
"21:57:56 post-kill (1.84, 0, 'idle', False)",
|
|
"21:57:56 post-kill (2.02, 0, 'idle', False)",
|
|
"21:57:56 post-kill (2.19, 0, 'idle', False)",
|
|
"21:57:56 post-kill (2.36, 0, 'idle', False)",
|
|
"21:57:56 post-kill (2.53, 0, 'idle', False)",
|
|
"21:57:56 post-kill (2.7, 0, 'idle', False)",
|
|
"21:57:56 post-kill (2.87, 0, 'idle', False)",
|
|
"21:57:56 post-kill (3.07, 0, 'idle', False)",
|
|
"21:57:56 post-kill (3.23, 0, 'idle', False)",
|
|
"21:57:56 post-kill (3.4, 0, 'idle', False)",
|
|
"21:57:56 post-kill (3.57, 0, 'idle', False)",
|
|
"21:57:56 post-kill (3.74, 0, 'idle', False)",
|
|
"21:57:56 post-kill (3.91, 0, 'idle', False)",
|
|
"21:57:56 post-kill (4.08, 0, 'idle', False)",
|
|
"21:57:56 post-kill (4.25, 0, 'idle', False)",
|
|
"21:57:56 post-kill (4.42, 0, 'idle', False)",
|
|
"21:57:56 post-kill (4.59, 0, 'idle', False)",
|
|
"21:57:56 post-kill (4.76, 0, 'idle', False)",
|
|
"21:57:56 post-kill (4.93, 0, 'idle', False)",
|
|
"21:57:56 post-kill (5.1, 0, 'idle', False)",
|
|
"21:57:56 post-kill (5.3, 0, 'idle', False)",
|
|
"21:57:56 post-kill (5.47, 0, 'idle', False)",
|
|
"21:57:56 post-kill (5.64, 0, 'idle', False)",
|
|
"21:57:56 post-kill (5.81, 0, 'idle', False)",
|
|
"21:57:56 post-kill (5.98, 0, 'idle', False)",
|
|
"21:57:56 post-kill (6.15, 0, 'idle', False)",
|
|
"21:57:56 post-kill (6.32, 0, 'idle', False)",
|
|
"21:57:56 post-kill (6.49, 0, 'idle', False)",
|
|
"21:57:56 post-kill (6.66, 0, 'idle', False)",
|
|
"21:57:56 post-kill (6.83, 0, 'idle', False)",
|
|
"21:57:56 post-kill (7.0, 0, 'idle', False)",
|
|
"21:57:56 post-kill (7.17, 0, 'idle', False)",
|
|
"21:57:56 post-kill (7.34, 0, 'idle', False)",
|
|
"21:57:56 emission first 0 at +1.84 s; last 2 s all zero: True; kernel not running: True",
|
|
"21:57:56 latch locked after the kill: True",
|
|
"21:57:56 /mode after the kill: {'mode': 'grbl', 'controller': 'running', 'pid': 2527, 'motion': 'verified', 'gated': False, 'local': False, 'why': ''}",
|
|
"21:57:58 button dark after 0.0 s",
|
|
"21:57:58 PASS: expected stop 0 at +1.88 s and SIGKILL 0 at +1.84 s, latch locked, controller respawned with the latch still locked, button dark",
|
|
"21:58:06 baseline: cool: smoke/armed=False/hold=False ended on its own after 8 s; the engine's own post-job work, not a leftover",
|
|
"21:58:06 baseline: post: clean",
|
|
"21:58:06 result PASS"
|
|
],
|
|
"manifest_sha": "5dbf1f84b9aea447033e38de4b79d4fe8af2309af74367f0befbe9429d44d170",
|
|
"message": "",
|
|
"result": "PASS",
|
|
"test": "laser.armed-kill",
|
|
"ts": "2026-09-19T21:58:06Z"
|
|
},
|
|
"requires": [
|
|
"laser.emission-witness",
|
|
"motion.deadman"
|
|
],
|
|
"satisfied": true,
|
|
"source_sha": "b1956efed20703322a12661ebe6670c43c5062cf8173bd62c6b0c11311cfcffb",
|
|
"subsystem": "laser",
|
|
"title": "Armed kill mid-fire: the expected stop, then a SIGKILL"
|
|
},
|
|
{
|
|
"always": false,
|
|
"covers": [
|
|
[
|
|
"grblhal-glowforge",
|
|
"src/**"
|
|
],
|
|
[
|
|
"kernel-module-glowforge",
|
|
"**"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/super.c"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/cool.c"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/status.c"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/main.c"
|
|
]
|
|
],
|
|
"fingerprint": "aa904224ba5a149073e1e4303cdfc367696a738dd500255d2c7367c5ae0ba5b6",
|
|
"hardware": "api",
|
|
"id": "laser.verdict-cut",
|
|
"inherited": true,
|
|
"kind": "live",
|
|
"record": {
|
|
"answers": [],
|
|
"campaign": "c-20260919215024-c402",
|
|
"duration_s": 34,
|
|
"evidence": {
|
|
"actions": [
|
|
{
|
|
"by": "operator",
|
|
"channel": "button",
|
|
"state": "presence",
|
|
"took_s": 2.67,
|
|
"ts": "2026-09-19T21:58:11Z"
|
|
},
|
|
{
|
|
"by": "fixture",
|
|
"channel": "button",
|
|
"state": "arm",
|
|
"took_s": 0.25,
|
|
"ts": "2026-09-19T21:58:11Z"
|
|
}
|
|
],
|
|
"baseline": {
|
|
"post": [],
|
|
"pre": []
|
|
},
|
|
"batch": {
|
|
"group": "attended",
|
|
"ts": "2026-09-19T21:50:24Z"
|
|
},
|
|
"beam": {
|
|
"delta": 947,
|
|
"digital_seen": true,
|
|
"idle": 1841,
|
|
"peak": 2788,
|
|
"samples": 17
|
|
},
|
|
"button_dark": false,
|
|
"button_latch_set_samples": 0,
|
|
"daemon_pids": [
|
|
464
|
|
],
|
|
"disarm_after_idle_s": 0.6,
|
|
"emission_zero_after_hold_s": 1.59,
|
|
"fixture": {
|
|
"channels": [
|
|
"lid",
|
|
"interlock",
|
|
"button"
|
|
],
|
|
"hostname": "<REDACTED-1>",
|
|
"ip": "<IP-1>",
|
|
"released": []
|
|
},
|
|
"held_at_s": 2.13,
|
|
"kernel_drift_mm": 0.0,
|
|
"latch_locked_samples": 0,
|
|
"messages": [
|
|
"[MSG:Warning: cooling verdict blocks fire - fire masked, job held]",
|
|
"[MSG:Warning: cooling service lost - fire blocked, holding]",
|
|
"[MSG:Info: cooling service restored]",
|
|
"[MSG:Info: cooling verdict clean - resuming]",
|
|
"[MSG:Restoring spindle]",
|
|
"[MSG:]",
|
|
"[MSG:Pgm End]"
|
|
],
|
|
"mode": {
|
|
"detail": "already in grbl mode",
|
|
"found": "grbl",
|
|
"needs": "grbl",
|
|
"ok": true,
|
|
"switched": false
|
|
},
|
|
"operator": {
|
|
"ack_live": true,
|
|
"ts": "2026-09-19T21:58:07Z"
|
|
},
|
|
"resumed_at_s": 3.72,
|
|
"trail": [
|
|
{
|
|
"armed": true,
|
|
"emission": 148,
|
|
"gstate": "Run",
|
|
"il": 2,
|
|
"t": 0.1
|
|
},
|
|
{
|
|
"armed": true,
|
|
"emission": 148,
|
|
"gstate": "Run",
|
|
"il": 2,
|
|
"t": 0.33
|
|
},
|
|
{
|
|
"armed": true,
|
|
"emission": 148,
|
|
"gstate": "Run",
|
|
"il": 2,
|
|
"t": 0.56
|
|
},
|
|
{
|
|
"armed": true,
|
|
"emission": 146,
|
|
"gstate": "Run",
|
|
"il": 2,
|
|
"t": 0.78
|
|
},
|
|
{
|
|
"armed": true,
|
|
"emission": 146,
|
|
"gstate": "Run",
|
|
"il": 1,
|
|
"t": 1.01
|
|
},
|
|
{
|
|
"armed": true,
|
|
"emission": 146,
|
|
"gstate": "Run",
|
|
"il": 2,
|
|
"t": 1.23
|
|
},
|
|
{
|
|
"armed": true,
|
|
"emission": 146,
|
|
"gstate": "Run",
|
|
"il": 1,
|
|
"t": 1.45
|
|
},
|
|
{
|
|
"armed": true,
|
|
"emission": 146,
|
|
"gstate": "Run",
|
|
"il": 1,
|
|
"t": 1.69
|
|
},
|
|
{
|
|
"armed": true,
|
|
"emission": 151,
|
|
"gstate": "Run",
|
|
"il": 2,
|
|
"t": 1.91
|
|
},
|
|
{
|
|
"armed": true,
|
|
"emission": 151,
|
|
"gstate": "Hold:1",
|
|
"il": 2,
|
|
"t": 2.13
|
|
},
|
|
{
|
|
"armed": true,
|
|
"emission": 151,
|
|
"gstate": "Hold:0",
|
|
"il": 1,
|
|
"t": 2.36
|
|
},
|
|
{
|
|
"armed": true,
|
|
"emission": 151,
|
|
"gstate": "Hold:0",
|
|
"il": 1,
|
|
"t": 2.58
|
|
},
|
|
{
|
|
"armed": true,
|
|
"emission": 83,
|
|
"gstate": "Hold:0",
|
|
"il": 33,
|
|
"t": 2.8
|
|
},
|
|
{
|
|
"armed": true,
|
|
"emission": 83,
|
|
"gstate": "Hold:0",
|
|
"il": 33,
|
|
"t": 3.02
|
|
},
|
|
{
|
|
"armed": true,
|
|
"emission": 83,
|
|
"gstate": "Hold:0",
|
|
"il": 33,
|
|
"t": 3.25
|
|
},
|
|
{
|
|
"armed": true,
|
|
"emission": 83,
|
|
"gstate": "Hold:0",
|
|
"il": 33,
|
|
"t": 3.47
|
|
},
|
|
{
|
|
"armed": true,
|
|
"emission": 0,
|
|
"gstate": "Run",
|
|
"il": 1,
|
|
"t": 3.72
|
|
},
|
|
{
|
|
"armed": true,
|
|
"emission": 0,
|
|
"gstate": "Run",
|
|
"il": 1,
|
|
"t": 3.94
|
|
},
|
|
{
|
|
"armed": true,
|
|
"beam": 2732,
|
|
"emission": 0,
|
|
"gstate": "Run",
|
|
"il": 1,
|
|
"t": 4.17
|
|
},
|
|
{
|
|
"armed": true,
|
|
"beam": 2718,
|
|
"emission": 0,
|
|
"gstate": "Run",
|
|
"il": 1,
|
|
"t": 4.44
|
|
},
|
|
{
|
|
"armed": true,
|
|
"beam": 2698,
|
|
"emission": 131,
|
|
"gstate": "Run",
|
|
"il": 2,
|
|
"t": 4.72
|
|
},
|
|
{
|
|
"armed": true,
|
|
"beam": 2674,
|
|
"emission": 131,
|
|
"gstate": "Run",
|
|
"il": 2,
|
|
"t": 5.0
|
|
},
|
|
{
|
|
"armed": true,
|
|
"beam": 2672,
|
|
"emission": 131,
|
|
"gstate": "Run",
|
|
"il": 2,
|
|
"t": 5.29
|
|
},
|
|
{
|
|
"armed": true,
|
|
"beam": 2668,
|
|
"emission": 131,
|
|
"gstate": "Run",
|
|
"il": 1,
|
|
"t": 5.57
|
|
},
|
|
{
|
|
"armed": true,
|
|
"beam": 2680,
|
|
"emission": 151,
|
|
"gstate": "Run",
|
|
"il": 1,
|
|
"t": 5.84
|
|
},
|
|
{
|
|
"armed": true,
|
|
"beam": 2655,
|
|
"emission": 151,
|
|
"gstate": "Run",
|
|
"il": 1,
|
|
"t": 6.11
|
|
},
|
|
{
|
|
"armed": true,
|
|
"beam": 2693,
|
|
"emission": 151,
|
|
"gstate": "Run",
|
|
"il": 2,
|
|
"t": 6.4
|
|
},
|
|
{
|
|
"armed": true,
|
|
"beam": 2673,
|
|
"emission": 151,
|
|
"gstate": "Run",
|
|
"il": 2,
|
|
"t": 6.68
|
|
},
|
|
{
|
|
"armed": true,
|
|
"beam": 2660,
|
|
"emission": 149,
|
|
"gstate": "Run",
|
|
"il": 2,
|
|
"t": 6.95
|
|
},
|
|
{
|
|
"armed": true,
|
|
"beam": 2707,
|
|
"emission": 149,
|
|
"gstate": "Run",
|
|
"il": 2,
|
|
"t": 7.24
|
|
},
|
|
{
|
|
"armed": true,
|
|
"beam": 2705,
|
|
"emission": 149,
|
|
"gstate": "Run",
|
|
"il": 2,
|
|
"t": 7.52
|
|
},
|
|
{
|
|
"armed": true,
|
|
"beam": 2658,
|
|
"emission": 150,
|
|
"gstate": "Run",
|
|
"il": 1,
|
|
"t": 7.84
|
|
},
|
|
{
|
|
"armed": true,
|
|
"beam": 1861,
|
|
"emission": 150,
|
|
"gstate": "Run",
|
|
"il": 1,
|
|
"t": 8.11
|
|
},
|
|
{
|
|
"armed": true,
|
|
"beam": 1869,
|
|
"emission": 150,
|
|
"gstate": "Idle",
|
|
"il": 1,
|
|
"t": 8.41
|
|
}
|
|
]
|
|
},
|
|
"fingerprint": "aa904224ba5a149073e1e4303cdfc367696a738dd500255d2c7367c5ae0ba5b6",
|
|
"image": "20260919214619 (dev)",
|
|
"log": [
|
|
"21:58:06 start laser.verdict-cut (live, api) in campaign c-20260919215024-c402",
|
|
"21:58:07 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
|
|
"21:58:07 fixture: <REDACTED-1> at <IP-1> covers lid, interlock, button",
|
|
"21:58:07 queued by the attended queue opened 2026-09-19T21:50:24Z",
|
|
"21:58:07 baseline: pre: clean",
|
|
"21:58:07 mode: test needs grbl - already in grbl mode",
|
|
"21:58:07 unlock: ['[MSG:Caution: Unlocked]', 'ok']",
|
|
"21:58:07 connect: Idle",
|
|
"21:58:08 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:58:08 READY: waiting for the operator's press on the machine (the bench then does every press in this test)",
|
|
"21:58:11 READY: operator present (press after 2.7 s); the bench takes the presses",
|
|
"21:58: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.",
|
|
"21:58:11 READY: presence already proved this test; the bench has the presses",
|
|
"21:58:11 ARM: the fixture presses when the button lights (the bench's arm_press opt-in)",
|
|
"21:58:11 ARM press by the fixture, button lit after 0.3 s",
|
|
"21:58:14 emission live (51); pausing the daemon in 1 s",
|
|
"21:58:15 daemon paused (SIGSTOP [464]) for 3.0 s: the verdict goes stale",
|
|
"21:58:18 daemon resumed (SIGCONT) at +3.15 s",
|
|
"21:58:24 {'t': 0.1, 'gstate': 'Run', 'il': 2, 'emission': 148, 'armed': True}",
|
|
"21:58:24 {'t': 0.33, 'gstate': 'Run', 'il': 2, 'emission': 148, 'armed': True}",
|
|
"21:58:24 {'t': 0.56, 'gstate': 'Run', 'il': 2, 'emission': 148, 'armed': True}",
|
|
"21:58:24 {'t': 0.78, 'gstate': 'Run', 'il': 2, 'emission': 146, 'armed': True}",
|
|
"21:58:24 {'t': 1.01, 'gstate': 'Run', 'il': 1, 'emission': 146, 'armed': True}",
|
|
"21:58:24 {'t': 1.23, 'gstate': 'Run', 'il': 2, 'emission': 146, 'armed': True}",
|
|
"21:58:24 {'t': 1.45, 'gstate': 'Run', 'il': 1, 'emission': 146, 'armed': True}",
|
|
"21:58:24 {'t': 1.69, 'gstate': 'Run', 'il': 1, 'emission': 146, 'armed': True}",
|
|
"21:58:24 {'t': 1.91, 'gstate': 'Run', 'il': 2, 'emission': 151, 'armed': True}",
|
|
"21:58:24 {'t': 2.13, 'gstate': 'Hold:1', 'il': 2, 'emission': 151, 'armed': True}",
|
|
"21:58:24 {'t': 2.36, 'gstate': 'Hold:0', 'il': 1, 'emission': 151, 'armed': True}",
|
|
"21:58:24 {'t': 2.58, 'gstate': 'Hold:0', 'il': 1, 'emission': 151, 'armed': True}",
|
|
"21:58:24 {'t': 2.8, 'gstate': 'Hold:0', 'il': 33, 'emission': 83, 'armed': True}",
|
|
"21:58:24 {'t': 3.02, 'gstate': 'Hold:0', 'il': 33, 'emission': 83, 'armed': True}",
|
|
"21:58:24 {'t': 3.25, 'gstate': 'Hold:0', 'il': 33, 'emission': 83, 'armed': True}",
|
|
"21:58:24 {'t': 3.47, 'gstate': 'Hold:0', 'il': 33, 'emission': 83, 'armed': True}",
|
|
"21:58:24 {'t': 3.72, 'gstate': 'Run', 'il': 1, 'emission': 0, 'armed': True}",
|
|
"21:58:24 {'t': 3.94, 'gstate': 'Run', 'il': 1, 'emission': 0, 'armed': True}",
|
|
"21:58:24 {'t': 4.17, 'gstate': 'Run', 'il': 1, 'emission': 0, 'armed': True, 'beam': 2732}",
|
|
"21:58:24 {'t': 4.44, 'gstate': 'Run', 'il': 1, 'emission': 0, 'armed': True, 'beam': 2718}",
|
|
"21:58:24 {'t': 4.72, 'gstate': 'Run', 'il': 2, 'emission': 131, 'armed': True, 'beam': 2698}",
|
|
"21:58:24 {'t': 5.0, 'gstate': 'Run', 'il': 2, 'emission': 131, 'armed': True, 'beam': 2674}",
|
|
"21:58:24 {'t': 5.29, 'gstate': 'Run', 'il': 2, 'emission': 131, 'armed': True, 'beam': 2672}",
|
|
"21:58:24 {'t': 5.57, 'gstate': 'Run', 'il': 1, 'emission': 131, 'armed': True, 'beam': 2668}",
|
|
"21:58:24 {'t': 5.84, 'gstate': 'Run', 'il': 1, 'emission': 151, 'armed': True, 'beam': 2680}",
|
|
"21:58:24 {'t': 6.11, 'gstate': 'Run', 'il': 1, 'emission': 151, 'armed': True, 'beam': 2655}",
|
|
"21:58:24 {'t': 6.4, 'gstate': 'Run', 'il': 2, 'emission': 151, 'armed': True, 'beam': 2693}",
|
|
"21:58:24 {'t': 6.68, 'gstate': 'Run', 'il': 2, 'emission': 151, 'armed': True, 'beam': 2673}",
|
|
"21:58:24 {'t': 6.95, 'gstate': 'Run', 'il': 2, 'emission': 149, 'armed': True, 'beam': 2660}",
|
|
"21:58:24 {'t': 7.24, 'gstate': 'Run', 'il': 2, 'emission': 149, 'armed': True, 'beam': 2707}",
|
|
"21:58:24 {'t': 7.52, 'gstate': 'Run', 'il': 2, 'emission': 149, 'armed': True, 'beam': 2705}",
|
|
"21:58:24 {'t': 7.84, 'gstate': 'Run', 'il': 1, 'emission': 150, 'armed': True, 'beam': 2658}",
|
|
"21:58:24 {'t': 8.11, 'gstate': 'Run', 'il': 1, 'emission': 150, 'armed': True, 'beam': 1861}",
|
|
"21:58:24 {'t': 8.41, 'gstate': 'Idle', 'il': 1, 'emission': 150, 'armed': True, 'beam': 1869}",
|
|
"21:58:24 controller: ['[MSG:Warning: cooling verdict blocks fire - fire masked, job held]', '[MSG:Warning: cooling service lost - fire blocked, holding]', '[MSG:Info: cooling service restored]', '[MSG:Info: cooling verdict clean - resuming]', '[MSG:Restoring spindle]', '[MSG:]', '[MSG:Pgm End]']",
|
|
"21:58:24 kernel counters: start (0.00, 0.00) -> now (0.00, 0.00), drift 0.000 mm",
|
|
"21:58:24 beam detector: idle 1841, peak 2788, digital asserted True",
|
|
"21:58:24 button dark after 0.0 s",
|
|
"21:58:24 PASS: held at +2.13 s with the latch untouched, emission 0 1.59 s after the hold, resumed lit at +3.72 s with no press, disarmed 0.6 s after Idle",
|
|
"21:58:38 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
|
|
"21:58:41 baseline: cool: smoke/armed=False/hold=False ended on its own after 16 s; the engine's own post-job work, not a leftover",
|
|
"21:58:41 baseline: post: clean",
|
|
"21:58:41 result PASS"
|
|
],
|
|
"manifest_sha": "5dbf1f84b9aea447033e38de4b79d4fe8af2309af74367f0befbe9429d44d170",
|
|
"message": "",
|
|
"result": "PASS",
|
|
"test": "laser.verdict-cut",
|
|
"ts": "2026-09-19T21:58:41Z"
|
|
},
|
|
"requires": [
|
|
"laser.emission-witness"
|
|
],
|
|
"satisfied": true,
|
|
"source_sha": "0a0d13610d5350f1f6cec33b16373748f1df0d0a9545342cbf7f482f2d92b0f8",
|
|
"subsystem": "laser",
|
|
"title": "A blocked verdict mid-cut locks the latch and holds; the clean verdict resumes with no press"
|
|
},
|
|
{
|
|
"always": false,
|
|
"covers": [
|
|
[
|
|
"grblhal-glowforge",
|
|
"src/**"
|
|
],
|
|
[
|
|
"kernel-module-glowforge",
|
|
"**"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/super.c"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/cool.c"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/status.c"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/main.c"
|
|
],
|
|
[
|
|
"grblhal-glowforge",
|
|
"src/glowforge_laser.c"
|
|
],
|
|
[
|
|
"grblhal-glowforge",
|
|
"src/glowforge_switches.c"
|
|
],
|
|
[
|
|
"grblhal-glowforge",
|
|
"src/glowforge_switch_map.h"
|
|
]
|
|
],
|
|
"fingerprint": "43c1c6968bf5456c8a699c6fd4e3868ca53bcc748b88e85cf07dfba278e064fd",
|
|
"hardware": "api",
|
|
"id": "laser.arm-wait-lid",
|
|
"inherited": true,
|
|
"kind": "operator",
|
|
"record": {
|
|
"answers": [],
|
|
"campaign": "c-20260919210959-8780",
|
|
"duration_s": 19,
|
|
"evidence": {
|
|
"actions": [
|
|
{
|
|
"by": "fixture",
|
|
"channel": "lid",
|
|
"state": "open",
|
|
"took_s": 0.05,
|
|
"ts": "2026-09-19T21:11:55Z"
|
|
},
|
|
{
|
|
"by": "fixture",
|
|
"channel": "lid",
|
|
"state": "close",
|
|
"took_s": 0.33,
|
|
"ts": "2026-09-19T21:11:55Z"
|
|
}
|
|
],
|
|
"armed_after": false,
|
|
"armed_during_wait": true,
|
|
"baseline": {
|
|
"post": [],
|
|
"pre": []
|
|
},
|
|
"batch": {
|
|
"group": "unattended",
|
|
"ts": "2026-09-19T21:09:59Z"
|
|
},
|
|
"button_dark": false,
|
|
"emission": 0,
|
|
"fixture": {
|
|
"channels": [
|
|
"lid",
|
|
"interlock",
|
|
"button"
|
|
],
|
|
"hostname": "<REDACTED-1>",
|
|
"ip": "<IP-1>",
|
|
"released": []
|
|
},
|
|
"latch_locked": true,
|
|
"messages": [
|
|
"[MSG:Info: press the button to start the laser job]",
|
|
"[MSG:Warning: lid opened during arm - job canceled]"
|
|
],
|
|
"mode": {
|
|
"detail": "already in grbl mode",
|
|
"found": "grbl",
|
|
"needs": "grbl",
|
|
"ok": true,
|
|
"switched": false
|
|
},
|
|
"state_after": "Idle"
|
|
},
|
|
"fingerprint": "43c1c6968bf5456c8a699c6fd4e3868ca53bcc748b88e85cf07dfba278e064fd",
|
|
"image": "20260919210531 (dev)",
|
|
"log": [
|
|
"21:11:53 start laser.arm-wait-lid (operator, api) in campaign c-20260919210959-8780",
|
|
"21:11:54 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
|
|
"21:11:54 fixture: <REDACTED-1> at <IP-1> covers lid, interlock, button",
|
|
"21:11:54 fixture: running unattended (no prompt can be answered)",
|
|
"21:11:54 queued by the unattended queue opened 2026-09-19T21:09:59Z",
|
|
"21:11:54 baseline: pre: clean",
|
|
"21:11:54 mode: test needs grbl - already in grbl mode",
|
|
"21:11:54 connect: Idle",
|
|
"21:11:55 arm prompt seen; armed=True; asking the operator to open the lid",
|
|
"21:11:55 ACT lid open (fixture)",
|
|
"21:11:55 ACT lid open: done after 0.0 s",
|
|
"21:11:55 controller: ['[MSG:Info: press the button to start the laser job]', '[MSG:Warning: lid opened during arm - job canceled]']",
|
|
"21:11:55 button dark after 0.0 s",
|
|
"21:11:55 ACT lid close (fixture)",
|
|
"21:11:55 ACT lid close: done after 0.3 s",
|
|
"21:11:56 PASS: lid open during the arm wait canceled the job (clean reset, no alarm), armed=false, latch locked",
|
|
"21:12:12 baseline: cool: smoke/armed=False/hold=False ended on its own after 16 s; the engine's own post-job work, not a leftover",
|
|
"21:12:13 baseline: post: clean",
|
|
"21:12:13 result PASS"
|
|
],
|
|
"manifest_sha": "5221f3466ae2497ca49fbb8cbe5d4eff49fab0f8c627190416aa2320948f69c4",
|
|
"message": "",
|
|
"result": "PASS",
|
|
"test": "laser.arm-wait-lid",
|
|
"ts": "2026-09-19T21:12:13Z"
|
|
},
|
|
"requires": [
|
|
"kernel.latch-locked-idle",
|
|
"motion.jog-roundtrip"
|
|
],
|
|
"satisfied": true,
|
|
"source_sha": "450d3329822083495e6d15bbf0b67b7d965bb251f939be1456053ae8649120bb",
|
|
"subsystem": "laser",
|
|
"title": "Lid open during the arm wait cancels the job"
|
|
},
|
|
{
|
|
"always": false,
|
|
"covers": [
|
|
[
|
|
"grblhal-glowforge",
|
|
"src/**"
|
|
],
|
|
[
|
|
"kernel-module-glowforge",
|
|
"**"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/super.c"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/cool.c"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/status.c"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/main.c"
|
|
],
|
|
[
|
|
"grblhal-glowforge",
|
|
"src/glowforge_switches.c"
|
|
],
|
|
[
|
|
"grblhal-glowforge",
|
|
"src/glowforge_switch_map.h"
|
|
]
|
|
],
|
|
"fingerprint": "ecbb80fb664410eacf09ec219c2063f3f15d995db9d7082bc5090fb077a6c05a",
|
|
"hardware": "api",
|
|
"id": "laser.pause-resume-lid-cancel",
|
|
"inherited": true,
|
|
"kind": "live",
|
|
"record": {
|
|
"answers": [],
|
|
"campaign": "c-20260919215024-c402",
|
|
"duration_s": 33,
|
|
"evidence": {
|
|
"actions": [
|
|
{
|
|
"by": "operator",
|
|
"channel": "button",
|
|
"state": "presence",
|
|
"took_s": 4.69,
|
|
"ts": "2026-09-19T21:58:47Z"
|
|
},
|
|
{
|
|
"by": "fixture",
|
|
"channel": "button",
|
|
"state": "arm",
|
|
"took_s": 0.25,
|
|
"ts": "2026-09-19T21:58:47Z"
|
|
},
|
|
{
|
|
"by": "fixture",
|
|
"channel": "button",
|
|
"state": "press",
|
|
"took_s": 0.11,
|
|
"ts": "2026-09-19T21:58:52Z"
|
|
},
|
|
{
|
|
"by": "fixture",
|
|
"channel": "button",
|
|
"state": "press",
|
|
"took_s": 0.14,
|
|
"ts": "2026-09-19T21:58:56Z"
|
|
},
|
|
{
|
|
"by": "fixture",
|
|
"channel": "lid",
|
|
"state": "open",
|
|
"took_s": 0.04,
|
|
"ts": "2026-09-19T21:58:57Z"
|
|
},
|
|
{
|
|
"by": "fixture",
|
|
"channel": "lid",
|
|
"state": "close",
|
|
"took_s": 0.33,
|
|
"ts": "2026-09-19T21:59:06Z"
|
|
}
|
|
],
|
|
"armed_after": false,
|
|
"armed_while_paused": true,
|
|
"baseline": {
|
|
"post": [],
|
|
"pre": []
|
|
},
|
|
"batch": {
|
|
"group": "attended",
|
|
"ts": "2026-09-19T21:50:24Z"
|
|
},
|
|
"beam": {
|
|
"delta": 950,
|
|
"digital_seen": true,
|
|
"idle": 1841,
|
|
"peak": 2791,
|
|
"samples": 4
|
|
},
|
|
"button_dark": false,
|
|
"button_latch": 1,
|
|
"drift_mm": 0.028,
|
|
"emission_back_after_s": 0.48,
|
|
"emission_running": 97,
|
|
"emission_zero_when_paused": true,
|
|
"fixture": {
|
|
"channels": [
|
|
"lid",
|
|
"interlock",
|
|
"button"
|
|
],
|
|
"hostname": "<REDACTED-1>",
|
|
"ip": "<IP-1>",
|
|
"released": []
|
|
},
|
|
"hold_state": "Hold:0",
|
|
"kernel_drift_mm": 0.03,
|
|
"kernel_start": [
|
|
0.0,
|
|
0.0
|
|
],
|
|
"latch_locked": true,
|
|
"latch_locked_while_paused": false,
|
|
"lid_tail_zero": true,
|
|
"lid_zero_at_s": 1.85,
|
|
"messages": [
|
|
"[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]"
|
|
],
|
|
"mode": {
|
|
"detail": "already in grbl mode",
|
|
"found": "grbl",
|
|
"needs": "grbl",
|
|
"ok": true,
|
|
"switched": false
|
|
},
|
|
"operator": {
|
|
"ack_live": true,
|
|
"ts": "2026-09-19T21:58:41Z"
|
|
},
|
|
"pause_message": true,
|
|
"paused_trail": [
|
|
[
|
|
0.1,
|
|
97,
|
|
true
|
|
],
|
|
[
|
|
0.35,
|
|
97,
|
|
true
|
|
],
|
|
[
|
|
0.6,
|
|
97,
|
|
true
|
|
],
|
|
[
|
|
0.86,
|
|
81,
|
|
true
|
|
],
|
|
[
|
|
1.1,
|
|
81,
|
|
true
|
|
],
|
|
[
|
|
1.35,
|
|
81,
|
|
true
|
|
],
|
|
[
|
|
1.6,
|
|
81,
|
|
true
|
|
],
|
|
[
|
|
1.85,
|
|
0,
|
|
true
|
|
],
|
|
[
|
|
2.11,
|
|
0,
|
|
true
|
|
],
|
|
[
|
|
2.35,
|
|
0,
|
|
true
|
|
],
|
|
[
|
|
2.6,
|
|
0,
|
|
true
|
|
],
|
|
[
|
|
2.85,
|
|
0,
|
|
true
|
|
],
|
|
[
|
|
3.1,
|
|
0,
|
|
true
|
|
],
|
|
[
|
|
3.39,
|
|
0,
|
|
true
|
|
],
|
|
[
|
|
3.63,
|
|
0,
|
|
true
|
|
],
|
|
[
|
|
3.88,
|
|
0,
|
|
true
|
|
]
|
|
],
|
|
"resume_message": true,
|
|
"resume_trail": [
|
|
[
|
|
0.06,
|
|
0
|
|
],
|
|
[
|
|
0.27,
|
|
0
|
|
],
|
|
[
|
|
0.48,
|
|
31
|
|
]
|
|
],
|
|
"resumed_state": "Run",
|
|
"returned_message": true,
|
|
"start": [
|
|
0.0,
|
|
0.0,
|
|
4.449
|
|
]
|
|
},
|
|
"fingerprint": "ecbb80fb664410eacf09ec219c2063f3f15d995db9d7082bc5090fb077a6c05a",
|
|
"image": "20260919214619 (dev)",
|
|
"log": [
|
|
"21:58:41 start laser.pause-resume-lid-cancel (live, api) in campaign c-20260919215024-c402",
|
|
"21:58:41 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
|
|
"21:58:41 fixture: <REDACTED-1> at <IP-1> covers lid, interlock, button",
|
|
"21:58:41 queued by the attended queue opened 2026-09-19T21:50:24Z",
|
|
"21:58:41 baseline: pre: clean",
|
|
"21:58:41 mode: test needs grbl - already in grbl mode",
|
|
"21:58:42 connect: Idle",
|
|
"21:58:42 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:58:42 READY: waiting for the operator's press on the machine (the bench then does every press in this test)",
|
|
"21:58:47 READY: operator present (press after 4.7 s); the bench takes the presses",
|
|
"21:58:47 ARM: the fixture presses when the button lights (the bench's arm_press opt-in)",
|
|
"21:58:47 ARM press by the fixture, button lit after 0.3 s",
|
|
"21:58:52 emission live (97) - asking the operator to pause",
|
|
"21:58:52 ACT button press (fixture)",
|
|
"21:58:52 ACT button press: done after 0.1 s",
|
|
"21:58:56 paused (0.1, 97, True)",
|
|
"21:58:56 paused (0.35, 97, True)",
|
|
"21:58:56 paused (0.6, 97, True)",
|
|
"21:58:56 paused (0.86, 81, True)",
|
|
"21:58:56 paused (1.1, 81, True)",
|
|
"21:58:56 paused (1.35, 81, True)",
|
|
"21:58:56 paused (1.6, 81, True)",
|
|
"21:58:56 paused (1.85, 0, True)",
|
|
"21:58:56 paused (2.11, 0, True)",
|
|
"21:58:56 paused (2.35, 0, True)",
|
|
"21:58:56 paused (2.6, 0, True)",
|
|
"21:58:56 paused (2.85, 0, True)",
|
|
"21:58:56 paused (3.1, 0, True)",
|
|
"21:58:56 paused (3.39, 0, True)",
|
|
"21:58:56 paused (3.63, 0, True)",
|
|
"21:58:56 paused (3.88, 0, True)",
|
|
"21:58:56 paused: Hold:0, emission 0 = True, armed = True, latch locked = False",
|
|
"21:58:56 ACT button press (fixture)",
|
|
"21:58:57 ACT button press: done after 0.1 s",
|
|
"21:58:57 emission after the resume: [(0.06, 0), (0.27, 0), (0.48, 31)]",
|
|
"21:58:57 ACT lid open (fixture)",
|
|
"21:58:57 ACT lid open: done after 0.0 s",
|
|
"21:59:05 post-lid (0.05, 31, 'running', False)",
|
|
"21:59:05 post-lid (0.28, 31, 'running', False)",
|
|
"21:59:05 post-lid (0.49, 31, 'running', False)",
|
|
"21:59:05 post-lid (0.74, 36, 'running', False)",
|
|
"21:59:05 post-lid (0.96, 36, 'idle', False)",
|
|
"21:59:05 post-lid (1.18, 36, 'idle', False)",
|
|
"21:59:05 post-lid (1.4, 36, 'idle', False)",
|
|
"21:59:05 post-lid (1.62, 36, 'idle', False)",
|
|
"21:59:05 post-lid (1.85, 0, 'idle', False)",
|
|
"21:59:05 post-lid (2.07, 0, 'idle', False)",
|
|
"21:59:05 post-lid (2.29, 0, 'idle', False)",
|
|
"21:59:05 post-lid (2.51, 0, 'idle', False)",
|
|
"21:59:05 post-lid (2.73, 0, 'idle', False)",
|
|
"21:59:05 post-lid (2.97, 0, 'idle', False)",
|
|
"21:59:05 post-lid (3.19, 0, 'idle', False)",
|
|
"21:59:05 post-lid (3.41, 0, 'idle', False)",
|
|
"21:59:05 post-lid (3.63, 0, 'idle', False)",
|
|
"21:59:05 post-lid (3.85, 0, 'idle', False)",
|
|
"21:59:05 post-lid (4.07, 0, 'idle', False)",
|
|
"21:59:05 post-lid (4.29, 0, 'idle', False)",
|
|
"21:59:05 post-lid (4.51, 0, 'idle', False)",
|
|
"21:59:05 post-lid (4.73, 0, 'idle', False)",
|
|
"21:59:05 post-lid (4.95, 0, 'idle', False)",
|
|
"21:59:05 post-lid (5.17, 0, 'idle', False)",
|
|
"21:59:05 post-lid (5.4, 0, 'idle', False)",
|
|
"21:59:05 post-lid (5.62, 0, 'idle', False)",
|
|
"21:59:05 post-lid (5.84, 0, 'idle', False)",
|
|
"21:59:05 post-lid (6.06, 0, 'idle', False)",
|
|
"21:59:05 post-lid (6.28, 0, 'idle', False)",
|
|
"21:59:05 post-lid (6.5, 0, 'idle', False)",
|
|
"21:59:05 post-lid (6.72, 0, 'idle', False)",
|
|
"21:59:05 post-lid (6.94, 0, 'idle', False)",
|
|
"21:59:05 post-lid (7.16, 0, 'idle', False)",
|
|
"21:59:05 post-lid (7.38, 0, 'idle', False)",
|
|
"21:59:05 post-lid (7.6, 0, 'idle', False)",
|
|
"21:59:05 post-lid (7.82, 0, 'idle', False)",
|
|
"21:59:05 post-lid (8.04, 0, 'idle', False)",
|
|
"21:59:05 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:59:06 returned: drift 0.028 mm; armed=False latch_locked=True button_latch=1",
|
|
"21:59:06 kernel counters: start (0.00, 0.00) -> now (0.03, 0.00), drift 0.030 mm",
|
|
"21:59:06 beam detector: idle 1841, peak 2791, digital asserted True",
|
|
"21:59:06 button dark after 0.0 s",
|
|
"21:59:06 ACT lid close (fixture)",
|
|
"21:59:06 ACT lid close: done after 0.3 s",
|
|
"21:59:07 PASS: button paused the burn (emission 0, armed kept, latch unlocked) and resumed it; the lid then canceled it - emission 0 at +1.85 s, reset without alarm, returned (drift 0.028 mm), button latch SET",
|
|
"21:59:12 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
|
|
"21:59:13 baseline: cool: smoke/armed=False/hold=False ended on its own after 6 s; the engine's own post-job work, not a leftover",
|
|
"21:59:14 baseline: head jogged back -0.028/-0.000 mm to its start",
|
|
"21:59:14 baseline: position: [6, 0, 0] (expected [0, 0, 0]) -> restored (jogged back -0.0/-0.0 mm); inside the 0.10 mm dead band, not a leftover",
|
|
"21:59:14 baseline: post: clean",
|
|
"21:59:14 result PASS"
|
|
],
|
|
"manifest_sha": "5dbf1f84b9aea447033e38de4b79d4fe8af2309af74367f0befbe9429d44d170",
|
|
"message": "",
|
|
"result": "PASS",
|
|
"test": "laser.pause-resume-lid-cancel",
|
|
"ts": "2026-09-19T21:59:14Z"
|
|
},
|
|
"requires": [
|
|
"laser.emission-witness",
|
|
"motion.lid-cancel-home",
|
|
"motion.button-hold-resume"
|
|
],
|
|
"satisfied": true,
|
|
"source_sha": "0c1df7e87a33d62cd160f5cea4ab2113b26f1b1582d929116dd0b490f6956307",
|
|
"subsystem": "laser",
|
|
"title": "One live cut: the button pauses and resumes it, the lid cancels it and sends the head home"
|
|
},
|
|
{
|
|
"always": false,
|
|
"covers": [
|
|
[
|
|
"forgectrl",
|
|
"src/cam.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/camhealth.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/debayer.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/vpu_jpeg.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/vpu_h264.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/mp4mux.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/gpu_debayer.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/ipu_copy.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/main.c"
|
|
],
|
|
[
|
|
"python3-gfhardware",
|
|
"gfhardware/src/**"
|
|
],
|
|
[
|
|
"python3-gfhardware",
|
|
"gfhardware/cam*"
|
|
]
|
|
],
|
|
"fingerprint": "bc0a6d82f9d857cb8056640dbb5e26a4685609330bfbe30c6b5991befb1d3fd2",
|
|
"hardware": "api",
|
|
"id": "camera.snapshot",
|
|
"inherited": true,
|
|
"kind": "auto",
|
|
"record": {
|
|
"answers": [],
|
|
"campaign": "c-20260919202934-3d3a",
|
|
"duration_s": 14,
|
|
"evidence": {
|
|
"baseline": {
|
|
"post": [],
|
|
"pre": []
|
|
},
|
|
"batch": {
|
|
"group": "unattended",
|
|
"ts": "2026-09-19T20:29:34Z"
|
|
},
|
|
"cam_status": {
|
|
"buffers": "uncached",
|
|
"cam": "lid",
|
|
"capture_allowed": true,
|
|
"clients": 0,
|
|
"convert": "cpu",
|
|
"encoder": "software",
|
|
"fps": 0.0,
|
|
"fps_cap": 0.0,
|
|
"frames": 0,
|
|
"h264": {
|
|
"active": false,
|
|
"clients": 0
|
|
},
|
|
"health": {
|
|
"captured": 0,
|
|
"corrupt": 0,
|
|
"restarts": 0
|
|
},
|
|
"hw_fps_skip": false,
|
|
"running": false,
|
|
"sensor": "OV5648",
|
|
"snapshot": {
|
|
"height": 1944,
|
|
"width": 2592
|
|
},
|
|
"stopped_by_lid": false,
|
|
"stream": {
|
|
"height": 972,
|
|
"width": 1296
|
|
}
|
|
},
|
|
"cam_status_after": {
|
|
"buffers": "cached",
|
|
"cam": "lid",
|
|
"capture_allowed": true,
|
|
"clients": 0,
|
|
"convert": "gpu",
|
|
"encoder": "vpu",
|
|
"fps": 0.3,
|
|
"fps_cap": 0.0,
|
|
"frames": 2,
|
|
"h264": {
|
|
"active": false,
|
|
"clients": 0
|
|
},
|
|
"health": {
|
|
"captured": 64,
|
|
"corrupt": 0,
|
|
"restarts": 0
|
|
},
|
|
"hw_fps_skip": false,
|
|
"running": true,
|
|
"sensor": "OV5648",
|
|
"snapshot": {
|
|
"height": 1944,
|
|
"width": 2592
|
|
},
|
|
"stopped_by_lid": false,
|
|
"stream": {
|
|
"height": 972,
|
|
"width": 1296
|
|
}
|
|
},
|
|
"fixture": {
|
|
"channels": [
|
|
"lid",
|
|
"interlock",
|
|
"button"
|
|
],
|
|
"hostname": "<REDACTED-1>",
|
|
"ip": "<IP-1>",
|
|
"released": []
|
|
},
|
|
"lid_lamp": "132",
|
|
"snapshot_bytes": 75157,
|
|
"snapshot_dark_bytes": 38314,
|
|
"snapshot_full_bytes": 161580,
|
|
"stream_ctype": "multipart/x-mixed-replace; boundary=forgectrl-frame"
|
|
},
|
|
"fingerprint": "bc0a6d82f9d857cb8056640dbb5e26a4685609330bfbe30c6b5991befb1d3fd2",
|
|
"image": "20260919202327 (dev)",
|
|
"log": [
|
|
"20:37:14 start camera.snapshot (auto, api) in campaign c-20260919202934-3d3a",
|
|
"20:37:15 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
|
|
"20:37:15 fixture: <REDACTED-1> at <IP-1> covers lid, interlock, button",
|
|
"20:37:15 queued by the unattended queue opened 2026-09-19T20:29:34Z",
|
|
"20:37:15 baseline: pre: clean",
|
|
"20:37:15 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:37:16 GET /cam/snapshot?cam=lid&res=half -> 200 (75157 bytes)",
|
|
"20:37:17 lamp 132 -> 75157 bytes; lamp off -> 38314 bytes",
|
|
"20:37:18 GET /cam/snapshot?cam=lid&res=full -> 200 (161580 bytes)",
|
|
"20:37:19 stream: multipart/x-mixed-replace; boundary=forgectrl-frame, first 65536 bytes",
|
|
"20:37:21 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': 64, 'corrupt': 0, 'restarts': 0}, 'capture_allowed': True, 'stopped_by_lid': False}",
|
|
"20:37:21 PASS: half-res snapshot 75157 bytes, 38314 with the lamp off; full-res 161580; stream multipart/x-mixed-replace; boundary=forgectrl-frame",
|
|
"20:37:29 baseline: post: clean",
|
|
"20:37:29 result PASS"
|
|
],
|
|
"manifest_sha": "2d41354cdfb037d942fbe328e2ae0594efadd92e976d1c4512ca461b5f864a7e",
|
|
"message": "",
|
|
"result": "PASS",
|
|
"test": "camera.snapshot",
|
|
"ts": "2026-09-19T20:37:29Z"
|
|
},
|
|
"requires": [
|
|
"forgectrl.panel-serves"
|
|
],
|
|
"satisfied": true,
|
|
"source_sha": "f5af99c1ada110a31cad2b4932022fb4ece7960311a3c221e8ee750ba6f5ba0e",
|
|
"subsystem": "camera",
|
|
"title": "Lid camera snapshot and stream"
|
|
},
|
|
{
|
|
"always": false,
|
|
"covers": [
|
|
[
|
|
"forgectrl",
|
|
"src/cam.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/camhealth.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/debayer.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/vpu_jpeg.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/vpu_h264.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/mp4mux.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/gpu_debayer.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/ipu_copy.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/main.c"
|
|
],
|
|
[
|
|
"python3-gfhardware",
|
|
"gfhardware/src/**"
|
|
],
|
|
[
|
|
"python3-gfhardware",
|
|
"gfhardware/cam*"
|
|
]
|
|
],
|
|
"fingerprint": "9072105f0eb3c5ca433a5cdb7f2f12c6d99589566947b3f63be5b8e53d9776c4",
|
|
"hardware": "api",
|
|
"id": "camera.sensor-profile",
|
|
"inherited": true,
|
|
"kind": "auto",
|
|
"record": {
|
|
"answers": [],
|
|
"campaign": "c-20260919210959-8780",
|
|
"duration_s": 12,
|
|
"evidence": {
|
|
"baseline": {
|
|
"post": [],
|
|
"pre": []
|
|
},
|
|
"batch": {
|
|
"group": "unattended",
|
|
"ts": "2026-09-19T21:09:59Z"
|
|
},
|
|
"fixture": {
|
|
"channels": [
|
|
"lid",
|
|
"interlock",
|
|
"button"
|
|
],
|
|
"hostname": "<REDACTED-1>",
|
|
"ip": "<IP-1>",
|
|
"released": []
|
|
},
|
|
"geometry": {
|
|
"snapshot": {
|
|
"height": 1944,
|
|
"width": 2592
|
|
},
|
|
"stream": {
|
|
"height": 972,
|
|
"width": 1296
|
|
}
|
|
},
|
|
"jpeg_full": [
|
|
2592,
|
|
1944
|
|
],
|
|
"jpeg_half": [
|
|
1296,
|
|
972
|
|
],
|
|
"sensor": "OV5648"
|
|
},
|
|
"fingerprint": "9072105f0eb3c5ca433a5cdb7f2f12c6d99589566947b3f63be5b8e53d9776c4",
|
|
"image": "20260919210531 (dev)",
|
|
"log": [
|
|
"21:12:13 start camera.sensor-profile (auto, api) in campaign c-20260919210959-8780",
|
|
"21:12:13 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
|
|
"21:12:13 fixture: <REDACTED-1> at <IP-1> covers lid, interlock, button",
|
|
"21:12:13 queued by the unattended queue opened 2026-09-19T21:09:59Z",
|
|
"21:12:13 baseline: pre: clean",
|
|
"21:12:13 sensor: OV5648",
|
|
"21:12:13 advertised: snapshot 2592x1944, stream 1296x972",
|
|
"21:12:14 full snapshot: (2592, 1944) (262155 bytes)",
|
|
"21:12:15 half snapshot: (1296, 972) (75305 bytes)",
|
|
"21:12:25 baseline: post: clean",
|
|
"21:12:25 result PASS"
|
|
],
|
|
"manifest_sha": "5221f3466ae2497ca49fbb8cbe5d4eff49fab0f8c627190416aa2320948f69c4",
|
|
"message": "",
|
|
"result": "PASS",
|
|
"test": "camera.sensor-profile",
|
|
"ts": "2026-09-19T21:12:25Z"
|
|
},
|
|
"requires": [
|
|
"forgectrl.panel-serves"
|
|
],
|
|
"satisfied": true,
|
|
"source_sha": "2cd6a21e37c55b6f4d7961f07f69ae1949bc42c7e71978b372b9456f05300410",
|
|
"subsystem": "camera",
|
|
"title": "Camera geometry follows the fitted sensor"
|
|
},
|
|
{
|
|
"always": false,
|
|
"covers": [
|
|
[
|
|
"forgectrl",
|
|
"src/cam.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/camhealth.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/debayer.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/vpu_jpeg.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/vpu_h264.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/mp4mux.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/gpu_debayer.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/ipu_copy.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/main.c"
|
|
],
|
|
[
|
|
"python3-gfhardware",
|
|
"gfhardware/src/**"
|
|
],
|
|
[
|
|
"python3-gfhardware",
|
|
"gfhardware/cam*"
|
|
]
|
|
],
|
|
"fingerprint": "b5b83e7ed84e24a5ee1a07e7a6b0ce36809599bf4982a33bc4c52411ef4931d0",
|
|
"hardware": "api",
|
|
"id": "camera.h264-stream",
|
|
"inherited": true,
|
|
"kind": "auto",
|
|
"record": {
|
|
"answers": [],
|
|
"campaign": "c-20260919210959-8780",
|
|
"duration_s": 12,
|
|
"evidence": {
|
|
"baseline": {
|
|
"post": [],
|
|
"pre": []
|
|
},
|
|
"batch": {
|
|
"group": "unattended",
|
|
"ts": "2026-09-19T21:09:59Z"
|
|
},
|
|
"bytes": 65536,
|
|
"cam_status": {
|
|
"buffers": "cached",
|
|
"cam": "lid",
|
|
"capture_allowed": true,
|
|
"clients": 0,
|
|
"convert": "gpu",
|
|
"encoder": "software",
|
|
"fps": 0.0,
|
|
"fps_cap": 0.0,
|
|
"frames": 0,
|
|
"h264": {
|
|
"active": true,
|
|
"clients": 1
|
|
},
|
|
"health": {
|
|
"captured": 167,
|
|
"corrupt": 0,
|
|
"restarts": 0
|
|
},
|
|
"hw_fps_skip": false,
|
|
"running": true,
|
|
"sensor": "OV5648",
|
|
"snapshot": {
|
|
"height": 1944,
|
|
"width": 2592
|
|
},
|
|
"stopped_by_lid": false,
|
|
"stream": {
|
|
"height": 972,
|
|
"width": 1296
|
|
}
|
|
},
|
|
"codec": "avc1.424020",
|
|
"content_type": "video/mp4",
|
|
"fixture": {
|
|
"channels": [
|
|
"lid",
|
|
"interlock",
|
|
"button"
|
|
],
|
|
"hostname": "<REDACTED-1>",
|
|
"ip": "<IP-1>",
|
|
"released": []
|
|
}
|
|
},
|
|
"fingerprint": "b5b83e7ed84e24a5ee1a07e7a6b0ce36809599bf4982a33bc4c52411ef4931d0",
|
|
"image": "20260919210531 (dev)",
|
|
"log": [
|
|
"21:12:25 start camera.h264-stream (auto, api) in campaign c-20260919210959-8780",
|
|
"21:12:25 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
|
|
"21:12:25 fixture: <REDACTED-1> at <IP-1> covers lid, interlock, button",
|
|
"21:12:25 queued by the unattended queue opened 2026-09-19T21:09:59Z",
|
|
"21:12:26 baseline: pre: clean",
|
|
"21:12:27 codec avc1.424020, content-type video/mp4",
|
|
"21:12:27 convert=gpu h264={'active': True, 'clients': 1}",
|
|
"21:12:38 baseline: post: clean",
|
|
"21:12:38 result PASS"
|
|
],
|
|
"manifest_sha": "5221f3466ae2497ca49fbb8cbe5d4eff49fab0f8c627190416aa2320948f69c4",
|
|
"message": "",
|
|
"result": "PASS",
|
|
"test": "camera.h264-stream",
|
|
"ts": "2026-09-19T21:12:38Z"
|
|
},
|
|
"requires": [
|
|
"forgectrl.panel-serves"
|
|
],
|
|
"satisfied": true,
|
|
"source_sha": "397afe06cbabefbde565e3018f68b948556a8bd87e9b9a17d8c1024e0b480294",
|
|
"subsystem": "camera",
|
|
"title": "H.264 live stream"
|
|
},
|
|
{
|
|
"always": false,
|
|
"covers": [
|
|
[
|
|
"forgectrl",
|
|
"src/cam.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/camhealth.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/debayer.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/vpu_jpeg.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/vpu_h264.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/mp4mux.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/gpu_debayer.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/ipu_copy.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/main.c"
|
|
],
|
|
[
|
|
"python3-gfhardware",
|
|
"gfhardware/src/**"
|
|
],
|
|
[
|
|
"python3-gfhardware",
|
|
"gfhardware/cam*"
|
|
]
|
|
],
|
|
"fingerprint": "f31c964d50de9c6c1423d1af25c017ac12b2437fcbd09dcf240c8c312d650ddd",
|
|
"hardware": "api",
|
|
"id": "camera.frame-health",
|
|
"inherited": true,
|
|
"kind": "auto",
|
|
"record": {
|
|
"answers": [],
|
|
"campaign": "c-20260919210959-8780",
|
|
"duration_s": 12,
|
|
"evidence": {
|
|
"baseline": {
|
|
"post": [],
|
|
"pre": []
|
|
},
|
|
"batch": {
|
|
"group": "unattended",
|
|
"ts": "2026-09-19T21:09:59Z"
|
|
},
|
|
"captured": 8,
|
|
"corrupt": 0,
|
|
"fixture": {
|
|
"channels": [
|
|
"lid",
|
|
"interlock",
|
|
"button"
|
|
],
|
|
"hostname": "<REDACTED-1>",
|
|
"ip": "<IP-1>",
|
|
"released": []
|
|
},
|
|
"health_after": {
|
|
"captured": 327,
|
|
"corrupt": 0,
|
|
"restarts": 0
|
|
},
|
|
"health_before": {
|
|
"captured": 319,
|
|
"corrupt": 0,
|
|
"restarts": 0
|
|
},
|
|
"restarts": 0
|
|
},
|
|
"fingerprint": "f31c964d50de9c6c1423d1af25c017ac12b2437fcbd09dcf240c8c312d650ddd",
|
|
"image": "20260919210531 (dev)",
|
|
"log": [
|
|
"21:12:38 start camera.frame-health (auto, api) in campaign c-20260919210959-8780",
|
|
"21:12:38 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
|
|
"21:12:38 fixture: <REDACTED-1> at <IP-1> covers lid, interlock, button",
|
|
"21:12:38 queued by the unattended queue opened 2026-09-19T21:09:59Z",
|
|
"21:12:38 baseline: pre: clean",
|
|
"21:12:38 before: {'captured': 319, 'corrupt': 0, 'restarts': 0}",
|
|
"21:12:40 after: {'captured': 327, 'corrupt': 0, 'restarts': 0}",
|
|
"21:12:40 captured 8 frames, 0 corrupt, 0 stream restarts",
|
|
"21:12:50 baseline: post: clean",
|
|
"21:12:50 result PASS"
|
|
],
|
|
"manifest_sha": "5221f3466ae2497ca49fbb8cbe5d4eff49fab0f8c627190416aa2320948f69c4",
|
|
"message": "",
|
|
"result": "PASS",
|
|
"test": "camera.frame-health",
|
|
"ts": "2026-09-19T21:12:50Z"
|
|
},
|
|
"requires": [
|
|
"forgectrl.panel-serves"
|
|
],
|
|
"satisfied": true,
|
|
"source_sha": "dd6b9fada8cc1bdde6c30e25214a599e42fa7b6bd229d0ec34516f20b00db6df",
|
|
"subsystem": "camera",
|
|
"title": "Capture delivers whole frames"
|
|
},
|
|
{
|
|
"always": false,
|
|
"covers": [
|
|
[
|
|
"forgectrl",
|
|
"src/cam.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/camhealth.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/debayer.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/vpu_jpeg.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/vpu_h264.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/mp4mux.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/gpu_debayer.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/ipu_copy.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/main.c"
|
|
],
|
|
[
|
|
"python3-gfhardware",
|
|
"gfhardware/src/**"
|
|
],
|
|
[
|
|
"python3-gfhardware",
|
|
"gfhardware/cam*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/status.*"
|
|
],
|
|
[
|
|
"python3-gfhardware",
|
|
"gfhardware/switches.py"
|
|
],
|
|
[
|
|
"forgefirm-app",
|
|
"forgefirm-app/ffmachine.py"
|
|
]
|
|
],
|
|
"fingerprint": "f854c1831ba47c636589062cc7f669b96d3661dfe0d1a4b84e19f8eafd4a49de",
|
|
"hardware": "api",
|
|
"id": "camera.lid-privacy",
|
|
"inherited": true,
|
|
"kind": "operator",
|
|
"record": {
|
|
"answers": [],
|
|
"campaign": "c-20260919210959-8780",
|
|
"duration_s": 13,
|
|
"evidence": {
|
|
"actions": [
|
|
{
|
|
"by": "fixture",
|
|
"channel": "lid",
|
|
"state": "close",
|
|
"took_s": 0.04,
|
|
"ts": "2026-09-19T21:12:51Z"
|
|
},
|
|
{
|
|
"by": "fixture",
|
|
"channel": "lid",
|
|
"state": "open",
|
|
"took_s": 0.05,
|
|
"ts": "2026-09-19T21:12:52Z"
|
|
},
|
|
{
|
|
"by": "fixture",
|
|
"channel": "lid",
|
|
"state": "close",
|
|
"took_s": 0.33,
|
|
"ts": "2026-09-19T21:12:52Z"
|
|
}
|
|
],
|
|
"baseline": {
|
|
"post": [],
|
|
"pre": []
|
|
},
|
|
"batch": {
|
|
"group": "unattended",
|
|
"ts": "2026-09-19T21:09:59Z"
|
|
},
|
|
"closed_snapshot_bytes": 75555,
|
|
"fixture": {
|
|
"channels": [
|
|
"lid",
|
|
"interlock",
|
|
"button"
|
|
],
|
|
"hostname": "<REDACTED-1>",
|
|
"ip": "<IP-1>",
|
|
"released": []
|
|
},
|
|
"snapshot_lid_open": [
|
|
409,
|
|
"lid is open: the cameras only capture with the lid closed"
|
|
],
|
|
"status_lid_open": {
|
|
"buffers": "cached",
|
|
"cam": "lid",
|
|
"capture_allowed": false,
|
|
"clients": 0,
|
|
"convert": "gpu",
|
|
"encoder": "vpu",
|
|
"fps": 0.0,
|
|
"fps_cap": 0.0,
|
|
"frames": 2,
|
|
"h264": {
|
|
"active": false,
|
|
"clients": 0
|
|
},
|
|
"health": {
|
|
"captured": 485,
|
|
"corrupt": 0,
|
|
"restarts": 0
|
|
},
|
|
"hw_fps_skip": false,
|
|
"running": false,
|
|
"sensor": "OV5648",
|
|
"snapshot": {
|
|
"height": 1944,
|
|
"width": 2592
|
|
},
|
|
"stopped_by_lid": true,
|
|
"stream": {
|
|
"height": 972,
|
|
"width": 1296
|
|
}
|
|
},
|
|
"stream_bytes_after_lid_open": 298786
|
|
},
|
|
"fingerprint": "f854c1831ba47c636589062cc7f669b96d3661dfe0d1a4b84e19f8eafd4a49de",
|
|
"image": "20260919210531 (dev)",
|
|
"log": [
|
|
"21:12:50 start camera.lid-privacy (operator, api) in campaign c-20260919210959-8780",
|
|
"21:12:51 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
|
|
"21:12:51 fixture: <REDACTED-1> at <IP-1> covers lid, interlock, button",
|
|
"21:12:51 fixture: running unattended (no prompt can be answered)",
|
|
"21:12:51 queued by the unattended queue opened 2026-09-19T21:09:59Z",
|
|
"21:12:51 baseline: pre: clean",
|
|
"21:12:51 ACT lid close (fixture)",
|
|
"21:12:51 ACT lid close: done after 0.0 s",
|
|
"21:12:52 lid closed: snapshot 75555 bytes",
|
|
"21:12:52 ACT lid open (fixture)",
|
|
"21:12:52 ACT lid open: done after 0.0 s",
|
|
"21:12:52 stream ended after 298786 further buffered bytes",
|
|
"21:12:52 lid open: snapshot -> 409 b'lid is open: the cameras only capture with the lid closed'",
|
|
"21:12:52 lid open: head snapshot -> 409",
|
|
"21:12:52 lid open: stream -> 409",
|
|
"21:12:52 ACT lid close (fixture)",
|
|
"21:12:53 ACT lid close: done after 0.3 s",
|
|
"21:12:54 lid closed again: snapshot 75624 bytes",
|
|
"21:13:04 baseline: post: clean",
|
|
"21:13:04 result PASS"
|
|
],
|
|
"manifest_sha": "5221f3466ae2497ca49fbb8cbe5d4eff49fab0f8c627190416aa2320948f69c4",
|
|
"message": "",
|
|
"result": "PASS",
|
|
"test": "camera.lid-privacy",
|
|
"ts": "2026-09-19T21:13:04Z"
|
|
},
|
|
"requires": [
|
|
"forgectrl.panel-serves"
|
|
],
|
|
"satisfied": true,
|
|
"source_sha": "74bde8bb9d74efc3d10858dc91a61e013dbc581d125ba5ed602ff15319bcb064",
|
|
"subsystem": "camera",
|
|
"title": "Cameras capture only with the lid closed"
|
|
},
|
|
{
|
|
"always": false,
|
|
"covers": [
|
|
[
|
|
"forgectrl",
|
|
"src/camkey.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/auth.c"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/main.c"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/ui/panel.js"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/ui/index.html"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/ui/help.js"
|
|
]
|
|
],
|
|
"fingerprint": "9c549989561ba52a9589918a04b241faaa1f5542035372c4d9270dab88ea6e62",
|
|
"hardware": "api",
|
|
"id": "camera.key-read",
|
|
"inherited": true,
|
|
"kind": "auto",
|
|
"record": {
|
|
"answers": [],
|
|
"campaign": "c-20260919210959-8780",
|
|
"duration_s": 0,
|
|
"evidence": {
|
|
"baseline": {
|
|
"post": [],
|
|
"pre": []
|
|
},
|
|
"batch": {
|
|
"group": "unattended",
|
|
"ts": "2026-09-19T21:09:59Z"
|
|
},
|
|
"fixture": {
|
|
"channels": [
|
|
"lid",
|
|
"interlock",
|
|
"button"
|
|
],
|
|
"hostname": "<REDACTED-1>",
|
|
"ip": "<IP-1>",
|
|
"released": []
|
|
},
|
|
"key_len": 32,
|
|
"rotated": true
|
|
},
|
|
"fingerprint": "9c549989561ba52a9589918a04b241faaa1f5542035372c4d9270dab88ea6e62",
|
|
"image": "20260919210531 (dev)",
|
|
"log": [
|
|
"21:13:04 start camera.key-read (auto, api) in campaign c-20260919210959-8780",
|
|
"21:13:05 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
|
|
"21:13:05 fixture: <REDACTED-1> at <IP-1> covers lid, interlock, button",
|
|
"21:13:05 queued by the unattended queue opened 2026-09-19T21:09:59Z",
|
|
"21:13:05 baseline: pre: clean",
|
|
"21:13:05 GET http://<IP-2>/cam/status (no key) -> 403",
|
|
"21:13:05 GET http://<IP-2>/cam/status?key=... -> 200",
|
|
"21:13:05 GET https://<IP-2>/cam/status (no key) -> 403",
|
|
"21:13:05 GET https://<IP-2>/cam/status?key=... -> 200",
|
|
"21:13:05 POST /settings with the camera key -> 403",
|
|
"21:13:05 baseline: post: clean",
|
|
"21:13:05 result PASS"
|
|
],
|
|
"manifest_sha": "5221f3466ae2497ca49fbb8cbe5d4eff49fab0f8c627190416aa2320948f69c4",
|
|
"message": "",
|
|
"result": "PASS",
|
|
"test": "camera.key-read",
|
|
"ts": "2026-09-19T21:13:05Z"
|
|
},
|
|
"requires": [
|
|
"forgectrl.auth"
|
|
],
|
|
"satisfied": true,
|
|
"source_sha": "91697fdf5789f0ecda0b93d88b0cb1631b551ba732b71f97ab50c77bb8d8446a",
|
|
"subsystem": "camera",
|
|
"title": "The camera key reads without a login"
|
|
},
|
|
{
|
|
"always": false,
|
|
"covers": [
|
|
[
|
|
"forgectrl",
|
|
"src/update.c"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/update.h"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/relcheck.c"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/relcheck.h"
|
|
],
|
|
[
|
|
"ffboot",
|
|
"**"
|
|
]
|
|
],
|
|
"fingerprint": "ddb6a1ad8fceace74449e8332f1a8d7478bb17d9a572c6021aa1822a90e0387c",
|
|
"hardware": "api",
|
|
"id": "update.slots-and-signature",
|
|
"inherited": true,
|
|
"kind": "auto",
|
|
"record": {
|
|
"answers": [],
|
|
"campaign": "c-20260919202934-3d3a",
|
|
"duration_s": 1,
|
|
"evidence": {
|
|
"apply": {
|
|
"body": {
|
|
"started": true
|
|
},
|
|
"status": 202
|
|
},
|
|
"apply_result": {
|
|
"error": "archive is not signed with the ForgeFIRM release key (confirm_unsigned=1 to apply anyway)",
|
|
"ok": false
|
|
},
|
|
"baseline": {
|
|
"post": [],
|
|
"pre": []
|
|
},
|
|
"batch": {
|
|
"group": "unattended",
|
|
"ts": "2026-09-19T20:29:34Z"
|
|
},
|
|
"ffboot_l_rc": 0,
|
|
"fixture": {
|
|
"channels": [
|
|
"lid",
|
|
"interlock",
|
|
"button"
|
|
],
|
|
"hostname": "<REDACTED-1>",
|
|
"ip": "<IP-1>",
|
|
"released": []
|
|
},
|
|
"fwup_foreign": {
|
|
"own_key_rc": 0,
|
|
"shipped_key_rc": 1
|
|
},
|
|
"fwup_garbage_rc": 1,
|
|
"fwup_gen_rc": 0,
|
|
"slots": {
|
|
"archives": [],
|
|
"booted": "/dev/mmcblk1p1",
|
|
"env": {
|
|
"mmcdev": "0",
|
|
"mmchwpart": "0",
|
|
"mmcpart": "1",
|
|
"mmcroot": "/dev/mmcblk1p1"
|
|
},
|
|
"slots": {
|
|
"a": {
|
|
"booted": false,
|
|
"device": "/dev/mmcblk2p1",
|
|
"kernel": "yes",
|
|
"next": false,
|
|
"present": "yes",
|
|
"state": "ok",
|
|
"type": "factory",
|
|
"version": "v2.6.0-2228"
|
|
},
|
|
"b": {
|
|
"booted": false,
|
|
"device": "/dev/mmcblk2p2",
|
|
"kernel": "yes",
|
|
"next": false,
|
|
"present": "yes",
|
|
"state": "ok",
|
|
"type": "forgefirm",
|
|
"version": "v0.0.4"
|
|
},
|
|
"sd": {
|
|
"booted": true,
|
|
"device": "/dev/mmcblk1p1",
|
|
"kernel": "yes",
|
|
"next": true,
|
|
"present": "yes",
|
|
"state": "ok",
|
|
"type": "forgefirm",
|
|
"version": "20260919202327 (dev)"
|
|
}
|
|
},
|
|
"staged": {
|
|
"download": {
|
|
"bytes": 36827950,
|
|
"present": true,
|
|
"version": "v0.0.4"
|
|
},
|
|
"upload": {
|
|
"bytes": 0,
|
|
"present": false,
|
|
"version": ""
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"fingerprint": "ddb6a1ad8fceace74449e8332f1a8d7478bb17d9a572c6021aa1822a90e0387c",
|
|
"image": "20260919202327 (dev)",
|
|
"log": [
|
|
"20:33:03 start update.slots-and-signature (auto, api) in campaign c-20260919202934-3d3a",
|
|
"20:33:03 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
|
|
"20:33:03 fixture: <REDACTED-1> at <IP-1> covers lid, interlock, button",
|
|
"20:33:03 queued by the unattended queue opened 2026-09-19T20:29:34Z",
|
|
"20:33:03 baseline: pre: clean",
|
|
"20:33: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': '20260919202327 (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.4', 'kernel': 'yes', 'booted': False, 'next': False}}, 'archives': [], 'staged': {'download': {'present': True, 'bytes': 36827950, 'version': 'v0.0.4'}, 'upload': {'present': False, 'bytes': 0, 'version': ''}}}",
|
|
"20:33: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=20260919202327 (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.4\nslot.b.kernel=yes\nslot.legacy.device=/dev/mmcblk2p4\nslot.legacy.present=no",
|
|
"20:33:04 GET /update/status -> 200 {'running': False, 'kind': '', 'phase': '', 'elapsed': 0, 'progress_bytes': -1, 'result': None}",
|
|
"20:33:04 fwup -V garbage -> rc 1: fwup: Unrecognized archive format",
|
|
"20:33:04 fwup -V signed: own key rc 0, shipped key rc 1",
|
|
"20:33:04 POST /update/apply slot=b file=upload (no confirm_unsigned) -> 202 {'started': True}",
|
|
"20:33:05 apply result: {'ok': False, 'error': 'archive is not signed with the ForgeFIRM release key (confirm_unsigned=1 to apply anyway)'}",
|
|
"20:33:05 baseline: post: clean",
|
|
"20:33:05 result PASS"
|
|
],
|
|
"manifest_sha": "2d41354cdfb037d942fbe328e2ae0594efadd92e976d1c4512ca461b5f864a7e",
|
|
"message": "",
|
|
"result": "PASS",
|
|
"test": "update.slots-and-signature",
|
|
"ts": "2026-09-19T20:33:05Z"
|
|
},
|
|
"requires": [
|
|
"forgectrl.auth"
|
|
],
|
|
"satisfied": true,
|
|
"source_sha": "884045a920f6cfbae8f6ffcdc2f111c2c7c63ce216c87968036154a8e63a78fa",
|
|
"subsystem": "update",
|
|
"title": "Boot slots readable, unsigned and foreign-signed archives refused"
|
|
},
|
|
{
|
|
"always": false,
|
|
"covers": [
|
|
[
|
|
"forgectrl",
|
|
"src/update.c"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/update.h"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/relcheck.c"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/relcheck.h"
|
|
],
|
|
[
|
|
"ffboot",
|
|
"**"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/ui/panel.js"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/ui/index.html"
|
|
]
|
|
],
|
|
"fingerprint": "8f54b2070e66c35cecbdadd349cd9684a46195cdc5af6bc2f985b5505a675884",
|
|
"hardware": "api",
|
|
"id": "update.release-check",
|
|
"inherited": true,
|
|
"kind": "auto",
|
|
"record": {
|
|
"answers": [],
|
|
"campaign": "c-20260919210959-8780",
|
|
"duration_s": 1,
|
|
"evidence": {
|
|
"after_check": {
|
|
"available": true,
|
|
"bytes": 36839868,
|
|
"checked": 1789852386,
|
|
"current": "20260919210531 (dev)",
|
|
"detail": "",
|
|
"dismissed": false,
|
|
"new": true,
|
|
"version": "v0.0.5"
|
|
},
|
|
"baseline": {
|
|
"post": [],
|
|
"pre": []
|
|
},
|
|
"batch": {
|
|
"group": "unattended",
|
|
"ts": "2026-09-19T21:09:59Z"
|
|
},
|
|
"before": {
|
|
"available": false,
|
|
"bytes": 0,
|
|
"checked": 0,
|
|
"current": "20260919210531 (dev)",
|
|
"detail": "not checked yet",
|
|
"dismissed": false,
|
|
"new": false,
|
|
"version": ""
|
|
},
|
|
"fixture": {
|
|
"channels": [
|
|
"lid",
|
|
"interlock",
|
|
"button"
|
|
],
|
|
"hostname": "<REDACTED-1>",
|
|
"ip": "<IP-1>",
|
|
"released": []
|
|
}
|
|
},
|
|
"fingerprint": "8f54b2070e66c35cecbdadd349cd9684a46195cdc5af6bc2f985b5505a675884",
|
|
"image": "20260919210531 (dev)",
|
|
"log": [
|
|
"21:13:05 start update.release-check (auto, api) in campaign c-20260919210959-8780",
|
|
"21:13:06 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
|
|
"21:13:06 fixture: <REDACTED-1> at <IP-1> covers lid, interlock, button",
|
|
"21:13:06 queued by the unattended queue opened 2026-09-19T21:09:59Z",
|
|
"21:13:06 baseline: pre: clean",
|
|
"21:13:06 GET /update/release -> 200 {'available': False, 'version': '', 'current': '20260919210531 (dev)', 'new': False, 'checked': 0, 'dismissed': False, 'detail': 'not checked yet', 'bytes': 0}",
|
|
"21:13:06 POST /update/check -> 200 {'available': True, 'version': 'v0.0.5', 'current': '20260919210531 (dev)', 'new': True, 'checked': 1789852386, 'dismissed': False, 'detail': '', 'bytes': 36839868}",
|
|
"21:13:06 POST /update/dismiss version=<not a tag> -> 400 {'error': 'version is not a release tag'}",
|
|
"21:13:06 POST /update/dismiss version=v0.0.5 -> 200 {'available': True, 'version': 'v0.0.5', 'current': '20260919210531 (dev)', 'new': True, 'checked': 1789852386, 'dismissed': True, 'detail': '', 'bytes': 36839868}",
|
|
"21:13:06 POST /update/dismiss version= -> 200",
|
|
"21:13:06 dismissal put back to '' -> 200",
|
|
"21:13:06 baseline: post: clean",
|
|
"21:13:06 result PASS"
|
|
],
|
|
"manifest_sha": "5221f3466ae2497ca49fbb8cbe5d4eff49fab0f8c627190416aa2320948f69c4",
|
|
"message": "",
|
|
"result": "PASS",
|
|
"test": "update.release-check",
|
|
"ts": "2026-09-19T21:13:06Z"
|
|
},
|
|
"requires": [
|
|
"forgectrl.auth"
|
|
],
|
|
"satisfied": true,
|
|
"source_sha": "074756b60afaf91d752358b82428f6bad6d3405f904d7759a272b52d344dab28",
|
|
"subsystem": "update",
|
|
"title": "Release check answers from the releases API; the alert dismissal is per release"
|
|
},
|
|
{
|
|
"always": false,
|
|
"covers": [
|
|
[
|
|
"forgefirm-app",
|
|
"forgefirm-app/gfcloud.py"
|
|
],
|
|
[
|
|
"forgefirm-app",
|
|
"forgefirm-app/ffmachine.py"
|
|
],
|
|
[
|
|
"forgefirm-app",
|
|
"forgefirm-app/gfhome.conf.sample"
|
|
],
|
|
[
|
|
"python3-gfhardware",
|
|
"gfhardware/__init__.py"
|
|
],
|
|
[
|
|
"python3-gfhardware",
|
|
"gfhardware/_common.py"
|
|
],
|
|
[
|
|
"python3-gfhardware",
|
|
"gfhardware/id.py"
|
|
],
|
|
[
|
|
"python3-gfhardware",
|
|
"gfhardware/coolsvc.py"
|
|
],
|
|
[
|
|
"python3-gfutilities",
|
|
"gfutilities/__init__.py"
|
|
],
|
|
[
|
|
"python3-gfutilities",
|
|
"gfutilities/_common.py"
|
|
],
|
|
[
|
|
"python3-gfutilities",
|
|
"gfutilities/configuration.py"
|
|
],
|
|
[
|
|
"python3-gfutilities",
|
|
"gfutilities/device/__init__.py"
|
|
],
|
|
[
|
|
"python3-gfutilities",
|
|
"gfutilities/device/basemachine.py"
|
|
],
|
|
[
|
|
"python3-gfutilities",
|
|
"gfutilities/device/settings.py"
|
|
],
|
|
[
|
|
"python3-gfutilities",
|
|
"gfutilities/service/__init__.py"
|
|
],
|
|
[
|
|
"python3-gfutilities",
|
|
"gfutilities/service/dispatch.py"
|
|
],
|
|
[
|
|
"python3-gfutilities",
|
|
"gfutilities/service/websocket.py"
|
|
],
|
|
[
|
|
"python3-gfutilities",
|
|
"gfutilities/service/authentication.py"
|
|
],
|
|
[
|
|
"python3-gfutilities",
|
|
"gfutilities/service/gfuiservice.py"
|
|
],
|
|
[
|
|
"forgefirm-app",
|
|
"forgefirm-app/**"
|
|
],
|
|
[
|
|
"python3-gfhardware",
|
|
"gfhardware/**"
|
|
],
|
|
[
|
|
"python3-gfutilities",
|
|
"gfutilities/puls/**"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/super.c"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/main.c"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/cool.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/airflow.*"
|
|
],
|
|
[
|
|
"grblhal-glowforge",
|
|
"src/**"
|
|
]
|
|
],
|
|
"fingerprint": "7aa8d82a51dd6e4badafc95ff899aefc6efa1f07d54deb8d76e4205b2db3c66d",
|
|
"hardware": "api",
|
|
"id": "cloud.mode-switch",
|
|
"inherited": true,
|
|
"kind": "operator",
|
|
"record": {
|
|
"answers": [],
|
|
"campaign": "c-20260919202934-3d3a",
|
|
"duration_s": 102,
|
|
"evidence": {
|
|
"actions": [
|
|
{
|
|
"by": "fixture",
|
|
"channel": "lid",
|
|
"state": "open",
|
|
"took_s": 0.04,
|
|
"ts": "2026-09-19T20:48:00Z"
|
|
},
|
|
{
|
|
"by": "fixture",
|
|
"channel": "lid",
|
|
"state": "close",
|
|
"took_s": 0.35,
|
|
"ts": "2026-09-19T20:48:11Z"
|
|
}
|
|
],
|
|
"baseline": {
|
|
"post": [],
|
|
"pre": []
|
|
},
|
|
"batch": {
|
|
"group": "unattended",
|
|
"ts": "2026-09-19T20:29:34Z"
|
|
},
|
|
"cam_after": {
|
|
"buffers": "cached",
|
|
"cam": "lid",
|
|
"capture_allowed": true,
|
|
"clients": 0,
|
|
"convert": "cpu",
|
|
"encoder": "software",
|
|
"fps": 0.0,
|
|
"fps_cap": 0.0,
|
|
"frames": 0,
|
|
"h264": {
|
|
"active": false,
|
|
"clients": 0
|
|
},
|
|
"health": {
|
|
"captured": 492,
|
|
"corrupt": 0,
|
|
"restarts": 0
|
|
},
|
|
"hw_fps_skip": false,
|
|
"running": false,
|
|
"sensor": "OV5648",
|
|
"snapshot": {
|
|
"height": 1944,
|
|
"width": 2592
|
|
},
|
|
"stopped_by_lid": false,
|
|
"stream": {
|
|
"height": 972,
|
|
"width": 1296
|
|
}
|
|
},
|
|
"cam_before": {
|
|
"buffers": "uncached",
|
|
"cam": "lid",
|
|
"capture_allowed": true,
|
|
"clients": 0,
|
|
"convert": "cpu",
|
|
"encoder": "software",
|
|
"fps": 0.0,
|
|
"fps_cap": 0.0,
|
|
"frames": 0,
|
|
"h264": {
|
|
"active": false,
|
|
"clients": 0
|
|
},
|
|
"health": {
|
|
"captured": 0,
|
|
"corrupt": 0,
|
|
"restarts": 0
|
|
},
|
|
"hw_fps_skip": false,
|
|
"running": false,
|
|
"sensor": "OV5648",
|
|
"snapshot": {
|
|
"height": 1944,
|
|
"width": 2592
|
|
},
|
|
"stopped_by_lid": false,
|
|
"stream": {
|
|
"height": 972,
|
|
"width": 1296
|
|
}
|
|
},
|
|
"cam_during_cloud": {
|
|
"buffers": "uncached",
|
|
"cam": "lid",
|
|
"capture_allowed": false,
|
|
"clients": 0,
|
|
"convert": "cpu",
|
|
"encoder": "software",
|
|
"fps": 0.0,
|
|
"fps_cap": 0.0,
|
|
"frames": 0,
|
|
"h264": {
|
|
"active": false,
|
|
"clients": 0
|
|
},
|
|
"health": {
|
|
"captured": 0,
|
|
"corrupt": 0,
|
|
"restarts": 0
|
|
},
|
|
"hw_fps_skip": false,
|
|
"running": false,
|
|
"sensor": "OV5648",
|
|
"snapshot": {
|
|
"height": 1944,
|
|
"width": 2592
|
|
},
|
|
"stopped_by_lid": false,
|
|
"stream": {
|
|
"height": 972,
|
|
"width": 1296
|
|
}
|
|
},
|
|
"fixture": {
|
|
"channels": [
|
|
"lid",
|
|
"interlock",
|
|
"button"
|
|
],
|
|
"hostname": "<REDACTED-1>",
|
|
"ip": "<IP-1>",
|
|
"released": []
|
|
},
|
|
"gf_probe": {
|
|
"checked_at": 1789850879,
|
|
"latest_gf_version": "2.6.0-2228",
|
|
"tested_against_gf": "2.6.0-2228"
|
|
},
|
|
"gfhome_complete": "2026-09-19T20:49:30.197243+00:00 gfhome[4690] INFO gfhome:home homing complete (service quiet 10s, 8 motion windows)",
|
|
"grbl_state": "Idle",
|
|
"homed": true,
|
|
"homing_mode": "gfcloud",
|
|
"homing_s": 48.4,
|
|
"hunt": "2026-09-19T20:48:10.512606+00:00 gfcloud[4445] INFO basemachine:_finish_action hunt [1586907813]: finished with event \":completed\"",
|
|
"hunt_before_lid_open": false,
|
|
"hunt_gates": [
|
|
{
|
|
"accel_watch": "watch",
|
|
"armed": false,
|
|
"down_c": 24.57,
|
|
"fan_gates": {
|
|
"air_assist": {
|
|
"floor": 6093,
|
|
"reading": 2139,
|
|
"state": "idle"
|
|
},
|
|
"exhaust": {
|
|
"floor": 6416,
|
|
"reading": 0,
|
|
"state": "idle"
|
|
},
|
|
"intake_1": {
|
|
"floor": 2277,
|
|
"reading": 737,
|
|
"state": "idle"
|
|
},
|
|
"intake_2": {
|
|
"floor": 2277,
|
|
"reading": 730,
|
|
"state": "idle"
|
|
},
|
|
"purge": {
|
|
"floor": 345,
|
|
"reading": 629,
|
|
"state": "idle"
|
|
}
|
|
},
|
|
"fire_ok": true,
|
|
"fire_watch": "armed",
|
|
"gates_off": [],
|
|
"hold": false,
|
|
"limits": {
|
|
"air_assist_min_rpm": 6093,
|
|
"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": 6416,
|
|
"intake_min_rpm": 2277
|
|
},
|
|
"phase": "idle",
|
|
"quiet_hold": false,
|
|
"reason": "",
|
|
"report_age_s": 0.3,
|
|
"resume_ok": true,
|
|
"up_c": 24.57,
|
|
"verdict": "OK"
|
|
},
|
|
{
|
|
"accel_watch": "watch",
|
|
"armed": false,
|
|
"down_c": 24.26,
|
|
"fan_gates": {
|
|
"air_assist": {
|
|
"floor": 6093,
|
|
"reading": 2137,
|
|
"state": "idle"
|
|
},
|
|
"exhaust": {
|
|
"floor": 6416,
|
|
"reading": 0,
|
|
"state": "idle"
|
|
},
|
|
"intake_1": {
|
|
"floor": 2277,
|
|
"reading": 737,
|
|
"state": "idle"
|
|
},
|
|
"intake_2": {
|
|
"floor": 2277,
|
|
"reading": 730,
|
|
"state": "idle"
|
|
},
|
|
"purge": {
|
|
"floor": 345,
|
|
"reading": 630,
|
|
"state": "idle"
|
|
}
|
|
},
|
|
"fire_ok": true,
|
|
"fire_watch": "armed",
|
|
"gates_off": [],
|
|
"hold": false,
|
|
"limits": {
|
|
"air_assist_min_rpm": 6093,
|
|
"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": 6416,
|
|
"intake_min_rpm": 2277
|
|
},
|
|
"phase": "idle",
|
|
"quiet_hold": false,
|
|
"reason": "",
|
|
"report_age_s": 0.8,
|
|
"resume_ok": true,
|
|
"up_c": 24.73,
|
|
"verdict": "OK"
|
|
},
|
|
{
|
|
"accel_watch": "watch",
|
|
"armed": false,
|
|
"down_c": 24.26,
|
|
"fan_gates": {
|
|
"air_assist": {
|
|
"floor": 6093,
|
|
"reading": 2137,
|
|
"state": "idle"
|
|
},
|
|
"exhaust": {
|
|
"floor": 6416,
|
|
"reading": 0,
|
|
"state": "idle"
|
|
},
|
|
"intake_1": {
|
|
"floor": 2277,
|
|
"reading": 737,
|
|
"state": "idle"
|
|
},
|
|
"intake_2": {
|
|
"floor": 2277,
|
|
"reading": 730,
|
|
"state": "idle"
|
|
},
|
|
"purge": {
|
|
"floor": 345,
|
|
"reading": 630,
|
|
"state": "idle"
|
|
}
|
|
},
|
|
"fire_ok": true,
|
|
"fire_watch": "armed",
|
|
"gates_off": [],
|
|
"hold": false,
|
|
"limits": {
|
|
"air_assist_min_rpm": 6093,
|
|
"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": 6416,
|
|
"intake_min_rpm": 2277
|
|
},
|
|
"phase": "idle",
|
|
"quiet_hold": false,
|
|
"reason": "",
|
|
"report_age_s": 0.3,
|
|
"resume_ok": true,
|
|
"up_c": 24.73,
|
|
"verdict": "OK"
|
|
},
|
|
{
|
|
"accel_watch": "watch",
|
|
"armed": false,
|
|
"down_c": 23.24,
|
|
"fan_gates": {
|
|
"air_assist": {
|
|
"floor": 6093,
|
|
"reading": 2526,
|
|
"state": "idle"
|
|
},
|
|
"exhaust": {
|
|
"floor": 6416,
|
|
"reading": 0,
|
|
"state": "idle"
|
|
},
|
|
"intake_1": {
|
|
"floor": 2277,
|
|
"reading": 740,
|
|
"state": "idle"
|
|
},
|
|
"intake_2": {
|
|
"floor": 2277,
|
|
"reading": 737,
|
|
"state": "idle"
|
|
},
|
|
"purge": {
|
|
"floor": 345,
|
|
"reading": 628,
|
|
"state": "idle"
|
|
}
|
|
},
|
|
"fire_ok": true,
|
|
"fire_watch": "armed",
|
|
"gates_off": [],
|
|
"hold": false,
|
|
"limits": {
|
|
"air_assist_min_rpm": 6093,
|
|
"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": 6416,
|
|
"intake_min_rpm": 2277
|
|
},
|
|
"phase": "idle",
|
|
"quiet_hold": false,
|
|
"reason": "",
|
|
"report_age_s": 0.8,
|
|
"resume_ok": true,
|
|
"up_c": 23.55,
|
|
"verdict": "OK"
|
|
},
|
|
{
|
|
"accel_watch": "watch",
|
|
"armed": false,
|
|
"down_c": 23.24,
|
|
"fan_gates": {
|
|
"air_assist": {
|
|
"floor": 6093,
|
|
"reading": 2526,
|
|
"state": "idle"
|
|
},
|
|
"exhaust": {
|
|
"floor": 6416,
|
|
"reading": 0,
|
|
"state": "idle"
|
|
},
|
|
"intake_1": {
|
|
"floor": 2277,
|
|
"reading": 740,
|
|
"state": "idle"
|
|
},
|
|
"intake_2": {
|
|
"floor": 2277,
|
|
"reading": 737,
|
|
"state": "idle"
|
|
},
|
|
"purge": {
|
|
"floor": 345,
|
|
"reading": 628,
|
|
"state": "idle"
|
|
}
|
|
},
|
|
"fire_ok": true,
|
|
"fire_watch": "armed",
|
|
"gates_off": [],
|
|
"hold": false,
|
|
"limits": {
|
|
"air_assist_min_rpm": 6093,
|
|
"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": 6416,
|
|
"intake_min_rpm": 2277
|
|
},
|
|
"phase": "idle",
|
|
"quiet_hold": false,
|
|
"reason": "",
|
|
"report_age_s": 0.3,
|
|
"resume_ok": true,
|
|
"up_c": 23.55,
|
|
"verdict": "OK"
|
|
},
|
|
{
|
|
"accel_watch": "watch",
|
|
"armed": false,
|
|
"down_c": 23.24,
|
|
"fan_gates": {
|
|
"air_assist": {
|
|
"floor": 6093,
|
|
"reading": 2682,
|
|
"state": "idle"
|
|
},
|
|
"exhaust": {
|
|
"floor": 6416,
|
|
"reading": 0,
|
|
"state": "idle"
|
|
},
|
|
"intake_1": {
|
|
"floor": 2277,
|
|
"reading": 737,
|
|
"state": "idle"
|
|
},
|
|
"intake_2": {
|
|
"floor": 2277,
|
|
"reading": 736,
|
|
"state": "idle"
|
|
},
|
|
"purge": {
|
|
"floor": 345,
|
|
"reading": 628,
|
|
"state": "idle"
|
|
}
|
|
},
|
|
"fire_ok": true,
|
|
"fire_watch": "armed",
|
|
"gates_off": [],
|
|
"hold": false,
|
|
"limits": {
|
|
"air_assist_min_rpm": 6093,
|
|
"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": 6416,
|
|
"intake_min_rpm": 2277
|
|
},
|
|
"phase": "idle",
|
|
"quiet_hold": false,
|
|
"reason": "",
|
|
"report_age_s": 0.8,
|
|
"resume_ok": true,
|
|
"up_c": 23.4,
|
|
"verdict": "OK"
|
|
},
|
|
{
|
|
"accel_watch": "watch",
|
|
"armed": false,
|
|
"down_c": 23.24,
|
|
"fan_gates": {
|
|
"air_assist": {
|
|
"floor": 6093,
|
|
"reading": 2682,
|
|
"state": "idle"
|
|
},
|
|
"exhaust": {
|
|
"floor": 6416,
|
|
"reading": 0,
|
|
"state": "idle"
|
|
},
|
|
"intake_1": {
|
|
"floor": 2277,
|
|
"reading": 737,
|
|
"state": "idle"
|
|
},
|
|
"intake_2": {
|
|
"floor": 2277,
|
|
"reading": 736,
|
|
"state": "idle"
|
|
},
|
|
"purge": {
|
|
"floor": 345,
|
|
"reading": 628,
|
|
"state": "idle"
|
|
}
|
|
},
|
|
"fire_ok": true,
|
|
"fire_watch": "armed",
|
|
"gates_off": [],
|
|
"hold": false,
|
|
"limits": {
|
|
"air_assist_min_rpm": 6093,
|
|
"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": 6416,
|
|
"intake_min_rpm": 2277
|
|
},
|
|
"phase": "idle",
|
|
"quiet_hold": false,
|
|
"reason": "",
|
|
"report_age_s": 0.3,
|
|
"resume_ok": true,
|
|
"up_c": 23.4,
|
|
"verdict": "OK"
|
|
},
|
|
{
|
|
"accel_watch": "watch",
|
|
"armed": false,
|
|
"down_c": 23.4,
|
|
"fan_gates": {
|
|
"air_assist": {
|
|
"floor": 6093,
|
|
"reading": 2725,
|
|
"state": "idle"
|
|
},
|
|
"exhaust": {
|
|
"floor": 6416,
|
|
"reading": 0,
|
|
"state": "idle"
|
|
},
|
|
"intake_1": {
|
|
"floor": 2277,
|
|
"reading": 737,
|
|
"state": "idle"
|
|
},
|
|
"intake_2": {
|
|
"floor": 2277,
|
|
"reading": 729,
|
|
"state": "idle"
|
|
},
|
|
"purge": {
|
|
"floor": 345,
|
|
"reading": 627,
|
|
"state": "idle"
|
|
}
|
|
},
|
|
"fire_ok": true,
|
|
"fire_watch": "armed",
|
|
"gates_off": [],
|
|
"hold": false,
|
|
"limits": {
|
|
"air_assist_min_rpm": 6093,
|
|
"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": 6416,
|
|
"intake_min_rpm": 2277
|
|
},
|
|
"phase": "idle",
|
|
"quiet_hold": false,
|
|
"reason": "",
|
|
"report_age_s": 0.8,
|
|
"resume_ok": true,
|
|
"up_c": 23.4,
|
|
"verdict": "OK"
|
|
},
|
|
{
|
|
"accel_watch": "watch",
|
|
"armed": false,
|
|
"down_c": 23.4,
|
|
"fan_gates": {
|
|
"air_assist": {
|
|
"floor": 6093,
|
|
"reading": 2725,
|
|
"state": "idle"
|
|
},
|
|
"exhaust": {
|
|
"floor": 6416,
|
|
"reading": 0,
|
|
"state": "idle"
|
|
},
|
|
"intake_1": {
|
|
"floor": 2277,
|
|
"reading": 737,
|
|
"state": "idle"
|
|
},
|
|
"intake_2": {
|
|
"floor": 2277,
|
|
"reading": 729,
|
|
"state": "idle"
|
|
},
|
|
"purge": {
|
|
"floor": 345,
|
|
"reading": 627,
|
|
"state": "idle"
|
|
}
|
|
},
|
|
"fire_ok": true,
|
|
"fire_watch": "armed",
|
|
"gates_off": [],
|
|
"hold": false,
|
|
"limits": {
|
|
"air_assist_min_rpm": 6093,
|
|
"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": 6416,
|
|
"intake_min_rpm": 2277
|
|
},
|
|
"phase": "idle",
|
|
"quiet_hold": false,
|
|
"reason": "",
|
|
"report_age_s": 0.3,
|
|
"resume_ok": true,
|
|
"up_c": 23.4,
|
|
"verdict": "OK"
|
|
},
|
|
{
|
|
"accel_watch": "watch",
|
|
"armed": false,
|
|
"down_c": 23.08,
|
|
"fan_gates": {
|
|
"air_assist": {
|
|
"floor": 6093,
|
|
"reading": 2742,
|
|
"state": "idle"
|
|
},
|
|
"exhaust": {
|
|
"floor": 6416,
|
|
"reading": 0,
|
|
"state": "idle"
|
|
},
|
|
"intake_1": {
|
|
"floor": 2277,
|
|
"reading": 740,
|
|
"state": "idle"
|
|
},
|
|
"intake_2": {
|
|
"floor": 2277,
|
|
"reading": 729,
|
|
"state": "idle"
|
|
},
|
|
"purge": {
|
|
"floor": 345,
|
|
"reading": 628,
|
|
"state": "idle"
|
|
}
|
|
},
|
|
"fire_ok": true,
|
|
"fire_watch": "armed",
|
|
"gates_off": [],
|
|
"hold": false,
|
|
"limits": {
|
|
"air_assist_min_rpm": 6093,
|
|
"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": 6416,
|
|
"intake_min_rpm": 2277
|
|
},
|
|
"phase": "idle",
|
|
"quiet_hold": false,
|
|
"reason": "",
|
|
"report_age_s": 0.9,
|
|
"resume_ok": true,
|
|
"up_c": 23.47,
|
|
"verdict": "OK"
|
|
},
|
|
{
|
|
"accel_watch": "watch",
|
|
"armed": false,
|
|
"down_c": 23.08,
|
|
"fan_gates": {
|
|
"air_assist": {
|
|
"floor": 6093,
|
|
"reading": 2742,
|
|
"state": "idle"
|
|
},
|
|
"exhaust": {
|
|
"floor": 6416,
|
|
"reading": 0,
|
|
"state": "idle"
|
|
},
|
|
"intake_1": {
|
|
"floor": 2277,
|
|
"reading": 740,
|
|
"state": "idle"
|
|
},
|
|
"intake_2": {
|
|
"floor": 2277,
|
|
"reading": 729,
|
|
"state": "idle"
|
|
},
|
|
"purge": {
|
|
"floor": 345,
|
|
"reading": 628,
|
|
"state": "idle"
|
|
}
|
|
},
|
|
"fire_ok": true,
|
|
"fire_watch": "armed",
|
|
"gates_off": [],
|
|
"hold": false,
|
|
"limits": {
|
|
"air_assist_min_rpm": 6093,
|
|
"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": 6416,
|
|
"intake_min_rpm": 2277
|
|
},
|
|
"phase": "idle",
|
|
"quiet_hold": false,
|
|
"reason": "",
|
|
"report_age_s": 0.4,
|
|
"resume_ok": true,
|
|
"up_c": 23.47,
|
|
"verdict": "OK"
|
|
},
|
|
{
|
|
"accel_watch": "watch",
|
|
"armed": false,
|
|
"down_c": 23.01,
|
|
"fan_gates": {
|
|
"air_assist": {
|
|
"floor": 6093,
|
|
"reading": 2745,
|
|
"state": "idle"
|
|
},
|
|
"exhaust": {
|
|
"floor": 6416,
|
|
"reading": 0,
|
|
"state": "idle"
|
|
},
|
|
"intake_1": {
|
|
"floor": 2277,
|
|
"reading": 740,
|
|
"state": "idle"
|
|
},
|
|
"intake_2": {
|
|
"floor": 2277,
|
|
"reading": 729,
|
|
"state": "idle"
|
|
},
|
|
"purge": {
|
|
"floor": 345,
|
|
"reading": 627,
|
|
"state": "idle"
|
|
}
|
|
},
|
|
"fire_ok": true,
|
|
"fire_watch": "armed",
|
|
"gates_off": [],
|
|
"hold": false,
|
|
"limits": {
|
|
"air_assist_min_rpm": 6093,
|
|
"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": 6416,
|
|
"intake_min_rpm": 2277
|
|
},
|
|
"phase": "idle",
|
|
"quiet_hold": false,
|
|
"reason": "",
|
|
"report_age_s": 0.9,
|
|
"resume_ok": true,
|
|
"up_c": 23.32,
|
|
"verdict": "OK"
|
|
},
|
|
{
|
|
"accel_watch": "watch",
|
|
"armed": false,
|
|
"down_c": 23.01,
|
|
"fan_gates": {
|
|
"air_assist": {
|
|
"floor": 6093,
|
|
"reading": 2745,
|
|
"state": "idle"
|
|
},
|
|
"exhaust": {
|
|
"floor": 6416,
|
|
"reading": 0,
|
|
"state": "idle"
|
|
},
|
|
"intake_1": {
|
|
"floor": 2277,
|
|
"reading": 740,
|
|
"state": "idle"
|
|
},
|
|
"intake_2": {
|
|
"floor": 2277,
|
|
"reading": 729,
|
|
"state": "idle"
|
|
},
|
|
"purge": {
|
|
"floor": 345,
|
|
"reading": 627,
|
|
"state": "idle"
|
|
}
|
|
},
|
|
"fire_ok": true,
|
|
"fire_watch": "armed",
|
|
"gates_off": [],
|
|
"hold": false,
|
|
"limits": {
|
|
"air_assist_min_rpm": 6093,
|
|
"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": 6416,
|
|
"intake_min_rpm": 2277
|
|
},
|
|
"phase": "idle",
|
|
"quiet_hold": false,
|
|
"reason": "",
|
|
"report_age_s": 0.1,
|
|
"resume_ok": true,
|
|
"up_c": 23.32,
|
|
"verdict": "OK"
|
|
},
|
|
{
|
|
"accel_watch": "watch",
|
|
"armed": false,
|
|
"down_c": 23.32,
|
|
"fan_gates": {
|
|
"air_assist": {
|
|
"floor": 6093,
|
|
"reading": 2744,
|
|
"state": "unjudged"
|
|
},
|
|
"exhaust": {
|
|
"floor": 6416,
|
|
"reading": 0,
|
|
"state": "unjudged"
|
|
},
|
|
"intake_1": {
|
|
"floor": 2277,
|
|
"reading": 737,
|
|
"state": "unjudged"
|
|
},
|
|
"intake_2": {
|
|
"floor": 2277,
|
|
"reading": 736,
|
|
"state": "unjudged"
|
|
},
|
|
"purge": {
|
|
"floor": 345,
|
|
"reading": 629,
|
|
"state": "grace"
|
|
}
|
|
},
|
|
"fire_ok": true,
|
|
"fire_watch": "armed",
|
|
"gates_off": [],
|
|
"hold": false,
|
|
"limits": {
|
|
"air_assist_min_rpm": 6093,
|
|
"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": 6416,
|
|
"intake_min_rpm": 2277
|
|
},
|
|
"phase": "run",
|
|
"quiet_hold": false,
|
|
"reason": "",
|
|
"report_age_s": 0.6,
|
|
"resume_ok": true,
|
|
"up_c": 23.32,
|
|
"verdict": "OK"
|
|
},
|
|
{
|
|
"accel_watch": "watch",
|
|
"armed": false,
|
|
"down_c": 23.32,
|
|
"fan_gates": {
|
|
"air_assist": {
|
|
"floor": 6093,
|
|
"reading": 2744,
|
|
"state": "unjudged"
|
|
},
|
|
"exhaust": {
|
|
"floor": 6416,
|
|
"reading": 0,
|
|
"state": "unjudged"
|
|
},
|
|
"intake_1": {
|
|
"floor": 2277,
|
|
"reading": 737,
|
|
"state": "unjudged"
|
|
},
|
|
"intake_2": {
|
|
"floor": 2277,
|
|
"reading": 736,
|
|
"state": "unjudged"
|
|
},
|
|
"purge": {
|
|
"floor": 345,
|
|
"reading": 629,
|
|
"state": "grace"
|
|
}
|
|
},
|
|
"fire_ok": true,
|
|
"fire_watch": "armed",
|
|
"gates_off": [],
|
|
"hold": false,
|
|
"limits": {
|
|
"air_assist_min_rpm": 6093,
|
|
"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": 6416,
|
|
"intake_min_rpm": 2277
|
|
},
|
|
"phase": "run",
|
|
"quiet_hold": false,
|
|
"reason": "",
|
|
"report_age_s": 0.4,
|
|
"resume_ok": true,
|
|
"up_c": 23.32,
|
|
"verdict": "OK"
|
|
},
|
|
{
|
|
"accel_watch": "watch",
|
|
"armed": false,
|
|
"down_c": 23.01,
|
|
"fan_gates": {
|
|
"air_assist": {
|
|
"floor": 6093,
|
|
"reading": 2750,
|
|
"state": "unjudged"
|
|
},
|
|
"exhaust": {
|
|
"floor": 6416,
|
|
"reading": 0,
|
|
"state": "unjudged"
|
|
},
|
|
"intake_1": {
|
|
"floor": 2277,
|
|
"reading": 740,
|
|
"state": "unjudged"
|
|
},
|
|
"intake_2": {
|
|
"floor": 2277,
|
|
"reading": 729,
|
|
"state": "unjudged"
|
|
},
|
|
"purge": {
|
|
"floor": 345,
|
|
"reading": 627,
|
|
"state": "grace"
|
|
}
|
|
},
|
|
"fire_ok": true,
|
|
"fire_watch": "armed",
|
|
"gates_off": [],
|
|
"hold": false,
|
|
"limits": {
|
|
"air_assist_min_rpm": 6093,
|
|
"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": 6416,
|
|
"intake_min_rpm": 2277
|
|
},
|
|
"phase": "run",
|
|
"quiet_hold": false,
|
|
"reason": "",
|
|
"report_age_s": 0.9,
|
|
"resume_ok": true,
|
|
"up_c": 23.4,
|
|
"verdict": "OK"
|
|
},
|
|
{
|
|
"accel_watch": "watch",
|
|
"armed": false,
|
|
"down_c": 23.01,
|
|
"fan_gates": {
|
|
"air_assist": {
|
|
"floor": 6093,
|
|
"reading": 2750,
|
|
"state": "unjudged"
|
|
},
|
|
"exhaust": {
|
|
"floor": 6416,
|
|
"reading": 0,
|
|
"state": "unjudged"
|
|
},
|
|
"intake_1": {
|
|
"floor": 2277,
|
|
"reading": 740,
|
|
"state": "unjudged"
|
|
},
|
|
"intake_2": {
|
|
"floor": 2277,
|
|
"reading": 729,
|
|
"state": "unjudged"
|
|
},
|
|
"purge": {
|
|
"floor": 345,
|
|
"reading": 627,
|
|
"state": "grace"
|
|
}
|
|
},
|
|
"fire_ok": true,
|
|
"fire_watch": "armed",
|
|
"gates_off": [],
|
|
"hold": false,
|
|
"limits": {
|
|
"air_assist_min_rpm": 6093,
|
|
"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": 6416,
|
|
"intake_min_rpm": 2277
|
|
},
|
|
"phase": "run",
|
|
"quiet_hold": false,
|
|
"reason": "",
|
|
"report_age_s": 0.4,
|
|
"resume_ok": true,
|
|
"up_c": 23.4,
|
|
"verdict": "OK"
|
|
},
|
|
{
|
|
"accel_watch": "watch",
|
|
"armed": false,
|
|
"down_c": 24.65,
|
|
"fan_gates": {
|
|
"air_assist": {
|
|
"floor": 6093,
|
|
"reading": 2508,
|
|
"state": "idle"
|
|
},
|
|
"exhaust": {
|
|
"floor": 6416,
|
|
"reading": 0,
|
|
"state": "idle"
|
|
},
|
|
"intake_1": {
|
|
"floor": 2277,
|
|
"reading": 740,
|
|
"state": "idle"
|
|
},
|
|
"intake_2": {
|
|
"floor": 2277,
|
|
"reading": 729,
|
|
"state": "idle"
|
|
},
|
|
"purge": {
|
|
"floor": 345,
|
|
"reading": 628,
|
|
"state": "idle"
|
|
}
|
|
},
|
|
"fire_ok": true,
|
|
"fire_watch": "armed",
|
|
"gates_off": [],
|
|
"hold": false,
|
|
"limits": {
|
|
"air_assist_min_rpm": 6093,
|
|
"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": 6416,
|
|
"intake_min_rpm": 2277
|
|
},
|
|
"phase": "idle",
|
|
"quiet_hold": false,
|
|
"reason": "",
|
|
"report_age_s": 0.9,
|
|
"resume_ok": true,
|
|
"up_c": 24.73,
|
|
"verdict": "OK"
|
|
},
|
|
{
|
|
"accel_watch": "watch",
|
|
"armed": false,
|
|
"down_c": 24.65,
|
|
"fan_gates": {
|
|
"air_assist": {
|
|
"floor": 6093,
|
|
"reading": 2508,
|
|
"state": "idle"
|
|
},
|
|
"exhaust": {
|
|
"floor": 6416,
|
|
"reading": 0,
|
|
"state": "idle"
|
|
},
|
|
"intake_1": {
|
|
"floor": 2277,
|
|
"reading": 740,
|
|
"state": "idle"
|
|
},
|
|
"intake_2": {
|
|
"floor": 2277,
|
|
"reading": 729,
|
|
"state": "idle"
|
|
},
|
|
"purge": {
|
|
"floor": 345,
|
|
"reading": 628,
|
|
"state": "idle"
|
|
}
|
|
},
|
|
"fire_ok": true,
|
|
"fire_watch": "armed",
|
|
"gates_off": [],
|
|
"hold": false,
|
|
"limits": {
|
|
"air_assist_min_rpm": 6093,
|
|
"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": 6416,
|
|
"intake_min_rpm": 2277
|
|
},
|
|
"phase": "idle",
|
|
"quiet_hold": false,
|
|
"reason": "",
|
|
"report_age_s": 0.4,
|
|
"resume_ok": true,
|
|
"up_c": 24.73,
|
|
"verdict": "OK"
|
|
}
|
|
],
|
|
"hunt_line": "INFO basemachine:_finish_action hunt [1586907813]: finished with event \":completed\"",
|
|
"lens_homed": true,
|
|
"lid_lamp": {
|
|
"after_cloud": "236",
|
|
"before": "236"
|
|
},
|
|
"mode": {
|
|
"detail": "already in grbl mode",
|
|
"found": "grbl",
|
|
"needs": "grbl",
|
|
"ok": true,
|
|
"switched": false
|
|
},
|
|
"mode_after": {
|
|
"controller": "running",
|
|
"gated": false,
|
|
"local": false,
|
|
"mode": "grbl",
|
|
"motion": "verified",
|
|
"pid": 4676,
|
|
"why": ""
|
|
},
|
|
"mode_before": {
|
|
"controller": "running",
|
|
"gated": false,
|
|
"local": false,
|
|
"mode": "grbl",
|
|
"motion": "verified",
|
|
"pid": 4408,
|
|
"why": ""
|
|
},
|
|
"mode_cloud": {
|
|
"controller": "running",
|
|
"gated": false,
|
|
"local": false,
|
|
"mode": "cloud",
|
|
"motion": "verified",
|
|
"pid": 4445,
|
|
"why": ""
|
|
},
|
|
"motions_after_lid_close": 4,
|
|
"refusals_before_hunt_end": 0,
|
|
"session": [
|
|
"2026-09-19T20:47:59.374575+00:00 gfcloud[4445] INFO authentication:authenticate_machine SUCCESS",
|
|
"2026-09-19T20:48:00.483086+00:00 gfcloud[4445] INFO websocket:ws_connect ESTABLISHED"
|
|
]
|
|
},
|
|
"fingerprint": "7aa8d82a51dd6e4badafc95ff899aefc6efa1f07d54deb8d76e4205b2db3c66d",
|
|
"image": "20260919202327 (dev)",
|
|
"log": [
|
|
"20:47:55 start cloud.mode-switch (operator, api) in campaign c-20260919202934-3d3a",
|
|
"20:47:56 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
|
|
"20:47:56 fixture: <REDACTED-1> at <IP-1> covers lid, interlock, button",
|
|
"20:47:56 fixture: running unattended (no prompt can be answered)",
|
|
"20:47:56 queued by the unattended queue opened 2026-09-19T20:29:34Z",
|
|
"20:47:56 baseline: pre: clean",
|
|
"20:47:56 mode: test needs grbl - already in grbl mode",
|
|
"20:47:56 mode before: {'mode': 'grbl', 'controller': 'running', 'pid': 4408, 'motion': 'verified', 'gated': False, 'local': False, 'why': ''}",
|
|
"20:48:00 POST /mode controller=cloud -> 200 {'mode': 'cloud', 'controller': 'running', 'pid': 4445, 'motion': 'verified', 'gated': False, 'local': False, 'why': ''}",
|
|
"20:48:00 mode after switch: {'mode': 'cloud', 'controller': 'running', 'pid': 4445, 'motion': 'verified', 'gated': False, 'local': False, 'why': ''}",
|
|
"20:48:00 ACT lid open (fixture)",
|
|
"20:48:00 ACT lid open: done after 0.0 s",
|
|
"20:48:02 gfcloud: gfcloud[4445] INFO authentication:authenticate_machine SUCCESS",
|
|
"20:48:02 gfcloud: gfcloud[4445] INFO websocket:ws_connect ESTABLISHED",
|
|
"20:48:02 cloud session established: True; firmware probe: {'latest_gf_version': '2.6.0-2228', 'tested_against_gf': '2.6.0-2228', 'checked_at': 1789850879}",
|
|
"20:48:11 hunt: 19 status samples, 4 in phase run; verdicts ['OK']",
|
|
"20:48:11 hunt with the lid open: INFO basemachine:_finish_action hunt [1586907813]: finished with event \":completed\" (lens homed)",
|
|
"20:48:11 ACT lid close (fixture)",
|
|
"20:48:12 ACT lid close: done after 0.4 s",
|
|
"20:48:26 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
|
|
"20:48:44 cloud mode stays up; the machine is quiet",
|
|
"20:48:44 4 service motion(s) completed after the lid closed",
|
|
"20:48:46 POST /mode controller=grbl -> 200 {'mode': 'grbl', 'controller': 'running', 'pid': 4676, 'motion': 'verified', 'gated': False, 'local': False, 'why': ''}",
|
|
"20:48:46 mode after switch back: {'mode': 'grbl', 'controller': 'running', 'pid': 4676, 'motion': 'verified', 'gated': False, 'local': False, 'why': ''}",
|
|
"20:48:49 grbl state after: Idle",
|
|
"20:48:49 position counters re-zeroed at the starting position; the baseline expects (0,0,0) at the end",
|
|
"20:48:49 head displacement since the switch: X 0.000 Y 0.000 mm",
|
|
"20:48:57 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
|
|
"20:49:27 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
|
|
"20:49:38 homing: homed=True after 48.4 s (kernel idle, grbl Idle)",
|
|
"20:49:38 gfhome: 2026-09-19T20:49:30.197243+00:00 gfhome[4690] INFO gfhome:home homing complete (service quiet 10s, 8 motion windows)",
|
|
"20:49:38 position counters re-zeroed at the starting position; the baseline expects (0,0,0) at the end",
|
|
"20:49:38 $H acknowledged: [MSG:] | ok",
|
|
"20:49:38 PASS: grbl -> cloud (session, hunt with the lid open, lens homed, airflow unjudged) -> grbl (port open, Idle), then $H homed in 48.4 s",
|
|
"20:49:38 baseline: post: clean",
|
|
"20:49:38 result PASS"
|
|
],
|
|
"manifest_sha": "2d41354cdfb037d942fbe328e2ae0594efadd92e976d1c4512ca461b5f864a7e",
|
|
"message": "",
|
|
"result": "PASS",
|
|
"test": "cloud.mode-switch",
|
|
"ts": "2026-09-19T20:49:38Z"
|
|
},
|
|
"requires": [
|
|
"forgectrl.auth",
|
|
"motion.pacing"
|
|
],
|
|
"satisfied": true,
|
|
"source_sha": "6485ee291de5c73809479efa04f78c5cdbfcba3730086cb9d8616708beaf1c1e",
|
|
"subsystem": "cloud",
|
|
"title": "Controller mode switch grbl -> cloud -> grbl, the connect-time hunt with the lid open, and the web-service homing"
|
|
},
|
|
{
|
|
"always": false,
|
|
"covers": [
|
|
[
|
|
"forgefirm-app",
|
|
"forgefirm-app/gfcloud.py"
|
|
],
|
|
[
|
|
"forgefirm-app",
|
|
"forgefirm-app/ffmachine.py"
|
|
],
|
|
[
|
|
"forgefirm-app",
|
|
"forgefirm-app/gfhome.conf.sample"
|
|
],
|
|
[
|
|
"python3-gfhardware",
|
|
"gfhardware/__init__.py"
|
|
],
|
|
[
|
|
"python3-gfhardware",
|
|
"gfhardware/_common.py"
|
|
],
|
|
[
|
|
"python3-gfhardware",
|
|
"gfhardware/id.py"
|
|
],
|
|
[
|
|
"python3-gfhardware",
|
|
"gfhardware/coolsvc.py"
|
|
],
|
|
[
|
|
"python3-gfutilities",
|
|
"gfutilities/__init__.py"
|
|
],
|
|
[
|
|
"python3-gfutilities",
|
|
"gfutilities/_common.py"
|
|
],
|
|
[
|
|
"python3-gfutilities",
|
|
"gfutilities/configuration.py"
|
|
],
|
|
[
|
|
"python3-gfutilities",
|
|
"gfutilities/device/__init__.py"
|
|
],
|
|
[
|
|
"python3-gfutilities",
|
|
"gfutilities/device/basemachine.py"
|
|
],
|
|
[
|
|
"python3-gfutilities",
|
|
"gfutilities/device/settings.py"
|
|
],
|
|
[
|
|
"python3-gfutilities",
|
|
"gfutilities/service/__init__.py"
|
|
],
|
|
[
|
|
"python3-gfutilities",
|
|
"gfutilities/service/dispatch.py"
|
|
],
|
|
[
|
|
"python3-gfutilities",
|
|
"gfutilities/service/websocket.py"
|
|
],
|
|
[
|
|
"python3-gfutilities",
|
|
"gfutilities/service/authentication.py"
|
|
],
|
|
[
|
|
"python3-gfutilities",
|
|
"gfutilities/service/gfuiservice.py"
|
|
],
|
|
[
|
|
"python3-gfutilities",
|
|
"gfutilities/device/emulator.py"
|
|
],
|
|
[
|
|
"python3-gfutilities",
|
|
"examples/**"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/super.c"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/main.c"
|
|
]
|
|
],
|
|
"fingerprint": "419210db78329b4a05af32abf0ae5463c652863a9fc97e9faa2e5692b26bdb52",
|
|
"hardware": "api",
|
|
"id": "cloud.service-protocol",
|
|
"inherited": true,
|
|
"kind": "operator",
|
|
"record": {
|
|
"answers": [
|
|
{
|
|
"answer": "Yes",
|
|
"question": "Does the app show the print complete?",
|
|
"ts": "2026-09-19T21:59:53Z"
|
|
}
|
|
],
|
|
"campaign": "c-20260919215024-c402",
|
|
"duration_s": 53,
|
|
"evidence": {
|
|
"baseline": {
|
|
"post": [],
|
|
"pre": []
|
|
},
|
|
"batch": {
|
|
"group": "attended",
|
|
"ts": "2026-09-19T21:50:24Z"
|
|
},
|
|
"downloads": [
|
|
"2026-09-19_215921_hunt.info",
|
|
"2026-09-19_215924_motion.info",
|
|
"2026-09-19_215935_motion.info",
|
|
"2026-09-19_215936_motion.info",
|
|
"2026-09-19_215939_print.info"
|
|
],
|
|
"fixture": {
|
|
"channels": [
|
|
"lid",
|
|
"interlock",
|
|
"button"
|
|
],
|
|
"hostname": "<REDACTED-1>",
|
|
"ip": "<IP-1>",
|
|
"released": []
|
|
},
|
|
"header_stfr": 10000,
|
|
"header_tags": 134,
|
|
"hunt": "INFO basemachine:_finish_action hunt [1586928198]: finished with event \":completed\"",
|
|
"images_uploaded": 3,
|
|
"print": "INFO basemachine:_finish_action print [1586928279]: finished with event \":completed\"",
|
|
"pulse": "INFO websocket:fetch_motion pulse data is gzip-compressed, 405 byte body"
|
|
},
|
|
"fingerprint": "419210db78329b4a05af32abf0ae5463c652863a9fc97e9faa2e5692b26bdb52",
|
|
"image": "20260919214619 (dev)",
|
|
"log": [
|
|
"21:59:14 start cloud.service-protocol (operator, api) in campaign c-20260919215024-c402",
|
|
"21:59:15 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
|
|
"21:59:15 fixture: <REDACTED-1> at <IP-1> covers lid, interlock, button",
|
|
"21:59:15 queued by the attended queue opened 2026-09-19T21:50:24Z",
|
|
"21:59:15 baseline: pre: clean",
|
|
"21:59:15 grbl mode: switching to cloud as the emulator",
|
|
"21:59:18 controller mode changed to cloud for the operator; the baseline keeps it",
|
|
"21:59:21 emulator session established: gfcloud[3071] INFO authentication:authenticate_machine SUCCESS; gfcloud[3071] INFO websocket:ws_connect ESTABLISHED",
|
|
"21:59:23 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:59:41 print: INFO basemachine:_finish_action print [1586928279]: finished with event \":completed\"; 3 images uploaded; INFO websocket:fetch_motion pulse data is gzip-compressed, 405 byte body",
|
|
"21:59:41 the job's header: 134 tags, STfr 10000",
|
|
"21:59:41 PROMPT: Does the app show the print complete?",
|
|
"21:59:45 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
|
|
"21:59:53 ANSWER: Yes",
|
|
"21:59:53 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:59:53 cloud mode: restarting the client with the machine, no hunt (was pid 3071)",
|
|
"22:00:08 the machine is back under the real client, no hunt",
|
|
"22:00:08 baseline: post: clean",
|
|
"22:00:08 result PASS"
|
|
],
|
|
"manifest_sha": "5dbf1f84b9aea447033e38de4b79d4fe8af2309af74367f0befbe9429d44d170",
|
|
"message": "",
|
|
"result": "PASS",
|
|
"test": "cloud.service-protocol",
|
|
"ts": "2026-09-19T22:00:08Z"
|
|
},
|
|
"requires": [
|
|
"forgectrl.auth"
|
|
],
|
|
"satisfied": true,
|
|
"source_sha": "2e02eac6a4cfdb171b4e8722b5bbecb382449f22564a9acaf38cb39e46c6e7b9",
|
|
"subsystem": "cloud",
|
|
"title": "The service protocol, answered by the emulator in this machine's identity"
|
|
},
|
|
{
|
|
"always": false,
|
|
"covers": [
|
|
[
|
|
"forgefirm-app",
|
|
"forgefirm-app/gfcloud.py"
|
|
],
|
|
[
|
|
"forgefirm-app",
|
|
"forgefirm-app/ffmachine.py"
|
|
],
|
|
[
|
|
"forgefirm-app",
|
|
"forgefirm-app/gfhome.conf.sample"
|
|
],
|
|
[
|
|
"python3-gfhardware",
|
|
"gfhardware/__init__.py"
|
|
],
|
|
[
|
|
"python3-gfhardware",
|
|
"gfhardware/_common.py"
|
|
],
|
|
[
|
|
"python3-gfhardware",
|
|
"gfhardware/id.py"
|
|
],
|
|
[
|
|
"python3-gfhardware",
|
|
"gfhardware/coolsvc.py"
|
|
],
|
|
[
|
|
"python3-gfutilities",
|
|
"gfutilities/__init__.py"
|
|
],
|
|
[
|
|
"python3-gfutilities",
|
|
"gfutilities/_common.py"
|
|
],
|
|
[
|
|
"python3-gfutilities",
|
|
"gfutilities/configuration.py"
|
|
],
|
|
[
|
|
"python3-gfutilities",
|
|
"gfutilities/device/__init__.py"
|
|
],
|
|
[
|
|
"python3-gfutilities",
|
|
"gfutilities/device/basemachine.py"
|
|
],
|
|
[
|
|
"python3-gfutilities",
|
|
"gfutilities/device/settings.py"
|
|
],
|
|
[
|
|
"python3-gfutilities",
|
|
"gfutilities/service/__init__.py"
|
|
],
|
|
[
|
|
"python3-gfutilities",
|
|
"gfutilities/service/dispatch.py"
|
|
],
|
|
[
|
|
"python3-gfutilities",
|
|
"gfutilities/service/websocket.py"
|
|
],
|
|
[
|
|
"python3-gfhardware",
|
|
"gfhardware/machine.py"
|
|
],
|
|
[
|
|
"python3-gfhardware",
|
|
"gfhardware/feeder.py"
|
|
],
|
|
[
|
|
"python3-gfhardware",
|
|
"gfhardware/cnc.py"
|
|
],
|
|
[
|
|
"python3-gfhardware",
|
|
"gfhardware/switches.py"
|
|
],
|
|
[
|
|
"python3-gfhardware",
|
|
"gfhardware/input/**"
|
|
],
|
|
[
|
|
"python3-gfhardware",
|
|
"gfhardware/src/evdev.c"
|
|
],
|
|
[
|
|
"python3-gfhardware",
|
|
"gfhardware/z_axis.py"
|
|
],
|
|
[
|
|
"python3-gfhardware",
|
|
"gfhardware/leds.py"
|
|
],
|
|
[
|
|
"python3-gfhardware",
|
|
"gfhardware/cooling.py"
|
|
],
|
|
[
|
|
"python3-gfutilities",
|
|
"gfutilities/service/offline.py"
|
|
],
|
|
[
|
|
"python3-gfutilities",
|
|
"gfutilities/puls/**"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/super.c"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/main.c"
|
|
]
|
|
],
|
|
"fingerprint": "5499c466b4eadb93058135e2ca5821ff7caee5637140942ec38a889821407e83",
|
|
"hardware": "api",
|
|
"id": "cloud.lid-interlock-abort",
|
|
"inherited": true,
|
|
"kind": "live",
|
|
"record": {
|
|
"answers": [],
|
|
"campaign": "c-20260919215024-c402",
|
|
"duration_s": 68,
|
|
"evidence": {
|
|
"actions": [
|
|
{
|
|
"by": "fixture",
|
|
"channel": "button",
|
|
"state": "press",
|
|
"took_s": 6.01,
|
|
"ts": "2026-09-19T22:00:23Z"
|
|
},
|
|
{
|
|
"by": "fixture",
|
|
"channel": "lid",
|
|
"state": "open",
|
|
"took_s": 0.04,
|
|
"ts": "2026-09-19T22:00:29Z"
|
|
},
|
|
{
|
|
"by": "fixture",
|
|
"channel": "lid",
|
|
"state": "close",
|
|
"took_s": 0.32,
|
|
"ts": "2026-09-19T22:00:41Z"
|
|
},
|
|
{
|
|
"by": "fixture",
|
|
"channel": "button",
|
|
"state": "press",
|
|
"took_s": 4.51,
|
|
"ts": "2026-09-19T22:00:51Z"
|
|
},
|
|
{
|
|
"by": "fixture",
|
|
"channel": "interlock",
|
|
"state": "open",
|
|
"took_s": 0.05,
|
|
"ts": "2026-09-19T22:00:56Z"
|
|
},
|
|
{
|
|
"by": "fixture",
|
|
"channel": "lid",
|
|
"state": "open",
|
|
"took_s": 0.04,
|
|
"ts": "2026-09-19T22:00:57Z"
|
|
},
|
|
{
|
|
"by": "fixture",
|
|
"channel": "lid",
|
|
"state": "close",
|
|
"took_s": 0.33,
|
|
"ts": "2026-09-19T22:01:08Z"
|
|
},
|
|
{
|
|
"by": "fixture",
|
|
"channel": "interlock",
|
|
"state": "close",
|
|
"took_s": 0.39,
|
|
"ts": "2026-09-19T22:01:08Z"
|
|
}
|
|
],
|
|
"baseline": {
|
|
"post": [],
|
|
"pre": []
|
|
},
|
|
"batch": {
|
|
"group": "attended",
|
|
"ts": "2026-09-19T21:50:24Z"
|
|
},
|
|
"edge_to_stop_ms": 4.0,
|
|
"events_print1": [
|
|
"print:starting",
|
|
"print:download:completed",
|
|
"button:pressed",
|
|
"print:warmup:starting",
|
|
"button:released",
|
|
"print:running",
|
|
"lid:opened",
|
|
"print:return_to_home:succeeded",
|
|
"print:cancelled",
|
|
"lid:closed"
|
|
],
|
|
"events_print2": [
|
|
"print:starting",
|
|
"print:download:completed",
|
|
"button:pressed",
|
|
"print:warmup:starting",
|
|
"button:released",
|
|
"print:running",
|
|
"lid:opened",
|
|
"print:return_to_home:succeeded",
|
|
"print:cancelled",
|
|
"lid:closed",
|
|
"print:starting",
|
|
"print:download:completed",
|
|
"button:pressed",
|
|
"print:warmup:starting",
|
|
"button:released",
|
|
"print:running",
|
|
"print:return_to_home:succeeded",
|
|
"lid:opened",
|
|
"print:cancelled",
|
|
"lid:closed"
|
|
],
|
|
"fixture": {
|
|
"channels": [
|
|
"lid",
|
|
"interlock",
|
|
"button"
|
|
],
|
|
"hostname": "<REDACTED-1>",
|
|
"ip": "<IP-1>",
|
|
"released": []
|
|
},
|
|
"interlock_armed_after": false,
|
|
"interlock_counters_after_park": [
|
|
0,
|
|
0,
|
|
0
|
|
],
|
|
"interlock_latch_locked": true,
|
|
"interlock_log": {
|
|
"interlock opened mid-run; stopping motion": "WARNING machine:_run_loop interlock opened mid-run; stopping motion",
|
|
"print finished": "INFO basemachine:_finish_action print [9002]: finished with event \":cancelled\"",
|
|
"return home complete": "INFO machine:_return_home return home complete",
|
|
"start return home": "INFO machine:_return_home start return home"
|
|
},
|
|
"interlock_ok_after_pull": false,
|
|
"jobs": {
|
|
"abort.puls": {
|
|
"compressed": false,
|
|
"payload_bytes": 486344,
|
|
"seconds": 48.6
|
|
}
|
|
},
|
|
"lid_armed_after": false,
|
|
"lid_counters_after_park": [
|
|
0,
|
|
0,
|
|
0
|
|
],
|
|
"lid_latch_locked": true,
|
|
"lid_log": {
|
|
"lid opened": "INFO machine:_switch_event lid opened",
|
|
"lid opened mid-run; stopping motion": "WARNING machine:_run_loop lid opened mid-run; stopping motion",
|
|
"print finished": "INFO basemachine:_finish_action print [9001]: finished with event \":cancelled\"",
|
|
"return home complete": "INFO machine:_return_home return home complete",
|
|
"start return home": "INFO machine:_return_home start return home"
|
|
},
|
|
"operator": {
|
|
"ack_live": true,
|
|
"ts": "2026-09-19T22:00:09Z"
|
|
},
|
|
"restored": {
|
|
"interlock_ok": true,
|
|
"lid": true
|
|
},
|
|
"switches_at_return": {
|
|
"interlock_ok": false,
|
|
"lid": false
|
|
}
|
|
},
|
|
"fingerprint": "5499c466b4eadb93058135e2ca5821ff7caee5637140942ec38a889821407e83",
|
|
"image": "20260919214619 (dev)",
|
|
"log": [
|
|
"22:00:08 start cloud.lid-interlock-abort (live, api) in campaign c-20260919215024-c402",
|
|
"22:00:09 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
|
|
"22:00:09 fixture: <REDACTED-1> at <IP-1> covers lid, interlock, button",
|
|
"22:00:09 queued by the attended queue opened 2026-09-19T21:50:24Z",
|
|
"22:00:09 baseline: pre: clean",
|
|
"22:00:09 cloud mode: restarting the client offline (was pid 3135)",
|
|
"22:00:13 offline service up: INFO offline:open OFFLINE service: no web session; listening on /run/gfcloud-offline.sock",
|
|
"22:00:21 job abort.puls: 486344 payload bytes, 49 s at STfr 10000",
|
|
"22:00:23 ACT button press (fixture)",
|
|
"22:00:29 ACT button press: done after 6.0 s",
|
|
"22:00:29 ACT lid open (fixture)",
|
|
"22:00:29 ACT lid open: done after 0.0 s",
|
|
"22:00:39 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
|
|
"22:00:41 [lid] lid opened: seen",
|
|
"22:00:41 [lid] lid opened mid-run; stopping motion: seen",
|
|
"22:00:41 [lid] start return home: seen",
|
|
"22:00:41 [lid] return home complete: seen",
|
|
"22:00:41 [lid] print finished: seen",
|
|
"22:00:41 lid edge -> stop: 4.0 ms",
|
|
"22:00:41 [lid] kernel counters after the park: [0, 0, 0]",
|
|
"22:00:41 ACT lid close (fixture)",
|
|
"22:00:41 ACT lid close: done after 0.3 s",
|
|
"22:00:50 cloud mode stays up; the machine is quiet",
|
|
"22:00:51 ACT button press (fixture)",
|
|
"22:00:56 ACT button press: done after 4.5 s",
|
|
"22:00:56 ACT interlock open (fixture)",
|
|
"22:00:56 ACT interlock open: done after 0.0 s",
|
|
"22:00:57 ACT lid open (fixture)",
|
|
"22:00:57 ACT lid open: done after 0.0 s",
|
|
"22:01:07 [interlock] interlock opened mid-run; stopping motion: seen",
|
|
"22:01:07 [interlock] start return home: seen",
|
|
"22:01:07 [interlock] return home complete: seen",
|
|
"22:01:07 [interlock] print finished: seen",
|
|
"22:01:08 [interlock] kernel counters after the park: [0, 0, 0]",
|
|
"22:01:08 ACT lid close (fixture)",
|
|
"22:01:08 ACT lid close: done after 0.3 s",
|
|
"22:01:08 ACT interlock close (fixture)",
|
|
"22:01:08 ACT interlock close: done after 0.4 s",
|
|
"22:01:11 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
|
|
"22:01:17 cloud mode stays up; the machine is quiet",
|
|
"22:01:17 PASS: lid open -> stop in 4.0 ms and park with the lid open; interlock open -> the same tail with the park running through a lid edge; both prints ':cancelled'",
|
|
"22:01:17 offline jobs removed from /tmp/forgetest",
|
|
"22:01:17 baseline: post: clean",
|
|
"22:01:17 result PASS"
|
|
],
|
|
"manifest_sha": "5dbf1f84b9aea447033e38de4b79d4fe8af2309af74367f0befbe9429d44d170",
|
|
"message": "",
|
|
"result": "PASS",
|
|
"test": "cloud.lid-interlock-abort",
|
|
"ts": "2026-09-19T22:01:17Z"
|
|
},
|
|
"requires": [
|
|
"laser.emission-witness"
|
|
],
|
|
"satisfied": true,
|
|
"source_sha": "67d6b201b620bd22a927662a4d025e19850aa93014151d357635a5fcabe7fbeb",
|
|
"subsystem": "cloud",
|
|
"title": "Lid and interlock each abort a cloud print; the park ignores an open lid"
|
|
},
|
|
{
|
|
"always": false,
|
|
"covers": [
|
|
[
|
|
"forgefirm-app",
|
|
"forgefirm-app/gfcloud.py"
|
|
],
|
|
[
|
|
"forgefirm-app",
|
|
"forgefirm-app/ffmachine.py"
|
|
],
|
|
[
|
|
"forgefirm-app",
|
|
"forgefirm-app/gfhome.conf.sample"
|
|
],
|
|
[
|
|
"python3-gfhardware",
|
|
"gfhardware/__init__.py"
|
|
],
|
|
[
|
|
"python3-gfhardware",
|
|
"gfhardware/_common.py"
|
|
],
|
|
[
|
|
"python3-gfhardware",
|
|
"gfhardware/id.py"
|
|
],
|
|
[
|
|
"python3-gfhardware",
|
|
"gfhardware/coolsvc.py"
|
|
],
|
|
[
|
|
"python3-gfutilities",
|
|
"gfutilities/__init__.py"
|
|
],
|
|
[
|
|
"python3-gfutilities",
|
|
"gfutilities/_common.py"
|
|
],
|
|
[
|
|
"python3-gfutilities",
|
|
"gfutilities/configuration.py"
|
|
],
|
|
[
|
|
"python3-gfutilities",
|
|
"gfutilities/device/__init__.py"
|
|
],
|
|
[
|
|
"python3-gfutilities",
|
|
"gfutilities/device/basemachine.py"
|
|
],
|
|
[
|
|
"python3-gfutilities",
|
|
"gfutilities/device/settings.py"
|
|
],
|
|
[
|
|
"python3-gfutilities",
|
|
"gfutilities/service/__init__.py"
|
|
],
|
|
[
|
|
"python3-gfutilities",
|
|
"gfutilities/service/dispatch.py"
|
|
],
|
|
[
|
|
"python3-gfutilities",
|
|
"gfutilities/service/websocket.py"
|
|
],
|
|
[
|
|
"python3-gfhardware",
|
|
"gfhardware/machine.py"
|
|
],
|
|
[
|
|
"python3-gfhardware",
|
|
"gfhardware/feeder.py"
|
|
],
|
|
[
|
|
"python3-gfhardware",
|
|
"gfhardware/cnc.py"
|
|
],
|
|
[
|
|
"python3-gfhardware",
|
|
"gfhardware/switches.py"
|
|
],
|
|
[
|
|
"python3-gfhardware",
|
|
"gfhardware/input/**"
|
|
],
|
|
[
|
|
"python3-gfhardware",
|
|
"gfhardware/src/evdev.c"
|
|
],
|
|
[
|
|
"python3-gfhardware",
|
|
"gfhardware/z_axis.py"
|
|
],
|
|
[
|
|
"python3-gfhardware",
|
|
"gfhardware/leds.py"
|
|
],
|
|
[
|
|
"python3-gfhardware",
|
|
"gfhardware/cooling.py"
|
|
],
|
|
[
|
|
"python3-gfutilities",
|
|
"gfutilities/service/offline.py"
|
|
],
|
|
[
|
|
"python3-gfutilities",
|
|
"gfutilities/puls/**"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/super.c"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/main.c"
|
|
]
|
|
],
|
|
"fingerprint": "be2ac7af7e2cffba2b6acdee8eee8a534859f651e0833fe176e709d992a8f6e5",
|
|
"hardware": "api",
|
|
"id": "cloud.lid-during-button-wait",
|
|
"inherited": true,
|
|
"kind": "operator",
|
|
"record": {
|
|
"answers": [],
|
|
"campaign": "c-20260919210959-8780",
|
|
"duration_s": 39,
|
|
"evidence": {
|
|
"actions": [
|
|
{
|
|
"by": "fixture",
|
|
"channel": "lid",
|
|
"state": "open",
|
|
"took_s": 0.05,
|
|
"ts": "2026-09-19T21:13:24Z"
|
|
},
|
|
{
|
|
"by": "fixture",
|
|
"channel": "lid",
|
|
"state": "close",
|
|
"took_s": 0.04,
|
|
"ts": "2026-09-19T21:13:38Z"
|
|
}
|
|
],
|
|
"armed_after": false,
|
|
"baseline": {
|
|
"post": [],
|
|
"pre": []
|
|
},
|
|
"batch": {
|
|
"group": "unattended",
|
|
"ts": "2026-09-19T21:09:59Z"
|
|
},
|
|
"button_dark": false,
|
|
"events": [
|
|
"print:starting",
|
|
"print:download:completed",
|
|
"lid:opened",
|
|
"print:return_to_home:succeeded",
|
|
"print:cancelled",
|
|
"lid:closed"
|
|
],
|
|
"fixture": {
|
|
"channels": [
|
|
"lid",
|
|
"interlock",
|
|
"button"
|
|
],
|
|
"hostname": "<REDACTED-1>",
|
|
"ip": "<IP-1>",
|
|
"released": []
|
|
},
|
|
"jobs": {
|
|
"wait.puls": {
|
|
"compressed": true,
|
|
"payload_bytes": 35015348,
|
|
"seconds": 3501.5
|
|
}
|
|
},
|
|
"latch_locked": true,
|
|
"log": {
|
|
"button wait lid opened - relocking the laser": true,
|
|
"print finished": "INFO basemachine:_finish_action print [9003]: finished with event \":cancelled\""
|
|
},
|
|
"program_total_after": {
|
|
"first": 0,
|
|
"later": 0
|
|
},
|
|
"runs_started_after_wait": 0,
|
|
"streaming_after": 0
|
|
},
|
|
"fingerprint": "be2ac7af7e2cffba2b6acdee8eee8a534859f651e0833fe176e709d992a8f6e5",
|
|
"image": "20260919210531 (dev)",
|
|
"log": [
|
|
"21:13:06 start cloud.lid-during-button-wait (operator, api) in campaign c-20260919210959-8780",
|
|
"21:13:07 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
|
|
"21:13:07 fixture: <REDACTED-1> at <IP-1> covers lid, interlock, button",
|
|
"21:13:07 fixture: running unattended (no prompt can be answered)",
|
|
"21:13:07 queued by the unattended queue opened 2026-09-19T21:09:59Z",
|
|
"21:13:07 baseline: pre: clean",
|
|
"21:13:07 grbl mode: switching to cloud offline",
|
|
"21:13:10 controller mode changed to cloud for the operator; the baseline keeps it",
|
|
"21:13:11 offline service up: INFO offline:open OFFLINE service: no web session; listening on /run/gfcloud-offline.sock",
|
|
"21:13:22 job wait.puls: 35015348 payload bytes, 3502 s at STfr 10000 (gzip)",
|
|
"21:13:24 ACT lid open (fixture)",
|
|
"21:13:24 ACT lid open: done after 0.0 s",
|
|
"21:13:38 ACT lid close (fixture)",
|
|
"21:13:38 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
|
|
"21:13:38 ACT lid close: done after 0.0 s",
|
|
"21:13:46 cloud mode stays up; the machine is quiet",
|
|
"21:13:46 PASS: lid open at the button prompt canceled the print; latch locked, armed=false, button dark, ring empty with the feed stopped",
|
|
"21:13:46 offline jobs removed from /tmp/forgetest",
|
|
"21:13:46 baseline: post: clean",
|
|
"21:13:46 result PASS"
|
|
],
|
|
"manifest_sha": "5221f3466ae2497ca49fbb8cbe5d4eff49fab0f8c627190416aa2320948f69c4",
|
|
"message": "",
|
|
"result": "PASS",
|
|
"test": "cloud.lid-during-button-wait",
|
|
"ts": "2026-09-19T21:13:46Z"
|
|
},
|
|
"requires": [],
|
|
"satisfied": true,
|
|
"source_sha": "21a067294380f4795a7dc2cb29d06aa96c6785da270a9908476ec28fef7877fd",
|
|
"subsystem": "cloud",
|
|
"title": "Lid open at the cloud button prompt cancels the print"
|
|
},
|
|
{
|
|
"always": false,
|
|
"covers": [
|
|
[
|
|
"forgefirm-app",
|
|
"forgefirm-app/gfcloud.py"
|
|
],
|
|
[
|
|
"forgefirm-app",
|
|
"forgefirm-app/ffmachine.py"
|
|
],
|
|
[
|
|
"forgefirm-app",
|
|
"forgefirm-app/gfhome.conf.sample"
|
|
],
|
|
[
|
|
"python3-gfhardware",
|
|
"gfhardware/__init__.py"
|
|
],
|
|
[
|
|
"python3-gfhardware",
|
|
"gfhardware/_common.py"
|
|
],
|
|
[
|
|
"python3-gfhardware",
|
|
"gfhardware/id.py"
|
|
],
|
|
[
|
|
"python3-gfhardware",
|
|
"gfhardware/coolsvc.py"
|
|
],
|
|
[
|
|
"python3-gfutilities",
|
|
"gfutilities/__init__.py"
|
|
],
|
|
[
|
|
"python3-gfutilities",
|
|
"gfutilities/_common.py"
|
|
],
|
|
[
|
|
"python3-gfutilities",
|
|
"gfutilities/configuration.py"
|
|
],
|
|
[
|
|
"python3-gfutilities",
|
|
"gfutilities/device/__init__.py"
|
|
],
|
|
[
|
|
"python3-gfutilities",
|
|
"gfutilities/device/basemachine.py"
|
|
],
|
|
[
|
|
"python3-gfutilities",
|
|
"gfutilities/device/settings.py"
|
|
],
|
|
[
|
|
"python3-gfutilities",
|
|
"gfutilities/service/__init__.py"
|
|
],
|
|
[
|
|
"python3-gfutilities",
|
|
"gfutilities/service/dispatch.py"
|
|
],
|
|
[
|
|
"python3-gfutilities",
|
|
"gfutilities/service/websocket.py"
|
|
],
|
|
[
|
|
"python3-gfhardware",
|
|
"gfhardware/machine.py"
|
|
],
|
|
[
|
|
"python3-gfhardware",
|
|
"gfhardware/feeder.py"
|
|
],
|
|
[
|
|
"python3-gfhardware",
|
|
"gfhardware/cnc.py"
|
|
],
|
|
[
|
|
"python3-gfhardware",
|
|
"gfhardware/switches.py"
|
|
],
|
|
[
|
|
"python3-gfhardware",
|
|
"gfhardware/input/**"
|
|
],
|
|
[
|
|
"python3-gfhardware",
|
|
"gfhardware/src/evdev.c"
|
|
],
|
|
[
|
|
"python3-gfhardware",
|
|
"gfhardware/z_axis.py"
|
|
],
|
|
[
|
|
"python3-gfhardware",
|
|
"gfhardware/leds.py"
|
|
],
|
|
[
|
|
"python3-gfhardware",
|
|
"gfhardware/cooling.py"
|
|
],
|
|
[
|
|
"python3-gfutilities",
|
|
"gfutilities/service/offline.py"
|
|
],
|
|
[
|
|
"python3-gfutilities",
|
|
"gfutilities/puls/**"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/super.c"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/main.c"
|
|
],
|
|
[
|
|
"python3-gfhardware",
|
|
"gfhardware/coolsvc.py"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/cool.*"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/main.c"
|
|
]
|
|
],
|
|
"fingerprint": "2381f0476b8fa6d083eab224d66bc440390e2ec6254880d9f0d22b71fe41d603",
|
|
"hardware": "api",
|
|
"id": "cloud.dark-print",
|
|
"inherited": true,
|
|
"kind": "operator",
|
|
"record": {
|
|
"answers": [],
|
|
"campaign": "c-20260919210959-8780",
|
|
"duration_s": 53,
|
|
"evidence": {
|
|
"actions": [
|
|
{
|
|
"by": "fixture",
|
|
"channel": "button",
|
|
"state": "press",
|
|
"took_s": 4.52,
|
|
"ts": "2026-09-19T21:13:48Z"
|
|
}
|
|
],
|
|
"armed_after": false,
|
|
"baseline": {
|
|
"post": [],
|
|
"pre": []
|
|
},
|
|
"batch": {
|
|
"group": "unattended",
|
|
"ts": "2026-09-19T21:09:59Z"
|
|
},
|
|
"events": [
|
|
"print:starting",
|
|
"print:download:completed",
|
|
"button:pressed",
|
|
"print:warmup:starting",
|
|
"button:released",
|
|
"print:running",
|
|
"print:return_to_home:succeeded",
|
|
"print:completed"
|
|
],
|
|
"fixture": {
|
|
"channels": [
|
|
"lid",
|
|
"interlock",
|
|
"button"
|
|
],
|
|
"hostname": "<REDACTED-1>",
|
|
"ip": "<IP-1>",
|
|
"released": []
|
|
},
|
|
"jobs": {
|
|
"dark.puls": {
|
|
"compressed": false,
|
|
"payload_bytes": 324236,
|
|
"seconds": 32.4
|
|
}
|
|
},
|
|
"latch_locked_after": true,
|
|
"latch_locked_at_button": true,
|
|
"latch_locked_in_run": false,
|
|
"print finished": "INFO basemachine:_finish_action print [9005]: finished with event \":completed\""
|
|
},
|
|
"fingerprint": "2381f0476b8fa6d083eab224d66bc440390e2ec6254880d9f0d22b71fe41d603",
|
|
"image": "20260919210531 (dev)",
|
|
"log": [
|
|
"21:13:46 start cloud.dark-print (operator, api) in campaign c-20260919210959-8780",
|
|
"21:13:47 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
|
|
"21:13:47 fixture: <REDACTED-1> at <IP-1> covers lid, interlock, button",
|
|
"21:13:47 fixture: running unattended (no prompt can be answered)",
|
|
"21:13:47 queued by the unattended queue opened 2026-09-19T21:09:59Z",
|
|
"21:13:47 baseline: pre: clean",
|
|
"21:13:47 the offline service is already up (pid 1595) - reusing it",
|
|
"21:13:47 job dark.puls: 324236 payload bytes, 32 s at STfr 10000",
|
|
"21:13:48 ACT button press (fixture)",
|
|
"21:13:53 ACT button press: done after 4.5 s",
|
|
"21:14:17 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
|
|
"21:14:35 PASS: locked at the button, unlocked for the run, locked after it; the print completed",
|
|
"21:14:35 offline jobs removed from /tmp/forgetest",
|
|
"21:14:40 baseline: cool: smoke/armed=False/hold=False ended on its own after 3 s; the engine's own post-job work, not a leftover",
|
|
"21:14:40 baseline: post: clean",
|
|
"21:14:40 result PASS"
|
|
],
|
|
"manifest_sha": "5221f3466ae2497ca49fbb8cbe5d4eff49fab0f8c627190416aa2320948f69c4",
|
|
"message": "",
|
|
"result": "PASS",
|
|
"test": "cloud.dark-print",
|
|
"ts": "2026-09-19T21:14:40Z"
|
|
},
|
|
"requires": [
|
|
"cloud.lid-during-button-wait",
|
|
"cooling.floor-and-warm-up"
|
|
],
|
|
"satisfied": true,
|
|
"source_sha": "9ca1cc4dc8e304d3f482345c863192082829e6ed97a92ce46a731f2bf131537b",
|
|
"subsystem": "cloud",
|
|
"title": "A dark cloud print: the latch locked until the run, unlocked for it, locked after it"
|
|
},
|
|
{
|
|
"always": false,
|
|
"covers": [
|
|
[
|
|
"forgefirm-app",
|
|
"forgefirm-app/gfcloud.py"
|
|
],
|
|
[
|
|
"forgefirm-app",
|
|
"forgefirm-app/ffmachine.py"
|
|
],
|
|
[
|
|
"forgefirm-app",
|
|
"forgefirm-app/gfhome.conf.sample"
|
|
],
|
|
[
|
|
"python3-gfhardware",
|
|
"gfhardware/__init__.py"
|
|
],
|
|
[
|
|
"python3-gfhardware",
|
|
"gfhardware/_common.py"
|
|
],
|
|
[
|
|
"python3-gfhardware",
|
|
"gfhardware/id.py"
|
|
],
|
|
[
|
|
"python3-gfhardware",
|
|
"gfhardware/coolsvc.py"
|
|
],
|
|
[
|
|
"python3-gfutilities",
|
|
"gfutilities/__init__.py"
|
|
],
|
|
[
|
|
"python3-gfutilities",
|
|
"gfutilities/_common.py"
|
|
],
|
|
[
|
|
"python3-gfutilities",
|
|
"gfutilities/configuration.py"
|
|
],
|
|
[
|
|
"python3-gfutilities",
|
|
"gfutilities/device/__init__.py"
|
|
],
|
|
[
|
|
"python3-gfutilities",
|
|
"gfutilities/device/basemachine.py"
|
|
],
|
|
[
|
|
"python3-gfutilities",
|
|
"gfutilities/device/settings.py"
|
|
],
|
|
[
|
|
"python3-gfutilities",
|
|
"gfutilities/service/__init__.py"
|
|
],
|
|
[
|
|
"python3-gfutilities",
|
|
"gfutilities/service/dispatch.py"
|
|
],
|
|
[
|
|
"python3-gfutilities",
|
|
"gfutilities/service/websocket.py"
|
|
],
|
|
[
|
|
"python3-gfhardware",
|
|
"gfhardware/machine.py"
|
|
],
|
|
[
|
|
"python3-gfhardware",
|
|
"gfhardware/feeder.py"
|
|
],
|
|
[
|
|
"python3-gfhardware",
|
|
"gfhardware/cnc.py"
|
|
],
|
|
[
|
|
"python3-gfhardware",
|
|
"gfhardware/switches.py"
|
|
],
|
|
[
|
|
"python3-gfhardware",
|
|
"gfhardware/input/**"
|
|
],
|
|
[
|
|
"python3-gfhardware",
|
|
"gfhardware/src/evdev.c"
|
|
],
|
|
[
|
|
"python3-gfhardware",
|
|
"gfhardware/z_axis.py"
|
|
],
|
|
[
|
|
"python3-gfhardware",
|
|
"gfhardware/leds.py"
|
|
],
|
|
[
|
|
"python3-gfhardware",
|
|
"gfhardware/cooling.py"
|
|
],
|
|
[
|
|
"python3-gfutilities",
|
|
"gfutilities/service/offline.py"
|
|
],
|
|
[
|
|
"python3-gfutilities",
|
|
"gfutilities/puls/**"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/super.c"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/main.c"
|
|
],
|
|
[
|
|
"python3-gfhardware",
|
|
"gfhardware/coolsvc.py"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/cool.*"
|
|
]
|
|
],
|
|
"fingerprint": "5b925127b5cea9775e02714360f71c964bbaabfe5962ee70d89acfdccdafd7b0",
|
|
"hardware": "api",
|
|
"id": "cloud.verdict-refuse",
|
|
"inherited": true,
|
|
"kind": "operator",
|
|
"record": {
|
|
"answers": [],
|
|
"campaign": "c-20260919210959-8780",
|
|
"duration_s": 82,
|
|
"evidence": {
|
|
"actions": [
|
|
{
|
|
"by": "fixture",
|
|
"channel": "button",
|
|
"state": "press",
|
|
"took_s": 4.26,
|
|
"ts": "2026-09-19T21:14:42Z"
|
|
}
|
|
],
|
|
"armed_after": false,
|
|
"baseline": {
|
|
"post": [],
|
|
"pre": []
|
|
},
|
|
"batch": {
|
|
"group": "unattended",
|
|
"ts": "2026-09-19T21:09:59Z"
|
|
},
|
|
"events": [
|
|
"print:starting",
|
|
"print:download:completed",
|
|
"button:pressed",
|
|
"print:warmup:starting",
|
|
"button:released",
|
|
"print:return_to_home:succeeded",
|
|
"print:cancelled"
|
|
],
|
|
"fixture": {
|
|
"channels": [
|
|
"lid",
|
|
"interlock",
|
|
"button"
|
|
],
|
|
"hostname": "<REDACTED-1>",
|
|
"ip": "<IP-1>",
|
|
"released": []
|
|
},
|
|
"gate": 33.6,
|
|
"hold_s": 60,
|
|
"jobs": {
|
|
"refuse.puls": {
|
|
"compressed": false,
|
|
"payload_bytes": 324236,
|
|
"seconds": 32.4
|
|
}
|
|
},
|
|
"latch_locked_at_button": true,
|
|
"latch_samples": {
|
|
"n": 31,
|
|
"unlocked": 0
|
|
},
|
|
"orig": {
|
|
"cloud_hold_max_s": "",
|
|
"cool_temp_min": "",
|
|
"cool_temp_start": ""
|
|
},
|
|
"print finished": "INFO basemachine:_finish_action print [9006]: finished with event \":cancelled\""
|
|
},
|
|
"fingerprint": "5b925127b5cea9775e02714360f71c964bbaabfe5962ee70d89acfdccdafd7b0",
|
|
"image": "20260919210531 (dev)",
|
|
"log": [
|
|
"21:14:40 start cloud.verdict-refuse (operator, api) in campaign c-20260919210959-8780",
|
|
"21:14:41 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
|
|
"21:14:41 fixture: <REDACTED-1> at <IP-1> covers lid, interlock, button",
|
|
"21:14:41 fixture: running unattended (no prompt can be answered)",
|
|
"21:14:41 queued by the unattended queue opened 2026-09-19T21:09:59Z",
|
|
"21:14:41 baseline: pre: clean",
|
|
"21:14:41 the offline service is already up (pid 1595) - reusing it",
|
|
"21:14:41 job refuse.puls: 324236 payload bytes, 32 s at STfr 10000",
|
|
"21:14:42 ACT button press (fixture)",
|
|
"21:14:46 ACT button press: done after 4.3 s",
|
|
"21:14:46 NOTICE: The engine holds the print; the client gives up at the bound. Do nothing.",
|
|
"21:15:11 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
|
|
"21:15:41 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
|
|
"21:15:56 PASS: held 60 s with the latch locked throughout, then canceled at the bound",
|
|
"21:15:56 restore: POST /settings {'cool_temp_min': '', 'cool_temp_start': '', 'cloud_hold_max_s': ''} -> 200",
|
|
"21:15:56 offline jobs removed from /tmp/forgetest",
|
|
"21:16:03 baseline: cool: smoke/armed=False/hold=False ended on its own after 6 s; the engine's own post-job work, not a leftover",
|
|
"21:16:03 baseline: post: clean",
|
|
"21:16:03 result PASS"
|
|
],
|
|
"manifest_sha": "5221f3466ae2497ca49fbb8cbe5d4eff49fab0f8c627190416aa2320948f69c4",
|
|
"message": "",
|
|
"result": "PASS",
|
|
"test": "cloud.verdict-refuse",
|
|
"ts": "2026-09-19T21:16:03Z"
|
|
},
|
|
"requires": [
|
|
"cloud.dark-print"
|
|
],
|
|
"satisfied": true,
|
|
"source_sha": "5fda9102990f3b27c6f59e336c91b79625f67dc657f600af67d9e43b1fefd24c",
|
|
"subsystem": "cloud",
|
|
"title": "A cloud print held by the engine past the bound is canceled with the latch never unlocked"
|
|
},
|
|
{
|
|
"always": false,
|
|
"covers": [
|
|
[
|
|
"forgefirm-app",
|
|
"**"
|
|
],
|
|
[
|
|
"python3-gfhardware",
|
|
"**"
|
|
],
|
|
[
|
|
"python3-gfutilities",
|
|
"**"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/super.c"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/main.c"
|
|
]
|
|
],
|
|
"fingerprint": "7aa31b51f17cf67c7deeae3c8a561785fe4305ead724e7b75da003bafd8df577",
|
|
"hardware": "api",
|
|
"id": "cloud.pause-resume",
|
|
"inherited": true,
|
|
"kind": "live",
|
|
"record": {
|
|
"answers": [
|
|
{
|
|
"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-19T22:02:10Z"
|
|
},
|
|
{
|
|
"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-19T22:03:05Z"
|
|
}
|
|
],
|
|
"campaign": "c-20260919215024-c402",
|
|
"duration_s": 118,
|
|
"evidence": {
|
|
"actions": [
|
|
{
|
|
"by": "fixture",
|
|
"channel": "button",
|
|
"state": "press",
|
|
"took_s": 1.01,
|
|
"ts": "2026-09-19T22:02:38Z"
|
|
},
|
|
{
|
|
"by": "fixture",
|
|
"channel": "button",
|
|
"state": "press",
|
|
"took_s": 1.26,
|
|
"ts": "2026-09-19T22:02:39Z"
|
|
}
|
|
],
|
|
"armed_after_resume": true,
|
|
"baseline": {
|
|
"post": [],
|
|
"pre": []
|
|
},
|
|
"batch": {
|
|
"group": "attended",
|
|
"ts": "2026-09-19T21:50:24Z"
|
|
},
|
|
"effective_limits": [
|
|
"2026-09-19T22:02:24.907061+00:00 forgectrl[464] 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 6416 rpm, intake",
|
|
"2026-09-19T22:02:25.907037+00:00 forgectrl[464] 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 6416 rpm, intake "
|
|
],
|
|
"fixture": {
|
|
"channels": [
|
|
"lid",
|
|
"interlock",
|
|
"button"
|
|
],
|
|
"hostname": "<REDACTED-1>",
|
|
"ip": "<IP-1>",
|
|
"released": []
|
|
},
|
|
"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-19T22:02:46.356569+00:00 gfcloud[3405] INFO machine:_dwell cool down: holding 10.0 s",
|
|
"warm up": "2026-09-19T22:02:34.241257+00:00 gfcloud[3405] INFO machine:_dwell warm up: holding 3.0 s"
|
|
},
|
|
"log": {
|
|
"button pressed mid-run; pausing": true,
|
|
"button pressed while paused": true,
|
|
"paused at": true,
|
|
"resuming (laser lead": true
|
|
},
|
|
"log_end": {
|
|
"print finished": "INFO basemachine:_finish_action print [1586929008]: finished with event \":completed\"",
|
|
"return home complete": true
|
|
},
|
|
"operator": {
|
|
"ack_live": true,
|
|
"ts": "2026-09-19T22:01:17Z"
|
|
},
|
|
"progress_total": 46020,
|
|
"relock_or_cancel_lines": 0
|
|
},
|
|
"fingerprint": "7aa31b51f17cf67c7deeae3c8a561785fe4305ead724e7b75da003bafd8df577",
|
|
"image": "20260919214619 (dev)",
|
|
"log": [
|
|
"22:01:17 start cloud.pause-resume (live, api) in campaign c-20260919215024-c402",
|
|
"22:01:17 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
|
|
"22:01:17 fixture: <REDACTED-1> at <IP-1> covers lid, interlock, button",
|
|
"22:01:17 queued by the attended queue opened 2026-09-19T21:50:24Z",
|
|
"22:01:17 baseline: pre: clean",
|
|
"22:01:17 the running client is the offline service: restarting it with the service",
|
|
"22:01:17 cloud mode: restarting the cloud client for a fresh connect (was pid 3211)",
|
|
"22:01:24 cloud session established (pid 3405)",
|
|
"22:01:33 connect-time hunt: INFO basemachine:_finish_action hunt [1586928727]: finished with event \":completed\"",
|
|
"22:01:48 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
|
|
"22:02:06 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.",
|
|
"22:02:10 ANSWER: Done",
|
|
"22:02:19 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
|
|
"22:02:38 ACT button press (fixture)",
|
|
"22:02:39 ACT button press: done after 1.0 s",
|
|
"22:02:39 ACT button press (fixture)",
|
|
"22:02:40 ACT button press: done after 1.3 s",
|
|
"22:02:40 armed after the resume: True",
|
|
"22:02:51 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
|
|
"22:02:57 warm-up: 2026-09-19T22:02:34.241257+00:00 gfcloud[3405] INFO machine:_dwell warm up: holding 3.0 s",
|
|
"22:02:57 rest: 2026-09-19T22:02:46.356569+00:00 gfcloud[3405] INFO machine:_dwell cool down: holding 10.0 s",
|
|
"22:02:57 progress reported against 46020 bytes",
|
|
"22:02:57 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?",
|
|
"22:03:05 ANSWER: Yes",
|
|
"22:03:05 job limits from the header (the print's): air_assist_min_rpm=116 coolant_max_c=33.0 coolant_min_c=5.0",
|
|
"22:03:05 engine effective limits: 2026-09-19T22:02:24.907061+00:00 forgectrl[464] 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 6416 rpm, intake",
|
|
"22:03:16 cloud mode stays up; the machine is quiet",
|
|
"22:03:16 PASS: button pause/resume mid-print, warm-up and rest observed, progress reported, the job's limits passed through, job completed and parked",
|
|
"22:03:16 baseline: post: clean",
|
|
"22:03:16 result PASS"
|
|
],
|
|
"manifest_sha": "5dbf1f84b9aea447033e38de4b79d4fe8af2309af74367f0befbe9429d44d170",
|
|
"message": "",
|
|
"result": "PASS",
|
|
"test": "cloud.pause-resume",
|
|
"ts": "2026-09-19T22:03:16Z"
|
|
},
|
|
"requires": [
|
|
"laser.emission-witness"
|
|
],
|
|
"satisfied": true,
|
|
"source_sha": "60462c76de97bbcc146df32fe0b24592a64ef7eb7853ad4a76577c836fa7b48f",
|
|
"subsystem": "cloud",
|
|
"title": "Button pauses and resumes a cloud print (factory backtrack + lead)"
|
|
},
|
|
{
|
|
"always": false,
|
|
"covers": [
|
|
[
|
|
"forgefirm-app",
|
|
"forgefirm-app/gfcloud.py"
|
|
],
|
|
[
|
|
"forgefirm-app",
|
|
"forgefirm-app/ffmachine.py"
|
|
],
|
|
[
|
|
"forgefirm-app",
|
|
"forgefirm-app/gfhome.conf.sample"
|
|
],
|
|
[
|
|
"python3-gfhardware",
|
|
"gfhardware/__init__.py"
|
|
],
|
|
[
|
|
"python3-gfhardware",
|
|
"gfhardware/_common.py"
|
|
],
|
|
[
|
|
"python3-gfhardware",
|
|
"gfhardware/id.py"
|
|
],
|
|
[
|
|
"python3-gfhardware",
|
|
"gfhardware/coolsvc.py"
|
|
],
|
|
[
|
|
"python3-gfutilities",
|
|
"gfutilities/__init__.py"
|
|
],
|
|
[
|
|
"python3-gfutilities",
|
|
"gfutilities/_common.py"
|
|
],
|
|
[
|
|
"python3-gfutilities",
|
|
"gfutilities/configuration.py"
|
|
],
|
|
[
|
|
"python3-gfutilities",
|
|
"gfutilities/device/__init__.py"
|
|
],
|
|
[
|
|
"python3-gfutilities",
|
|
"gfutilities/device/basemachine.py"
|
|
],
|
|
[
|
|
"python3-gfutilities",
|
|
"gfutilities/device/settings.py"
|
|
],
|
|
[
|
|
"python3-gfutilities",
|
|
"gfutilities/service/__init__.py"
|
|
],
|
|
[
|
|
"python3-gfutilities",
|
|
"gfutilities/service/dispatch.py"
|
|
],
|
|
[
|
|
"python3-gfutilities",
|
|
"gfutilities/service/websocket.py"
|
|
],
|
|
[
|
|
"python3-gfhardware",
|
|
"gfhardware/machine.py"
|
|
],
|
|
[
|
|
"python3-gfhardware",
|
|
"gfhardware/feeder.py"
|
|
],
|
|
[
|
|
"python3-gfhardware",
|
|
"gfhardware/cnc.py"
|
|
],
|
|
[
|
|
"python3-gfhardware",
|
|
"gfhardware/switches.py"
|
|
],
|
|
[
|
|
"python3-gfhardware",
|
|
"gfhardware/input/**"
|
|
],
|
|
[
|
|
"python3-gfhardware",
|
|
"gfhardware/src/evdev.c"
|
|
],
|
|
[
|
|
"python3-gfhardware",
|
|
"gfhardware/z_axis.py"
|
|
],
|
|
[
|
|
"python3-gfhardware",
|
|
"gfhardware/leds.py"
|
|
],
|
|
[
|
|
"python3-gfhardware",
|
|
"gfhardware/cooling.py"
|
|
],
|
|
[
|
|
"python3-gfutilities",
|
|
"gfutilities/service/offline.py"
|
|
],
|
|
[
|
|
"python3-gfutilities",
|
|
"gfutilities/puls/**"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/super.c"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/main.c"
|
|
]
|
|
],
|
|
"fingerprint": "dd771ac4017b1a457e6a23617c95a96c52c9846bb3d32150acaf7eb8545e79ea",
|
|
"hardware": "api",
|
|
"id": "cloud.oversize-stream",
|
|
"inherited": true,
|
|
"kind": "live",
|
|
"record": {
|
|
"answers": [],
|
|
"campaign": "c-20260919210959-8780",
|
|
"duration_s": 154,
|
|
"evidence": {
|
|
"actions": [
|
|
{
|
|
"by": "fixture",
|
|
"channel": "button",
|
|
"state": "press",
|
|
"took_s": 5.27,
|
|
"ts": "2026-09-19T21:16:22Z"
|
|
},
|
|
{
|
|
"by": "fixture",
|
|
"channel": "button",
|
|
"state": "press",
|
|
"took_s": 1.01,
|
|
"ts": "2026-09-19T21:18:28Z"
|
|
},
|
|
{
|
|
"by": "fixture",
|
|
"channel": "button",
|
|
"state": "press",
|
|
"took_s": 1.26,
|
|
"ts": "2026-09-19T21:18:29Z"
|
|
}
|
|
],
|
|
"app_armed_after": false,
|
|
"app_counters_after_park": [
|
|
0,
|
|
0,
|
|
0
|
|
],
|
|
"app_latch_locked": true,
|
|
"backtrack_refused_lines": [],
|
|
"baseline": {
|
|
"post": [],
|
|
"pre": []
|
|
},
|
|
"button_dark": false,
|
|
"events": [
|
|
"print:starting",
|
|
"print:download:completed",
|
|
"button:pressed",
|
|
"print:warmup:starting",
|
|
"button:released",
|
|
"print:running",
|
|
"button:pressed",
|
|
"button:released",
|
|
"print:paused",
|
|
"button:pressed",
|
|
"print:resumed",
|
|
"button:released",
|
|
"print:return_to_home:succeeded",
|
|
"print:cancelled"
|
|
],
|
|
"fixture": {
|
|
"channels": [
|
|
"lid",
|
|
"interlock",
|
|
"button"
|
|
],
|
|
"hostname": "<REDACTED-1>",
|
|
"ip": "<IP-1>",
|
|
"released": []
|
|
},
|
|
"jobs": {
|
|
"long.puls": {
|
|
"compressed": true,
|
|
"payload_bytes": 35015348,
|
|
"seconds": 3501.5
|
|
}
|
|
},
|
|
"log": {
|
|
"job is longer than the ring": true
|
|
},
|
|
"max_backtrack": 155600,
|
|
"operator": {
|
|
"ack_live": true,
|
|
"ts": "2026-09-19T21:16:18Z"
|
|
},
|
|
"pause_log": {
|
|
"button pressed mid-run; pausing": true,
|
|
"button pressed while paused": true,
|
|
"paused at": true,
|
|
"resuming (laser lead": true
|
|
},
|
|
"prerequisites": {
|
|
"missing": [
|
|
"cloud.lid-interlock-abort",
|
|
"cloud.pause-resume"
|
|
],
|
|
"overridden": true,
|
|
"ts": "2026-09-19T21:16:18Z"
|
|
},
|
|
"print_finished": "INFO basemachine:_finish_action print [9004]: finished with event \":cancelled\"",
|
|
"progress_total": 35015348,
|
|
"service_cancel": {
|
|
"action canceled mid-run; stopping motion": "WARNING machine:_run_loop action canceled mid-run; stopping motion",
|
|
"return home complete": "INFO machine:_return_home return home complete",
|
|
"start return home": "INFO machine:_return_home start return home"
|
|
},
|
|
"streaming": 1,
|
|
"total_first": 33292288,
|
|
"total_later": 34603008,
|
|
"underruns_before": 1,
|
|
"underruns_during": 1
|
|
},
|
|
"fingerprint": "dd771ac4017b1a457e6a23617c95a96c52c9846bb3d32150acaf7eb8545e79ea",
|
|
"image": "20260919210531 (dev)",
|
|
"log": [
|
|
"21:16:17 start cloud.oversize-stream (live, api) in campaign c-20260919210959-8780",
|
|
"21:16:18 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
|
|
"21:16:18 fixture: <REDACTED-1> at <IP-1> covers lid, interlock, button",
|
|
"21:16:18 prerequisites overridden by the operator - not satisfied: cloud.lid-interlock-abort, cloud.pause-resume",
|
|
"21:16:18 baseline: pre: clean",
|
|
"21:16:18 the offline service is already up (pid 1595) - reusing it",
|
|
"21:16:20 job long.puls: 35015348 payload bytes, 3502 s at STfr 10000 (gzip)",
|
|
"21:16:22 ACT button press (fixture)",
|
|
"21:16:28 ACT button press: done after 5.3 s",
|
|
"21:16:28 program total at the start of the run: 33292288 bytes",
|
|
"21:16:28 NOTICE: Cutting: the test watches the ring being topped up for two minutes. Do nothing yet.",
|
|
"21:16:49 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
|
|
"21:17:19 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
|
|
"21:17:50 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
|
|
"21:18:21 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
|
|
"21:18:28 program total two minutes in: 34603008 bytes (+1310720)",
|
|
"21:18:28 progress reported against 35015348 bytes, kernel program total 34603008",
|
|
"21:18:28 max_backtrack while the feed runs: 155600 steps",
|
|
"21:18:28 ACT button press (fixture)",
|
|
"21:18:29 ACT button press: done after 1.0 s",
|
|
"21:18:29 ACT button press (fixture)",
|
|
"21:18:30 ACT button press: done after 1.3 s",
|
|
"21:18:30 canceled the print as the app would",
|
|
"21:18:43 [cancel] action canceled mid-run; stopping motion: seen",
|
|
"21:18:43 [cancel] start return home: seen",
|
|
"21:18:43 [cancel] return home complete: seen",
|
|
"21:18:43 [app] kernel counters after the park: [0, 0, 0]",
|
|
"21:18:51 cloud mode stays up; the machine is quiet",
|
|
"21:18:51 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:18:51 offline jobs removed from /tmp/forgetest",
|
|
"21:18:52 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
|
|
"21:18:52 baseline: post: clean",
|
|
"21:18:52 result PASS"
|
|
],
|
|
"manifest_sha": "5221f3466ae2497ca49fbb8cbe5d4eff49fab0f8c627190416aa2320948f69c4",
|
|
"message": "",
|
|
"result": "PASS",
|
|
"test": "cloud.oversize-stream",
|
|
"ts": "2026-09-19T21:18:52Z"
|
|
},
|
|
"requires": [
|
|
"cloud.lid-interlock-abort",
|
|
"cloud.pause-resume"
|
|
],
|
|
"satisfied": true,
|
|
"source_sha": "8a0f28595c1231c48e044e9ca5e9149e35a87cb491e89211f4c763e9a61a4479",
|
|
"subsystem": "cloud",
|
|
"title": "A print longer than the ring is fed while it plays"
|
|
},
|
|
{
|
|
"always": false,
|
|
"covers": [
|
|
[
|
|
"forgefirm-app",
|
|
"forgefirm-app/gfcloud.py"
|
|
],
|
|
[
|
|
"forgefirm-app",
|
|
"forgefirm-app/ffmachine.py"
|
|
],
|
|
[
|
|
"forgefirm-app",
|
|
"forgefirm-app/gfhome.conf.sample"
|
|
],
|
|
[
|
|
"python3-gfhardware",
|
|
"gfhardware/__init__.py"
|
|
],
|
|
[
|
|
"python3-gfhardware",
|
|
"gfhardware/_common.py"
|
|
],
|
|
[
|
|
"python3-gfhardware",
|
|
"gfhardware/id.py"
|
|
],
|
|
[
|
|
"python3-gfhardware",
|
|
"gfhardware/coolsvc.py"
|
|
],
|
|
[
|
|
"python3-gfutilities",
|
|
"gfutilities/__init__.py"
|
|
],
|
|
[
|
|
"python3-gfutilities",
|
|
"gfutilities/_common.py"
|
|
],
|
|
[
|
|
"python3-gfutilities",
|
|
"gfutilities/configuration.py"
|
|
],
|
|
[
|
|
"python3-gfutilities",
|
|
"gfutilities/device/__init__.py"
|
|
],
|
|
[
|
|
"python3-gfutilities",
|
|
"gfutilities/device/basemachine.py"
|
|
],
|
|
[
|
|
"python3-gfutilities",
|
|
"gfutilities/device/settings.py"
|
|
],
|
|
[
|
|
"python3-gfutilities",
|
|
"gfutilities/service/__init__.py"
|
|
],
|
|
[
|
|
"python3-gfutilities",
|
|
"gfutilities/service/dispatch.py"
|
|
],
|
|
[
|
|
"python3-gfutilities",
|
|
"gfutilities/service/websocket.py"
|
|
],
|
|
[
|
|
"python3-gfhardware",
|
|
"gfhardware/machine.py"
|
|
],
|
|
[
|
|
"python3-gfhardware",
|
|
"gfhardware/feeder.py"
|
|
],
|
|
[
|
|
"python3-gfhardware",
|
|
"gfhardware/cnc.py"
|
|
],
|
|
[
|
|
"python3-gfhardware",
|
|
"gfhardware/switches.py"
|
|
],
|
|
[
|
|
"python3-gfhardware",
|
|
"gfhardware/input/**"
|
|
],
|
|
[
|
|
"python3-gfhardware",
|
|
"gfhardware/src/evdev.c"
|
|
],
|
|
[
|
|
"python3-gfhardware",
|
|
"gfhardware/z_axis.py"
|
|
],
|
|
[
|
|
"python3-gfhardware",
|
|
"gfhardware/leds.py"
|
|
],
|
|
[
|
|
"python3-gfhardware",
|
|
"gfhardware/cooling.py"
|
|
],
|
|
[
|
|
"python3-gfutilities",
|
|
"gfutilities/service/offline.py"
|
|
],
|
|
[
|
|
"python3-gfutilities",
|
|
"gfutilities/puls/**"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/super.c"
|
|
],
|
|
[
|
|
"forgectrl",
|
|
"src/main.c"
|
|
]
|
|
],
|
|
"fingerprint": "2cc0e04769541f7866c6f40632d61cd2a2c3fe3e5cfd7c487450f71d3600b90a",
|
|
"hardware": "api",
|
|
"id": "cloud.paused-lid-cancel",
|
|
"inherited": true,
|
|
"kind": "live",
|
|
"record": {
|
|
"answers": [],
|
|
"campaign": "c-20260919215024-c402",
|
|
"duration_s": 43,
|
|
"evidence": {
|
|
"actions": [
|
|
{
|
|
"by": "fixture",
|
|
"channel": "button",
|
|
"state": "press",
|
|
"took_s": 6.76,
|
|
"ts": "2026-09-19T22:03:31Z"
|
|
},
|
|
{
|
|
"by": "fixture",
|
|
"channel": "button",
|
|
"state": "press",
|
|
"took_s": 1.25,
|
|
"ts": "2026-09-19T22:03:37Z"
|
|
},
|
|
{
|
|
"by": "fixture",
|
|
"channel": "lid",
|
|
"state": "open",
|
|
"took_s": 0.05,
|
|
"ts": "2026-09-19T22:03:39Z"
|
|
},
|
|
{
|
|
"by": "fixture",
|
|
"channel": "lid",
|
|
"state": "close",
|
|
"took_s": 0.33,
|
|
"ts": "2026-09-19T22:03:51Z"
|
|
}
|
|
],
|
|
"armed_after": false,
|
|
"baseline": {
|
|
"post": [],
|
|
"pre": []
|
|
},
|
|
"batch": {
|
|
"group": "attended",
|
|
"ts": "2026-09-19T21:50:24Z"
|
|
},
|
|
"button_dark": false,
|
|
"counters_after": [
|
|
0,
|
|
0,
|
|
0
|
|
],
|
|
"events": [
|
|
"print:starting",
|
|
"print:download:completed",
|
|
"button:pressed",
|
|
"print:warmup:starting",
|
|
"button:released",
|
|
"print:running",
|
|
"button:pressed",
|
|
"button:released",
|
|
"print:paused",
|
|
"lid:opened",
|
|
"print:return_to_home:succeeded",
|
|
"print:cancelled",
|
|
"lid:closed"
|
|
],
|
|
"fixture": {
|
|
"channels": [
|
|
"lid",
|
|
"interlock",
|
|
"button"
|
|
],
|
|
"hostname": "<REDACTED-1>",
|
|
"ip": "<IP-1>",
|
|
"released": []
|
|
},
|
|
"jobs": {
|
|
"paused.puls": {
|
|
"compressed": false,
|
|
"payload_bytes": 648452,
|
|
"seconds": 64.8
|
|
}
|
|
},
|
|
"latch_locked_after": true,
|
|
"lid_from_pause": {
|
|
"lid opened mid-run; stopping motion": "WARNING machine:_run_loop lid opened mid-run; stopping motion",
|
|
"print finished": "INFO basemachine:_finish_action print [9005]: finished with event \":cancelled\"",
|
|
"return home complete": "INFO machine:_return_home return home complete",
|
|
"start return home": "INFO machine:_return_home start return home"
|
|
},
|
|
"operator": {
|
|
"ack_live": true,
|
|
"ts": "2026-09-19T22:03:16Z"
|
|
},
|
|
"paused": {
|
|
"button pressed mid-run; pausing": true,
|
|
"paused at": true
|
|
}
|
|
},
|
|
"fingerprint": "2cc0e04769541f7866c6f40632d61cd2a2c3fe3e5cfd7c487450f71d3600b90a",
|
|
"image": "20260919214619 (dev)",
|
|
"log": [
|
|
"22:03:16 start cloud.paused-lid-cancel (live, api) in campaign c-20260919215024-c402",
|
|
"22:03:16 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
|
|
"22:03:16 fixture: <REDACTED-1> at <IP-1> covers lid, interlock, button",
|
|
"22:03:16 queued by the attended queue opened 2026-09-19T21:50:24Z",
|
|
"22:03:16 baseline: pre: clean",
|
|
"22:03:16 cloud mode: restarting the client offline (was pid 3405)",
|
|
"22:03:21 offline service up: INFO offline:open OFFLINE service: no web session; listening on /run/gfcloud-offline.sock",
|
|
"22:03:29 job paused.puls: 648452 payload bytes, 65 s at STfr 10000",
|
|
"22:03:31 ACT button press (fixture)",
|
|
"22:03:37 ACT button press: done after 6.8 s",
|
|
"22:03:37 ACT button press (fixture)",
|
|
"22:03:39 ACT button press: done after 1.3 s",
|
|
"22:03:39 ACT lid open (fixture)",
|
|
"22:03:39 ACT lid open: done after 0.1 s",
|
|
"22:03:47 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
|
|
"22:03:51 [print] lid opened mid-run; stopping motion: seen",
|
|
"22:03:51 [print] start return home: seen",
|
|
"22:03:51 [print] return home complete: seen",
|
|
"22:03:51 [print] print finished: seen",
|
|
"22:03:51 ACT lid close (fixture)",
|
|
"22:03:51 ACT lid close: done after 0.3 s",
|
|
"22:03:59 cloud mode stays up; the machine is quiet",
|
|
"22:03:59 PASS: a paused print canceled by the lid stopped, parked, relocked and reported ':cancelled'",
|
|
"22:03:59 offline jobs removed from /tmp/forgetest",
|
|
"22:04:00 baseline: post: clean",
|
|
"22:04:00 result PASS"
|
|
],
|
|
"manifest_sha": "5dbf1f84b9aea447033e38de4b79d4fe8af2309af74367f0befbe9429d44d170",
|
|
"message": "",
|
|
"result": "PASS",
|
|
"test": "cloud.paused-lid-cancel",
|
|
"ts": "2026-09-19T22:04:00Z"
|
|
},
|
|
"requires": [
|
|
"cloud.pause-resume",
|
|
"cloud.lid-interlock-abort"
|
|
],
|
|
"satisfied": true,
|
|
"source_sha": "c43fa48b14a8f263106939d7d75677bd1b89f35bd2061b17c5f102c330818090",
|
|
"subsystem": "cloud",
|
|
"title": "A paused cloud print is canceled by the lid"
|
|
}
|
|
],
|
|
"tool_version": "0.1.0"
|
|
}
|