Files
forgefirm/releases/v0.0.9/acceptance.json
T
ScottW514 f9190ffddc Release v0.0.9
FORGEFIRM_RELEASE is 0.0.9, and releases/v0.0.9 carries the release notes
and the acceptance artifact that forgetest exported on the bench reference.

The artifact is from campaign c-20261018224638-4ca0 on the pins-only dev
image 20261018222431: authorized, 43 of 43 tests satisfied, all 43 run on
that image and none inherited. scripts/acceptance-gate.py against that
build's release manifest gives AUTHORIZED, with inputs identical to the
bench image.
2026-10-18 19:45:26 -04:00

15852 lines
387 KiB
JSON

{
"authorized": true,
"campaign": {
"catalog_hash": "b38332a30994e16a499a9ded530062291bacabf873138461dd54421e2174c29b",
"id": "c-20261018224638-4ca0",
"image": "20261018222431 (dev)",
"manifest_sha": "70ecd7867c2698d17f2f3c38db772868eda3364f541242c93fb5db4e1d593bcd",
"t": "campaign",
"ts": "2026-10-18T22:46:38Z"
},
"catalog_hash": "b38332a30994e16a499a9ded530062291bacabf873138461dd54421e2174c29b",
"counts": {
"inherited": 0,
"required": 0,
"satisfied": 43,
"total": 43
},
"exported_at": "2026-10-18T23:33:36Z",
"format": 1,
"identity_sha": "60af177b23dda40eeb34d464f87ff6b65e4e2e966c1ea581514644875de9c8a4",
"image": {
"name": "forgefirm-image-dev",
"version": "20261018222431 (dev)"
},
"invalidate": null,
"manifest": {
"build": {
"layers": {
"meta": {
"dirty": false,
"rev": "70ed6f677234d32198371a030178d2f272cf2d94"
},
"meta-forgefirm": {
"dirty": false,
"rev": "5036517e2273fe388d31be0d4939ef3544ec3b5a"
},
"meta-freescale": {
"dirty": false,
"rev": "b699d026506a6fc402e03afb432dcabd3d81c7ab"
},
"meta-freescale-distro": {
"dirty": false,
"rev": "b9d6a5d9931922558046d230c1f5f4ef6ee72345"
},
"meta-glowforge-bsp": {
"dirty": false,
"rev": "c542ce6ec5799df9cf0f689eb883c790c71a414b"
},
"meta-networking": {
"dirty": false,
"rev": "b0c2c648a1af89e7a8dd4c2ec841f3bc0ed0ccb9"
},
"meta-oe": {
"dirty": false,
"rev": "b0c2c648a1af89e7a8dd4c2ec841f3bc0ed0ccb9"
},
"meta-openglow-core": {
"dirty": false,
"rev": "c542ce6ec5799df9cf0f689eb883c790c71a414b"
},
"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",
"26b922a02a25139c2ab4dc25349d60595343e419"
],
[
".gitignore",
"5a14dec4b997a715fbcc330b634860e954070cc3"
],
[
".vscode/tasks.json",
"8c78e4557ab5871f4d60baba00435e5bde74d68f"
],
[
"AGENTS.md",
"d0c93e493845666f18f19dca605c4e5b2a63562f"
],
[
"CMakeLists.txt",
"cbbe2a487272ba2143b784384bff0d2f2682f970"
],
[
"CONTRIBUTING.md",
"ca2a98e7d617e1bca2b2f814a598e94f89186c6e"
],
[
"LICENSE",
"ddfa51eaa264bc020ac65023e52f60be1d8cc1cd"
],
[
"README.md",
"8aadec7f8267cb8e2ddcb2660a546c60a3213a27"
],
[
"docs/advisories/cloud-service.md",
"004e5c4cdd3c3b8a487452814fd79ef926063f70"
],
[
"docs/advisories/extensions.md",
"a39bcf26f35c0ce7d33f6a9bf4494f0c53398d86"
],
[
"docs/advisories/licenses.md",
"76cbe3f3cdd34d17188ca318349308440ee48c6e"
],
[
"docs/advisories/privacy.md",
"caff47e8948f127d8c123e6355b44012c3b1bec4"
],
[
"docs/advisories/safety-and-risk.md",
"88b56eddc84e66f7a482d39ab8656d8fbb9314b7"
],
[
"examples/remote/README.md",
"7f6846b23840f1e0643a068a9c4d8ca37f95d3b6"
],
[
"examples/remote/notify.py",
"78bbc766100bf2d566087830bbe8a2d631118118"
],
[
"init/forgectrl.init",
"ee35651f9be1d8dff23ff87323b085482f88802b"
],
[
"src/accel.c",
"5cc63aba5005d4fc4f3f8af9482dfea2b9e12481"
],
[
"src/accel.h",
"5e8807d02b6f29b1e006835c6e81c798a0a3ab2f"
],
[
"src/advisories.c",
"9d2985f1caf1265d8bbd038fc21e63e0baaffbd2"
],
[
"src/advisories.h",
"e3bb7f74a6f7a656cd69fcb7ef1e724a8f3d6225"
],
[
"src/airflow.c",
"02627ff272070a76cad7d1e9f48293858af27eff"
],
[
"src/airflow.h",
"4a9e3f2328ffc8a899cd8521a01667929abfdd25"
],
[
"src/auth.c",
"21fd08e3f0b5fd117247166048a53495b31777ee"
],
[
"src/auth.h",
"bef54587e2bae70f1622c4a814404eb22f2c2b93"
],
[
"src/builtin.c",
"7f92ef64fff7b850a306251d4b8d00999f28cf19"
],
[
"src/builtin.h",
"b5e3cbf4c439c4201a6bcfda5b3724e967f08dcf"
],
[
"src/button.c",
"876921173b0940762d8b300c466a60150af4864b"
],
[
"src/button.h",
"c9abf79767336fe892413330ee920134b70c9301"
],
[
"src/cam.c",
"27819487ce62d7f7e8f2c4aaccb59b9402f1eb3b"
],
[
"src/cam.h",
"f3af1937d9a8d6504942eaea55507d8425417ea2"
],
[
"src/camhealth.c",
"2ce8a0e4dd6586b67b2bc9d340444c7638454311"
],
[
"src/camhealth.h",
"4d0765ebe62a733226fc5d1f09ff648fdb9f3645"
],
[
"src/camkey.c",
"7058ee497de36a3c06c8848602d017b462ad20c3"
],
[
"src/camkey.h",
"a33a4338e3cf3322e64b8034f57b6dc5726f6ffc"
],
[
"src/cool.c",
"2abe4234a613f7909e217c2c640bd35902a3e439"
],
[
"src/cool.h",
"3b5101adbfe8e6f4bd68c8ffe0fd11ec7c69c132"
],
[
"src/coolfmt.c",
"aa89421f4e2b14d37345faab3c1b2e18970001a7"
],
[
"src/coolfmt.h",
"55fe9b4734d508b7f58bb311cb4fa9264ccda14d"
],
[
"src/curverec.c",
"927136670279b3e05e2fd3bade3124bce5bf0f7c"
],
[
"src/curverec.h",
"f05b0eec1fdb333e708941dcc946123b93c3d1b7"
],
[
"src/debayer.c",
"8193350d231de08eaab92c00a27574ba3f21afae"
],
[
"src/debayer.h",
"66ada9cb84f29091c97a42d881a64d21b6919b41"
],
[
"src/diag.c",
"046d4c3dce9b3e2ea0f1b243867f8f469beb8f3e"
],
[
"src/diag.h",
"3c3f7da5c1a128e83e6ab64b43a97d173494515f"
],
[
"src/events.c",
"2d3294ae6a6e846fcbcaa888ec4d9c7299b1d0bb"
],
[
"src/events.h",
"eb4f4d1ad2732c6fd6eb3f8d4c86c6e018e15f93"
],
[
"src/extpkg.c",
"83ab9afc2f13fbc6aed186b60d416b46b11e09bb"
],
[
"src/extpkg.h",
"92a19acf5bb2407ae8c7247a2653bc649d797eb9"
],
[
"src/fflog.c",
"cdeb518386db022df74cbfff89008bf17f5a864c"
],
[
"src/fflog.h",
"905314b0d5be06487faecdf97720e23d2506bb4e"
],
[
"src/font_hershey.c",
"9d7e7be583299f495997da276ca19c785ecb6e6d"
],
[
"src/font_hershey.h",
"535bbdcdf671b57b24fb710211a89c7e0a855c55"
],
[
"src/fwproduct.c",
"4fc4916b97493c1ec66aa41f76d338fbf2de78f5"
],
[
"src/fwproduct.h",
"7ba0b422a1622927963e830a4d2ee6ffb8b6118c"
],
[
"src/gates.c",
"9ee971b3b2d78c80dace8f6f4eebaec0df0de3b6"
],
[
"src/gates.h",
"73cf6cea98f4f97ae76eb549b28bb89738d9a2e5"
],
[
"src/gpu_debayer.c",
"c74f00b2e92883a7b09185a9c27eebadab2d3fb7"
],
[
"src/gpu_debayer.h",
"092f6fe1bae9dda6455763dd48a40938d99162d3"
],
[
"src/grblport.c",
"af7d30dae338afad2de15309a585da0a8f07b7c2"
],
[
"src/grblport.h",
"6f04b63d1be29cf08ddc3771e984b3992db970a0"
],
[
"src/holds.c",
"66687e5da66599abb53e97a94e903d8a989e369c"
],
[
"src/holds.h",
"383e157d18c4f1f69e4c80d999ad8caae568d6a6"
],
[
"src/hooks.h",
"99bb724ae54b645b620d2e539838b055e8020083"
],
[
"src/ipu_copy.c",
"58f5a02eed46f6d7f95126e42080b2e143921d5f"
],
[
"src/ipu_copy.h",
"33d742d32ee97a4f49ad1751d9302229a3d7693d"
],
[
"src/jobpost.c",
"84f3cb73a9969a8bec3dae3271f4d2200917cb71"
],
[
"src/jobpost.h",
"34ffdd77f3387183cf739c33a6b7e7ca9139728e"
],
[
"src/jobrun.c",
"1f209054d10342846a265bd30c1c64089ab79854"
],
[
"src/jobrun.h",
"27c83fed5e18638c9183036d4e4d62d1f8b7ebc6"
],
[
"src/jobstream.c",
"d0bf9bd9506487b29dbce033ec2605a4e8b85b26"
],
[
"src/jobstream.h",
"99a98bcd7e81e63e13e046646472a4304b23c780"
],
[
"src/lease.c",
"49703c250efdbcc35aa8e90b820f7d9fc256759a"
],
[
"src/lease.h",
"1db6e25e3e54123f21e6748aec22e0c97955d646"
],
[
"src/led.c",
"0a80fa9c983416b9dc8610b30b65de16416e285d"
],
[
"src/led.h",
"22f72dfb34519d1f7a071984560763cf6ba74816"
],
[
"src/lens.c",
"d78ec7da0ab1893889efc4692d65f85efa4d8290"
],
[
"src/lens.h",
"d157a98cffcddb1bc9d405f1779e2c494c92ef17"
],
[
"src/lensfind.c",
"8c6890b7d79c4818c6f663a0dda6aebf25fb4415"
],
[
"src/lensfind.h",
"e82e3eae998b600101b03e45994e167606547902"
],
[
"src/lenshome.c",
"219e8d95c700ec20c5c703c5d334af6b4f8d80ea"
],
[
"src/lenshome.h",
"eaf10e197aad7e040bd22f117c186b6de636dd2d"
],
[
"src/liveness.c",
"a3244ff519e91cdebff8b4f555bfd468c24e7a56"
],
[
"src/liveness.h",
"88ae53c31c80386b5daf570b77c806c978357061"
],
[
"src/logs.c",
"60483e914e8293410468d9beccf5fee4e0c8297b"
],
[
"src/logs.h",
"2e4be0d770314da791a35b8b8ae4039786bab399"
],
[
"src/main.c",
"f2d806cf36687b6304e6df5afd417d3e9f6596c5"
],
[
"src/mcode.c",
"0e696f00a6ca583531a9ddd2e59419a166b4e398"
],
[
"src/mcode.h",
"9e4efb5d7928af1a6e9709fdd7021c342fdc4956"
],
[
"src/mp4mux.c",
"90dae21b0bca1fd1b84d2ed308d229e9685922bc"
],
[
"src/mp4mux.h",
"36cfe2f67d643fe114ab279caba5b9da388dfd22"
],
[
"src/paths.h",
"353d700ba7d1ca19be01ff8a6d51c7055b0e3953"
],
[
"src/peer.c",
"e2fdf6aad48fbc6861bf5846fafa64ac79064f8d"
],
[
"src/peer.h",
"705b548996451c32141db3b545b3e6f7b721c480"
],
[
"src/recordhtml.c",
"c23d1957cfded491cd541937ce092ac38443f96d"
],
[
"src/recordhtml.h",
"a0088d926c8edadcbf884372b77f5974d54da6de"
],
[
"src/relcheck.c",
"dd0ee9f79108b7af70c9aa513b8616f58b0f4353"
],
[
"src/relcheck.h",
"d8400ebcbc8221c1d126f209eb2b82da5835b018"
],
[
"src/sanitize.c",
"09abdc633301b437c4deac6713888892b0187250"
],
[
"src/sanitize.h",
"b52ae3da495e4d6308f59b4ec4105e99debe910b"
],
[
"src/senderout.c",
"4ea655e736fb479736fd8db498fce8f3f44917d8"
],
[
"src/senderout.h",
"3703229de88b51fd30130df903778c9e2ba0f34c"
],
[
"src/session.c",
"db815c861cb91ca4909ea8d01ba7faad4a436081"
],
[
"src/session.h",
"2b05c01cb2bbef6056a090cce333e514626bc957"
],
[
"src/settings.c",
"e10e715565d11104ddb8ff60938f7c0c117984af"
],
[
"src/settings.h",
"f4bd5772ea7cf693c7a339d25e761a17e27b5f76"
],
[
"src/setup.c",
"3a912c445c07c3f5c5317982bff8ba98f2e567b4"
],
[
"src/setup.h",
"2b505527610445748f15a938e6b06df750b137e6"
],
[
"src/sha256.c",
"b8b38167cec8a586055093c6a120624049b08632"
],
[
"src/sha256.h",
"a8806a440e43d96866735a1da17d590491b6d55a"
],
[
"src/sheet.c",
"4287d80d97a072eae25654ccf19c6f38fe3dde8c"
],
[
"src/sheet.h",
"a0c5b99678e4ea67c60f22a4568790c3f99b0808"
],
[
"src/sheetid.c",
"aa63f45a50d7874e0aa2922ce21339ff17cbb5c5"
],
[
"src/sheetid.h",
"fe25e6648df6be8a8fb640f63e84338c342da6a6"
],
[
"src/status.c",
"ace129367f60a3e9c9feaee7b95d919fa5d8c4ae"
],
[
"src/status.h",
"87ce147e381c477c9f31012022009cdadb339422"
],
[
"src/super.c",
"2aca1d0b11f9dcacf485862e05aa936f81bc8501"
],
[
"src/super.h",
"a5350c028245e0d207742b36c3f6a3a945aa8607"
],
[
"src/testhook.h",
"2c93bfebe873139f6f1247a9db71f0fc5a9cd1a9"
],
[
"src/tls.c",
"5a311d947d091c1607d2c6a1c0d66c20b8dc10d0"
],
[
"src/tls.h",
"ee4d7d68f1ed89231256d349caf6b4c00632c352"
],
[
"src/tokens.c",
"e7f48fb277e9caf3b47dcca22a3b0331bf7f7016"
],
[
"src/tokens.h",
"3646099040abb542e9bceb4edead5460aa55e29e"
],
[
"src/tray.c",
"28e094430bc99973f9e9bddc5380e033c18c5d2b"
],
[
"src/tray.h",
"591048f47108f592f4dc20d2e228acf994c932a7"
],
[
"src/ui.h",
"1f1a14cb062e9220afad0e34cc582aab2fe2c9a4"
],
[
"src/ui/embed.cmake",
"0944fd06a00f9aef36343ce4a2c8ce045255bc88"
],
[
"src/ui/embed_docs.cmake",
"767d374c5422669384d865fd726492dc7b4dcf2a"
],
[
"src/ui/ext.js",
"7e41490b730b4d989977a98cca349fb2a391f93e"
],
[
"src/ui/forms.js",
"621b7f95207c97a64bbef53c4c1d7e39968a5448"
],
[
"src/ui/help.js",
"16f8e738968a4c9fad2f83a34da7213de3d1f658"
],
[
"src/ui/index.html",
"1a3cdb3d046ccfa80236a42b2349fdc8dc30cdf4"
],
[
"src/ui/login.html",
"22acf58351a5a874cd2ffc2a3309fe43e8a94116"
],
[
"src/ui/login.js",
"d38480ff1f4eb67b2e2c356b2f2a2b82a2656fd4"
],
[
"src/ui/md.js",
"e879a630efd6a53b6ed16d5a4052f6b8ced21a5b"
],
[
"src/ui/panel.js",
"0fc084bfad0bd6d49130a3d7d70d6890f308ba94"
],
[
"src/ui/regions.js",
"42b6da0673a3aa5d196c9f661877acf63b119da7"
],
[
"src/ui/theme.css",
"9de9131fcf4cc62541a5f1a89d7468d39fe3a237"
],
[
"src/ui/vendor/LICENSE",
"fa7c00bc4ebd5dc9c0b1e7f8c4b6a202fd9fa816"
],
[
"src/ui/vendor/bootstrap.bundle.min.js",
"881b51776c82ddd6bd7225fb03f6e9bb07f53c40"
],
[
"src/ui/vendor/bootstrap.min.css",
"c558c23e686c9473d35abc3aa3b16cec11b6f7d7"
],
[
"src/ui/wizard.css",
"58fb7f89e312cfce3f58d4b66a8b22ed51d8ee88"
],
[
"src/ui/wizard.html",
"ffa04d335994470e719ed6777b0d98b6c030f68c"
],
[
"src/ui/wizard.js",
"6fda00f50afe21439e8c43df53c607320ac9bbd5"
],
[
"src/update.c",
"78aa70a4532e14084323d4de7e9939ca7295a758"
],
[
"src/update.h",
"67160301f3622d570424f8b094c2865db132fd35"
],
[
"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",
"ea1955501c603b815bc657f9cfcfb68074d20480"
],
[
"src/wiz.h",
"96732c9791d6996123d21ee4130a9d2f0af00e53"
],
[
"src/wizcalc.c",
"0a4eecb0f541680191aa6219d61fdbe0dbbb05c4"
],
[
"src/wizcalc.h",
"e6e8dce6e4d3efa99956ce17d3ee4452b6efc550"
],
[
"src/wizdark.c",
"ea3c242f0f5dd5b9dce159fae4f51a2d72ad9337"
],
[
"src/wizdark.h",
"4b7f02a1f8881af4b059476756e131ff59f48e15"
],
[
"src/wizlive.c",
"5b88bde34248920bbc7bdd0ef12893898785821b"
],
[
"src/wizlive.h",
"34d74f911f6d0e393083194dd4de91dd36373aa9"
],
[
"src/wizpkg.c",
"5f3016416b20aac444efc658957c99baf1d60ea1"
],
[
"src/wizpkg.h",
"61da720f22873e2ba28cb44f5bd53a4517621ed1"
],
[
"src/wizrun.h",
"0b25bc939fb1b07c889952435b63f9382756ad46"
],
[
"tests/accel_test.c",
"58efc7af80341548045169074ccf64f8fc3fb326"
],
[
"tests/airflow_test.c",
"79e3ba5b2aa5f45c21dab0fca3b3aa1427c607d0"
],
[
"tests/auth_scoped_test.c",
"051f06d7281425748a677f9c02b351809fea9d0e"
],
[
"tests/builtin_test.c",
"41529e775dcc03f72b7825a3ad345d7473f84c01"
],
[
"tests/camhealth_test.c",
"32aecc993f1192c343262636b214d590a9ccf94f"
],
[
"tests/camkey_test.c",
"ee3838d49d5a3246c89bdddae3116180154e2dbb"
],
[
"tests/cool_flow_test.c",
"a2f6bb9f4326be524225319ada69f4af8db01495"
],
[
"tests/cool_gate_test.c",
"209119bc12469a24d18ae32eb22ad604ab429afd"
],
[
"tests/coolfmt_test.c",
"c41dfc0a8ce10bea8d81125f834ee8b525bd7b56"
],
[
"tests/curverec_fit_test.c",
"a0f7eb4c6e0d5a2db69de53a5f008caffc3a0aaa"
],
[
"tests/curverec_test.c",
"eecff248c7ba7c9a51b1c996fa6b08dc4d781aa5"
],
[
"tests/debayer_test.c",
"56c4fe062c73fd5e878cc6cac906ab883e6c15b5"
],
[
"tests/enclosure_wait_test.c",
"7d731329ad651dfa8df2fd587b4722eedbf68a23"
],
[
"tests/events_test.c",
"9163f25d05ff2206b1e2dd3fbcd5dfbdad24ca19"
],
[
"tests/extpkg_test.c",
"44458197a0a19fdf22002fba91e45035981568e2"
],
[
"tests/fflog_e2e.sh",
"94496f871c94a138bb5f7916b49b556fb3385b08"
],
[
"tests/fflog_e2e_test.c",
"0a69f4e6e36549966713827fabbd6d585efa222c"
],
[
"tests/fwproduct_test.c",
"a02fc42310edb7289e08d9233c5e778f9ea00099"
],
[
"tests/grblport_test.c",
"7543e3a231f5f2e4a7c4f280baf93548e624d21f"
],
[
"tests/holds_test.c",
"5f834bac562ccec07467fa156e6694fa4076bf03"
],
[
"tests/holds_wire_test.c",
"e1642c79ee3f42b61b89bd6de082210b819b973a"
],
[
"tests/host_ext.sh",
"d7a97bdb6c3b8052184b0de416239c65cc2123dd"
],
[
"tests/host_ext_forgeext.c",
"6e3d2b192ba4e6a6d46c455aedc86e59d13bbbff"
],
[
"tests/host_guard.sh",
"1dd3ff3236a7723337ee49b8d8454cfce5084d07"
],
[
"tests/host_lan.sh",
"853a8ae6a6bbef8652b16fbfd4522c11cca7d32b"
],
[
"tests/host_lease.sh",
"8eedd65ca43c675a29f2c70032ca6f10327fd454"
],
[
"tests/host_routes.sh",
"be76ebac3065d4a93892ae02988a0336dd16721b"
],
[
"tests/host_setup.sh",
"b2406438ed66861baba5e23bbea8c796c86442fc"
],
[
"tests/host_start.sh",
"6d8fc10ca356b165eea3905afa887f67c190dd18"
],
[
"tests/host_update.sh",
"ca635206909fa65bf9a5316eb7e99653ca2bfc79"
],
[
"tests/jobpost_test.c",
"07f6771b74382e508fcd88f69891009c03a64862"
],
[
"tests/jobrun_test.c",
"d3e62e0d9e5d0bb2c8d66dd0f882ccd59acf9486"
],
[
"tests/lease_test.c",
"c369d8878383de941ea8c1043ca5b05ed2cba21b"
],
[
"tests/lens_test.c",
"acf677522523eb55daf79c795a47ca6af9814902"
],
[
"tests/lenshome_test.c",
"f9e09f95efa56b2847b71c553b3384cbf01fcf5b"
],
[
"tests/logs_export_test.c",
"7595a3a5bc44dba465104628b0dea2ecce08d3d0"
],
[
"tests/logs_test.c",
"16b6f013c3625bf60ebdcf64549a23f668ed8ba2"
],
[
"tests/mcode_test.c",
"a935d6d93593f2e46e023f0fb89c65526f12ab38"
],
[
"tests/mp4mux_test.c",
"2406647623a9ef83a6b91c5b932a95a282586818"
],
[
"tests/recordhtml_test.c",
"b62a4dca0820900ea52371b8e66d7d9ee8585652"
],
[
"tests/relcheck_test.c",
"6dbb3939364850d1921444c9fd5366f099b7164e"
],
[
"tests/sanitize_test.c",
"add2169b6d0bcd25624669afd78da58683408d78"
],
[
"tests/senderout_test.c",
"d3c0eeb03f77401a085e6474c728e6185a44c417"
],
[
"tests/settings_dir_test.c",
"ee97a3024af1e1968602a29f3d528e91219c7192"
],
[
"tests/setup_test.c",
"1825cc715e36c0a3c5b3b86c45c638502410452e"
],
[
"tests/sha256_test.c",
"017ef369f6bff5cc0827dc74aeb1189843b052ca"
],
[
"tests/sheet_test.c",
"606012c287a40bf1e9e46629efc8ea4d4e410db4"
],
[
"tests/sheetid_test.c",
"bc923a6fea6e58461676774ee98f8b9b65c078d4"
],
[
"tests/status_test.c",
"8f939caf8521014ce691c138c17b214a7f041aa8"
],
[
"tests/super_test.c",
"fb99bc458a884932931ea3850f700c9ed4134449"
],
[
"tests/test_routes.py",
"e19fa48d88e14a6a6325643abbe9bab2f8d2158f"
],
[
"tests/tls_test.c",
"a6a59ac2ddc9d77d9c19c6b99303cb5d2073a649"
],
[
"tests/tokens_test.c",
"4847ecd23b6406ade57ce795849b0cbe4639e380"
],
[
"tests/tray_test.c",
"f28546741a452d0b937ebc1b072e7a4b1a8943d1"
],
[
"tests/ulfius_image.sh",
"1e564547bb3953a446ee9d806d5e2c7e22d607ec"
],
[
"tests/users_test.c",
"d447b90ec43e878b1b8b6f9b594bfe043a68a035"
],
[
"tests/wizard_walk.py",
"d1719629cf822088204f9e07eb32d6f449a2e924"
],
[
"tests/wizcalc_test.c",
"fb2665a4ca3438a0fa34750e718c14af0eabc82c"
],
[
"tests/wizlive_test.c",
"d21dbb8b145a4204879aa6cc34fbebb73052879f"
],
[
"tests/wizpkg_test.c",
"36c2d0e7cc262b51e7f3bb934b8009d5e6fd622d"
],
[
"tools/check_ui_js.py",
"84b5b84c9a400395766bd28b570f059a52691a4a"
],
[
"tools/devserver.py",
"de8318cce3547fd104a70e557e956d8c75d06c98"
],
[
"tools/frame_isolation.py",
"9cfc000346618b446156ff352f843f884f623442"
],
[
"tools/frame_isolation_hostile.html",
"27ead83c732895b5a696ec4223c97307e1d25747"
],
[
"tools/hershey_gen.py",
"d2e09fec7c28f41aa37af06f57cdd75a3a0b3d8d"
]
],
"pv": "0.1.34",
"recipes": [
"forgectrl"
],
"source": "git://github.com/openglow-org/forgectrl.git",
"srcrev": "b235be3e8ac5fcd88080b00c9d441dbda9c0014c"
},
"forgeext": {
"component": "forgeext",
"files": [
[
".github/actions/kit/action.yml",
"54ba4142eff63275dacc2a6d46eacb7f6e50a613"
],
[
".github/workflows/build.yml",
"1847f4c58b7fabfd51108220b32654b1ade16847"
],
[
".github/workflows/package.yml",
"c4306bdbfdb164a2276544d2e9427cc24c072ee8"
],
[
".gitignore",
"2fb12249c0537a1d0c0cd12e6f181b61861720c2"
],
[
"AGENTS.md",
"e17173ac842c8a67a0c3128e340e9a58b02b92c5"
],
[
"CMakeLists.txt",
"e052250d6b89ce8294aeeefe1ffcd7a027c136ee"
],
[
"CONTRIBUTING.md",
"ca2a98e7d617e1bca2b2f814a598e94f89186c6e"
],
[
"LICENSE",
"ddfa51eaa264bc020ac65023e52f60be1d8cc1cd"
],
[
"README.md",
"4bd9961c2069ed23739d4bc93e4c990b894220c8"
],
[
"init/forgeext.init",
"92ccf1db95dbd423bcd5350510e340e48a4ec474"
],
[
"sdk/c/ffx.h",
"0ceb482c3b279883120390b244a1dbeac5b2bd90"
],
[
"sdk/js/ffx-bridge.js",
"427b0de01fdcc257892ac94b379e6c5ce935f656"
],
[
"sdk/python/ffx.py",
"c36bd5d87ab73abe8c4798e0eeffa43b70473367"
],
[
"sdk/python/modules.txt",
"a36cf5be6f6cc00f152051704d41fc5c9f8bb368"
],
[
"sdk/sh/ffx.sh",
"d4339c7189cd94222fc700c53108433b140cd284"
],
[
"src/api.c",
"69f9f0c36b7514c0a8c0e15d7bc8710f7583f43a"
],
[
"src/api.h",
"e66ff59063220281b634502e6a30c59356defeaa"
],
[
"src/call.c",
"acbe52a3dcbb3826ed6a55b875b04a6aee779437"
],
[
"src/call.h",
"a267f83ccc5748db15ab7ad9283d7fafab10907c"
],
[
"src/caps.c",
"5556ef7b7ac8bc6e9b385e8afde36c68722f3f82"
],
[
"src/caps.h",
"4fb5f841bfe54271b92d29868b8cb63751a3c78a"
],
[
"src/cgroup.c",
"d8a2885addbdae1c6368749a3eb70989daa5a3ce"
],
[
"src/cgroup.h",
"d3c19f05e39231bdffe4318ae64d79596d52ab1f"
],
[
"src/evfeed.c",
"9c045819f6f3dd68f2b60f276874260ba278d99e"
],
[
"src/evfeed.h",
"fcb4aa05827652cdc8569528f08c562c5b82ee18"
],
[
"src/fflog.c",
"cdeb518386db022df74cbfff89008bf17f5a864c"
],
[
"src/fflog.h",
"905314b0d5be06487faecdf97720e23d2506bb4e"
],
[
"src/holdkeep.c",
"5c36d98ad2029cf902aa6d28b291b7c606e9176c"
],
[
"src/holdkeep.h",
"40a7b61402dd950f1f200f43e52a5efea8a13f3b"
],
[
"src/httpreq.c",
"92bc555663ddeca6efb0a09b94fea4100c1adf39"
],
[
"src/httpreq.h",
"b5aa388e266dadfd97f60d453eabd5e77c48b28d"
],
[
"src/index.c",
"4d978856be8acfce5937243657934fef4ba8b862"
],
[
"src/index.h",
"77de12d92eaf9b36520701f4b66de4a88407e611"
],
[
"src/install.c",
"0943e916ac0eeb96b26f9217c73f65ee13204888"
],
[
"src/install.h",
"68536455344cbb1f2fb9e59934edc3a32e3b0509"
],
[
"src/machine.c",
"f662542c4c5fb056662e951b918d6531c7732679"
],
[
"src/machine.h",
"3f2c42285972f334e7adca30bb3675bf80e6b27d"
],
[
"src/main.c",
"a36bc6076bc71e9815a0c1676420afc7921a99cc"
],
[
"src/manifest.c",
"b6bff9cb3a3e1ac51ce4b12a0ae1c77d293d8573"
],
[
"src/manifest.h",
"9c4f18f63080c8564e023374367c521f07b5ac63"
],
[
"src/netrules.c",
"2d8cfaa9ae2830ae070bc7784e843d8e162838c8"
],
[
"src/netrules.h",
"b5a72ed91127568de6a70c9debfb6260a21a3b5a"
],
[
"src/pkg.c",
"c1c1058396df7cf86ae1067c9cd582491fb8300c"
],
[
"src/pkg.h",
"9653a70c7be351ba21176f3b1cde35a78d31d592"
],
[
"src/quota.c",
"8ceea5997ac5ff1efba6cf69e5a3fb579a2520e2"
],
[
"src/quota.h",
"fda75152302e168cd713bbf7e62d089ff9c1f24d"
],
[
"src/run.c",
"6e8502051f49cb44c26c252e4d122484299ee0c3"
],
[
"src/run.h",
"d1ec00cdadd0bbb2f92186c562c1e244795247b5"
],
[
"src/sandbox.c",
"40c2902f41b7d82cd4501f821efbecf92b5dae25"
],
[
"src/sandbox.h",
"7ca05359f6a5bf050237418daa5b38b3bb83034e"
],
[
"src/settings.c",
"08e79bc15cb9a92b0439b99dc9c86ccdf5d5c1ee"
],
[
"src/settings.h",
"bb6e8ee5b54fc3e98d4f0d100c1dafacd7598163"
],
[
"src/state.c",
"87e4e7f9e883993c977e3bc93f95dfb908d95379"
],
[
"src/state.h",
"3ccfd53bb5dc1b13805de2bd91d496eeca34652c"
],
[
"src/super.c",
"1eef517ece818aaf627b71dcfdeae05c59f9df86"
],
[
"src/super.h",
"79019eb1ade6a033b28e61efaa186b52fec737ff"
],
[
"template/data/manifest.json",
"07aadf26e94ab9825573a03da9ee008104c63ac4"
],
[
"template/native/manifest.json",
"c6385b2bbfaec3c6fd0bfda1231365fa1089afa8"
],
[
"template/native/src/main.c",
"3dbc07efd6c7523126a76835a43374e25def2298"
],
[
"template/python/bin/run.py",
"58308c655e8c30a12fad772ddd1629d89b476ffe"
],
[
"template/python/manifest.json",
"1a9cc4ec72e3de8d79550c8f5c26721f6ab9493e"
],
[
"template/repo/Makefile",
"6041642e199bace88fa22dfaa8250fbd5105d4b3"
],
[
"template/repo/Makefile.native",
"ca32e8c0c897720376c647cdb86502c9971a9346"
],
[
"template/repo/README.md",
"6b8ac777e15e31bc1ebc2858f8e1b49381d51d4d"
],
[
"template/repo/gitignore",
"1106eb0b9d8b57f1cf8f2dea198a932b391ece08"
],
[
"template/repo/package.yml",
"b345d4c66b8948d8bb8ff181e0c287cd2df15748"
],
[
"template/shell/bin/run.sh",
"656569869e523aabb6b5a0c7babeb0c4c68121b0"
],
[
"template/shell/manifest.json",
"6024f59e36cdc71972daacd5de9df28897ae09a9"
],
[
"template/ui/manifest.json",
"46a7f0aec88e0cb39909f60f9966837848a10bcb"
],
[
"template/ui/ui/index.html",
"1ad50d40dd135dd0120e07651a7f8199c460b724"
],
[
"tests/api_test.c",
"125a39150f9f933d33f88caaea7ce9f2339a71ef"
],
[
"tests/caps_test.c",
"59160bf3b00621040b2756bb2849a1086724bfd0"
],
[
"tests/evfeed_test.c",
"82d266a1e0bdd98c26697842c7fb5d3990161e34"
],
[
"tests/ffx_test.py",
"529cfedc7596f5fc893d6cfe8b62d8184bf57164"
],
[
"tests/holdkeep_test.c",
"fbfc6daaa4de6c2371c10f9d11685b4c25930743"
],
[
"tests/httpreq_test.c",
"cd7bebe6418d8d9a5523e90ebc69cc5d7d83e49c"
],
[
"tests/install_test.py",
"d85760a49e6ada83f9293236e95a8fd749ca26af"
],
[
"tests/manifest_test.c",
"ba4e0c050be5da978e0e297ecdc566e66de30a2e"
],
[
"tests/netrules_test.py",
"2c2c6eb477632b225e9add19cbef39056dc11d2d"
],
[
"tests/quota_test.c",
"8d2dab526aac9edbadf5270e21767bf2cb1d0d90"
],
[
"tests/run_test.py",
"fd06dfe55e8c7febbef4446fdb380691ff96e0ba"
],
[
"tests/sandbox_test.c",
"49c6e957d2714fb02dc2b28992724f2f31922704"
],
[
"tests/sdk_native.c",
"98d3e9d849e765b4a1920950863824aca2305fd1"
],
[
"tests/sdk_test.py",
"e7b3460fa53ea4562b14f376aad644249f687864"
],
[
"tests/settings_test.c",
"12ddef8882681b210e0d3a90ac5b6c6052fe27b8"
],
[
"tests/state_test.c",
"084c462d77c5ba8aa9c74014af4506e3edcd07e2"
],
[
"tests/super_test.c",
"3dbfa2bec74cfa1f2d921b3aabf4da613894fcc1"
],
[
"tests/version_test.c",
"905f0f74881aeb0468420ed39b17f27b51bd5515"
],
[
"tools/ffx",
"2345fdfb4036125b539b88c0993b8e208bfc0599"
],
[
"tools/mkffx.sh",
"137f9a62fa000b4200c0b76499a4e98ef4bd333f"
]
],
"pv": "0.1.5",
"recipes": [
"forgeext"
],
"source": "git://github.com/openglow-org/forgeext.git",
"srcrev": "ebd959256d3da9f648d6975ba740bee86ad69c7b"
},
"forgefirm-app": {
"component": "forgefirm-app",
"files": [
[
".gitattributes",
"1b30e1b56dcc0411c10ee780053d04f1c9d862e1"
],
[
".github/workflows/host-tests.yml",
"58584524c1d484feb3ca9e4b3f1cc8bc1b4e6516"
],
[
".gitignore",
"2d6f9ccefa02c61cfd5cabc2d8b171025eadce09"
],
[
"AGENTS.md",
"4a7ce5a094fd55cfadafa0163e297f58bce92d53"
],
[
"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",
"621060d3dcc1873095875fc83e532616c6fc1283"
],
[
"gfhardware/__init__.py",
"d4145850379d8919241f1de6d5148f275146987d"
],
[
"gfhardware/_common.py",
"d431911c90c0fea6bf3d8d869c8fbd23c3ff398c"
],
[
"gfhardware/cam.py",
"dd082c7c91e5ce5a1932585d454185d1558863f7"
],
[
"gfhardware/cnc.py",
"63f3d5a5544bb602ae8efd2b11c69c4ae84fc502"
],
[
"gfhardware/cooling.py",
"418a689e7958efbb39606848436b2c63dbec476d"
],
[
"gfhardware/coolsvc.py",
"8ddd091c31b5ff137b059954544e5150df448999"
],
[
"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",
"fe458d2d4722c9f25fb465e4496f3cef70af3f6f"
],
[
"tests/test_feeder.py",
"97128d63718ac1145c9f0a7d9a2ec792e6eaa136"
],
[
"tests/test_ffmachine_agent.py",
"4620f0f6969ff340ec4dea9898bec52f1f912c7b"
],
[
"tests/test_ffmachine_emulator.py",
"48903249737d886cb65cd85e7132e0c56d84b71c"
],
[
"tests/test_ffmachine_park.py",
"e83d97622e8807657374c87ea443f4ba1ef7ba58"
],
[
"tests/test_gfhome_exit.py",
"d78d5def849e143687558d4e53931cd4c3549584"
],
[
"tests/test_gfhome_motion.py",
"581547f9565dadbeb88d72bea06c88426e31b7e1"
],
[
"tests/test_limits.py",
"927ca8f77cd35c55a295484ae1179e745636ac38"
],
[
"tests/test_machine_lid_button.py",
"70fe5c0e850c675ff42868d2bdf3e54502abc11e"
],
[
"tests/test_report_secret.py",
"dc1c01f094f658fa715530612ee6ef1e0915051f"
],
[
"tests/test_switch_bits.py",
"2c8acd285c9a7cea4c8ae0c8285b556f753c1b23"
]
],
"pv": "0.1.33+git",
"recipes": [
"gfcloud",
"gfhome",
"python3-ffmachine"
],
"source": "git://github.com/openglow-org/python3-gfhardware.git",
"srcrev": "6fb146a13c51765eec492bf758946e573ae25297"
},
"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",
"4711297eb47c611f5bebb683aaf3a9fc139e3bf9"
],
[
"bench.py",
"7a32a52423325ec0b844ae6fa4d5620fee91af29"
],
[
"campaign.py",
"0e937d9b600fe21651085dee8987dd7db9bdf2d7"
],
[
"catalog.py",
"b3fd77c15b8932d95451c456f9f1914ffce1097b"
],
[
"coverage.py",
"6080b3275a4a7f53c830ccef48c207e266819cb5"
],
[
"fixture.py",
"ee907b19c040246ec0be88d444a9386ab50aacd5"
],
[
"hw.py",
"56f0bff7e208523c7ce47895dc185758b8c47d33"
],
[
"log.py",
"8df1445460358bca4027d1a4a49189ba13dbc0de"
],
[
"manifest.py",
"bc9ba99aa98f019c30b89d3cd39afa11c62e7ed1"
],
[
"page.py",
"c6c3579acd78578aebf7404cac589d07eaf4c55b"
],
[
"puls.py",
"07bf06dd7f119ad59b1ecbf4295e9d4c4ce92d0d"
],
[
"redact.py",
"f445da45df0e36c8dcb6b17d0a851610880e3ce3"
],
[
"runner.py",
"d23028d2fa8eba9099fc156ad0537b0b669533bc"
],
[
"server.py",
"70d3bc5bc1c2299264a5f4576e7d664ed71f860c"
],
[
"suite/__init__.py",
"e31d4cfa33b69ce7eb28edce42ce95f42a964210"
],
[
"suite/camera.py",
"22e1c733759c9c2b50d9ac49dda899ae8230d371"
],
[
"suite/cloud.py",
"490baa7f41afb43c3cbf80f8efc7a0ce5b2cf935"
],
[
"suite/cooling.py",
"cc6349c2aaa6258d0e5419a26cc8a75a5aeb344e"
],
[
"suite/exthost.py",
"292de2cc8db0f608461c881f11b4d904c840888b"
],
[
"suite/forgectrl.py",
"278338b0d7e64d51155869c7dcb122a7d3425104"
],
[
"suite/homeoff.py",
"021aa0b3922614091422251f7dfa1ed6222b3d48"
],
[
"suite/image.py",
"61d1986daffa4e1fa0b4d64bcf103b5d278b6174"
],
[
"suite/kernel.py",
"3df2be14eea6020ca998ec3e624beeb0dcb8c855"
],
[
"suite/laser.py",
"478dedb2d16f3e66585b9e829700de0c2aa5708f"
],
[
"suite/motion.py",
"3a661ce27d631df402e37025d846d5ebbdd041aa"
],
[
"suite/setup.py",
"f422a7df126aa54990ca6ac08ac41ef76986e24d"
],
[
"suite/setup_burns.py",
"d65079a39286d0781b0a0a495e8ff02eb51d73f5"
],
[
"suite/setup_dark.py",
"12a9d33bb1aa309a3fc89bf9616a499885fa2cf4"
],
[
"suite/tlsrec.py",
"5d3a22f4eabdafcfd028a866b5387fc1d0525fb2"
],
[
"suite/update.py",
"f799f741a365e0073f96263315bb7eb018c75078"
],
[
"ui/app.js",
"fa9674b2ca941800907e93559825b42911152945"
],
[
"ui/help.js",
"761a503f2f50c1e519185dcfd47c1caa2de29fb4"
],
[
"ui/index.html",
"036e239f1196844ca2ac13df1dba59ca1c0bd060"
],
[
"ui/page.css",
"b76d4361af04596b79285a55cc205d05a0491a44"
],
[
"ui/theme.css",
"9de9131fcf4cc62541a5f1a89d7468d39fe3a237"
],
[
"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",
"1cfce87ffb70796e55d901a004888facffe45357"
],
[
".gitignore",
"4bda5643103df4c29ca3dbad4c841a738cee1b1a"
],
[
".gitmodules",
"d5e7f2dead5cfb1b00fd67e4355991eb35658914"
],
[
"AGENTS.md",
"40282c56d0e3506ff72692d22db5e77bedb1bdde"
],
[
"CMakeLists.txt",
"6af75f41bf19c5c4a4bde335e512bfe630ae3f62"
],
[
"CONTRIBUTING.md",
"ca2a98e7d617e1bca2b2f814a598e94f89186c6e"
],
[
"COPYING",
"96d5f44439ba4cecf32c1b46ed3a76fc7749488b"
],
[
"README.md",
"35f668db03d26355cc5badd844351cdb36f1b6c8"
],
[
"src/bind_addr.c",
"3ca3b27ed265c0c52e25eca97291c2e5f20a0b1d"
],
[
"src/bind_addr.h",
"2e3250924b9d757eea4872c6fac2d3830b11dc1b"
],
[
"src/boards/glowforge.h",
"dbb357c6ab412065e710ff5330b3a488a96e992d"
],
[
"src/build_info.h.in",
"9741f1b5f5c8efbd539dea783b0481339e88f0b2"
],
[
"src/ctlport.c",
"8487b859999bf55fdd053005637928961c814af3"
],
[
"src/ctlport.h",
"413b5bc04893b721a469c29c94db923b652271ba"
],
[
"src/driver.c",
"55efa3bda71d9b9a460ee420963627a6db51a614"
],
[
"src/driver.h",
"1e2e734779a8565c6b00e69c98d31134428cac5f"
],
[
"src/eeprom.c",
"eed4727a479c43704881b62659f6825eb514ebd1"
],
[
"src/eeprom.h",
"07be4c8c8b1e432824cb3c791915b18836c9997e"
],
[
"src/fflog.c",
"cdeb518386db022df74cbfff89008bf17f5a864c"
],
[
"src/fflog.h",
"905314b0d5be06487faecdf97720e23d2506bb4e"
],
[
"src/glowforge_cooling.c",
"1d8f01e410af3028b20a2ba902dbea68a48998f4"
],
[
"src/glowforge_cooling.h",
"ae576b4fc50dee5ddaced1c9544476cdfce08888"
],
[
"src/glowforge_homing.c",
"c17826cf15d6ec0e25ad63873cd897ebfb3a9987"
],
[
"src/glowforge_homing.h",
"5a16cd9e82aba4ea40ebb8d89b4d58e136f95f9b"
],
[
"src/glowforge_io.c",
"3cc1e3b18647333d36f7cbe1661f526c62addd9d"
],
[
"src/glowforge_io.h",
"7b714e9e1928501b25ecd6818f3840f5354e0dc9"
],
[
"src/glowforge_laser.c",
"29767c8ff4579cfdd9a89667fd9e437010a3b6fe"
],
[
"src/glowforge_laser.h",
"bc500d8c8fc5d8cd851d3a4649342bbe83f67eee"
],
[
"src/glowforge_mcode.c",
"acec01e2f661250b4c1c927c5565dcbc843a057e"
],
[
"src/glowforge_mcode.h",
"d2db188cae7d8c56af263396d08a0f9685bff63f"
],
[
"src/glowforge_release.c",
"8ff24224d43b73385e09f6c3c2112269047a6203"
],
[
"src/glowforge_release.h",
"c488fe5b59a506394f3477757f454d773dbca0f3"
],
[
"src/glowforge_status.c",
"973e206fe37affed7950aba4a74f7f6d3ca1def2"
],
[
"src/glowforge_status.h",
"584b00fe13fbe9f8887b3a77f41d19bc66bda339"
],
[
"src/glowforge_switch_map.h",
"ea33a30bd29a6945599023db3fd3858a21cefae7"
],
[
"src/glowforge_switches.c",
"98bc9c0e1147c0c42298d268266f97c36625c785"
],
[
"src/glowforge_switches.h",
"06e394de0bee4987a569f1d180d1ab1b08069e3b"
],
[
"src/glowforge_tray.c",
"9a631b415507939f20c3369c417a3b725e07ca3e"
],
[
"src/glowforge_tray.h",
"484e807b7736ffc17abf990bcff8e4e6112c2916"
],
[
"src/grbl",
"a3a8d3990604898ef611b9f22f057b4f9405f16e"
],
[
"src/grbl/.gitattributes",
"eb84b66b54a17195a184d5533e31919eb25c591c"
],
[
"src/grbl/.gitignore",
"572825f878d3b06754a0d2de957b14d2e26936b5"
],
[
"src/grbl/AGENTS.md",
"e2e8f312aa149b0731ffd16d86c3ba94a12731b4"
],
[
"src/grbl/CMakeLists.txt",
"c537b82256f2fff209d9f365e73ed1a9587b0c8c"
],
[
"src/grbl/COPYING",
"c7d0e6fe45d03d4e29d624028fc3b62290bfeed2"
],
[
"src/grbl/FORK-CHANGES.md",
"90b4250623f67f07a57f322382391502415240d2"
],
[
"src/grbl/README.md",
"46397c5447170ee6dc5bc5b90aec11eeced87ea8"
],
[
"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",
"9068be93aa5ed21c701b76d5d85730bb6eee0a71"
],
[
"src/my_machine.h",
"ddad566c397741ec66a25d38ef99aca9df643d5a"
],
[
"src/platform.h",
"25ee54c4a9c1094f4321c411ecc775753962ce6e"
],
[
"src/platform_linux.c",
"29e014ab05f488b37c218595d698358f6a48abba"
],
[
"src/serial.c",
"a3de978f199a95cf257653213bb42cf9ccfe4978"
],
[
"src/serial.h",
"9c6b6129e737ac8cc6a677f153f7cd4c187defdc"
],
[
"src/stepper_stream.c",
"6bbd032b42c62d96f44cc57e8408e1f8a9969ff2"
],
[
"src/stepper_stream.h",
"f469e3d405ab76f290a8422172d68c52bb5305ac"
],
[
"tests/cooling_test.c",
"542f24d0a9aa101ece74d971d8648ef9619b120a"
],
[
"tests/laser_arm_test.c",
"624b7940dc9619441d7fdfa689788bf9333e0caa"
],
[
"tests/latch_test.c",
"a415756ebbee81405f74ab646ee142f4d9fe8ee2"
],
[
"tests/lens_home_test.c",
"af867bd9bc31db334957532cf4b693b96bdf3999"
],
[
"tests/serial_test.c",
"bf1e04288123a0d3e73ab8d6e53f95e6765f99b5"
],
[
"tests/switch_map_test.c",
"55120d21731b854b3be997a20b0f4d963c7ff4c6"
],
[
"tests/switches_test.c",
"c8c482807b9580de71821c5aaa851cca4d5c69b3"
],
[
"tests/xy_scale_test.c",
"6b681fdc0b45e9dbed1dc2a2c0c699535435dd37"
]
],
"pv": "0.1.22",
"recipes": [
"grblhal-glowforge"
],
"source": "gitsm://github.com/openglow-org/grblHAL-glowforge.git",
"srcrev": "e15972005c6e3e3b5bcb4d7408df0eaf83b5cc43"
},
"kernel-module-glowforge": {
"component": "kernel-module-glowforge",
"files": [
[
".gitattributes",
"1b30e1b56dcc0411c10ee780053d04f1c9d862e1"
],
[
".github/workflows/build.yml",
"2073e161c4686ed9a06ca211ea869ee3b60945b9"
],
[
".gitignore",
"9ade51c849fa44bc129ca7e4c07d7e8b6faf4107"
],
[
"AGENTS.md",
"a2a38f6e336ae884533f4470af9ebae99febbe52"
],
[
"CONTRIBUTING.md",
"ca2a98e7d617e1bca2b2f814a598e94f89186c6e"
],
[
"LICENSE",
"d159169d1050894d3ea3b98e1c965c4058208fe1"
],
[
"Makefile",
"b1cb12d2bc437a8de5a015b7f86f3c452ee58c3f"
],
[
"README",
"7d5f0f7761ccd4ded2e5e37b0013d73a52074565"
],
[
"asm/sdma.asm",
"34e14740ca57a743854b1a0229b61cda8f00d0e5"
],
[
"src/cnc.c",
"63cdd026ece408d73f947b95e795aa9cdba084fa"
],
[
"src/cnc.h",
"fdc00c9d5259cf97bec90da3396308f00c1acbab"
],
[
"src/cnc_api.c",
"988a3658ef3885bbf0c32e98e12ffeaadf20eab9"
],
[
"src/cnc_backtrack.h",
"2dba5e6fbc354b8de520095771315054b27cfc21"
],
[
"src/cnc_buffer.c",
"211748e67583557f0c86f2ed5d6843831c2e8d8c"
],
[
"src/cnc_interlock.c",
"534f77c8260c309d8bd84f3899c4f3d632b542fb"
],
[
"src/cnc_interlock.h",
"9924eead9eb5885f46e82b064795f3c0d4d5aede"
],
[
"src/cnc_pins.c",
"408787d5d33da596c22ed3f23ed6cbaeb9299091"
],
[
"src/cnc_pins.h",
"590c3eb676effbf67a4668c6507eb26785a5e2f5"
],
[
"src/cnc_private.h",
"503cc5c768d34078be0d7d3bd7ad7fdf3815ab09"
],
[
"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",
"991d85d39d5cfe1df57355be4f86933172245502"
],
[
"tests/interlock_test.c",
"c4834dd119167672e0b6cc17f2ac745991cfccdc"
],
[
"tools/mx51_sdma_set.pm",
"34379246106cca3bd2aab4c8475fcadbd48848f9"
],
[
"tools/sdma_asm.pl",
"003c76c9b2e7f7b6103ce288a53af82bb9bf5885"
]
],
"pv": "0.0.8",
"recipes": [
"kernel-module-glowforge"
],
"source": "git://github.com/openglow-org/kernel-module-glowforge.git",
"srcrev": "dab378da805d8a31ecb6906d51fcfd3cefe3789f"
},
"linux-fslc": {
"component": "linux-fslc",
"config_sha256": "0132e95f6134ff0c6a1cd1ff4aff3709ce5f55d786c4b5090219d33cf3d14176",
"files": [
[
"@config",
"0132e95f6134ff0c6a1cd1ff4aff3709ce5f55d786c4b5090219d33cf3d14176"
],
[
"@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",
"4a7ce5a094fd55cfadafa0163e297f58bce92d53"
],
[
"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",
"621060d3dcc1873095875fc83e532616c6fc1283"
],
[
"gfhardware/__init__.py",
"d4145850379d8919241f1de6d5148f275146987d"
],
[
"gfhardware/_common.py",
"d431911c90c0fea6bf3d8d869c8fbd23c3ff398c"
],
[
"gfhardware/cam.py",
"dd082c7c91e5ce5a1932585d454185d1558863f7"
],
[
"gfhardware/cnc.py",
"63f3d5a5544bb602ae8efd2b11c69c4ae84fc502"
],
[
"gfhardware/cooling.py",
"418a689e7958efbb39606848436b2c63dbec476d"
],
[
"gfhardware/coolsvc.py",
"8ddd091c31b5ff137b059954544e5150df448999"
],
[
"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",
"fe458d2d4722c9f25fb465e4496f3cef70af3f6f"
],
[
"tests/test_feeder.py",
"97128d63718ac1145c9f0a7d9a2ec792e6eaa136"
],
[
"tests/test_ffmachine_agent.py",
"4620f0f6969ff340ec4dea9898bec52f1f912c7b"
],
[
"tests/test_ffmachine_emulator.py",
"48903249737d886cb65cd85e7132e0c56d84b71c"
],
[
"tests/test_ffmachine_park.py",
"e83d97622e8807657374c87ea443f4ba1ef7ba58"
],
[
"tests/test_gfhome_exit.py",
"d78d5def849e143687558d4e53931cd4c3549584"
],
[
"tests/test_gfhome_motion.py",
"581547f9565dadbeb88d72bea06c88426e31b7e1"
],
[
"tests/test_limits.py",
"927ca8f77cd35c55a295484ae1179e745636ac38"
],
[
"tests/test_machine_lid_button.py",
"70fe5c0e850c675ff42868d2bdf3e54502abc11e"
],
[
"tests/test_report_secret.py",
"dc1c01f094f658fa715530612ee6ef1e0915051f"
],
[
"tests/test_switch_bits.py",
"2c8acd285c9a7cea4c8ae0c8285b556f753c1b23"
]
],
"pv": "1.0",
"recipes": [
"python3-gfhardware"
],
"source": "git://github.com/openglow-org/python3-gfhardware.git",
"srcrev": "6fb146a13c51765eec492bf758946e573ae25297"
},
"python3-gfutilities": {
"component": "python3-gfutilities",
"files": [
[
".gitattributes",
"b5fe1536d1689e8526dae30678ac352ee0d8a3ff"
],
[
".github/workflows/host-tests.yml",
"c51a26d023751d891d3fc5a492cafba9978970ce"
],
[
".github/workflows/release.yml",
"4d56756fafce28ced411807fd054f781962a46ec"
],
[
".gitignore",
"c55e64f1e292b91b593c9b55fb6bb6dc8f0245ab"
],
[
"AGENTS.md",
"1221e0fbfea45f6db7619319425d9ebc7494d80f"
],
[
"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",
"f1a47de1185d165942acad1adf62a29201ece8a5"
],
[
"requirements.txt",
"6408a4e749a2c4011916373f3c35279f61a80442"
],
[
"setup.py",
"89a704ba9939195fd8a222f094877e05a223502b"
],
[
"tests/test_basemachine.py",
"e96b1b1d6dcd2d4d31cd8fc7de50a168567e6838"
],
[
"tests/test_dispatch.py",
"e9703429bc02de983b4760d1f91665e2a0cc91ee"
],
[
"tests/test_firmware_policy.py",
"364920b74dca5b5aec0e9df55d54b0a51d95d448"
],
[
"tests/test_frame.py",
"80ae7b2acb7642f5ca83d675c717677abd1a6273"
],
[
"tests/test_lifecycle.py",
"7a69a015f59f3d40afca77d9d3c356b58b6dc3ad"
],
[
"tests/test_offline.py",
"281dabc1d7232a9923dafa3f75474da6560a85c7"
],
[
"tests/test_puls_header.py",
"d05dc2d3af19e4aed6b16adfedd596bad8c8f592"
],
[
"tests/test_pulse_source.py",
"2065a943cd1a06f9b02c89c2aaba73b6755472f9"
],
[
"tests/test_pulsedata.py",
"aa2185a0f536118489cbe0f9fbd46db915f1e304"
],
[
"tests/test_user_agent.py",
"e3629ffc4acb1063a5443e0bb700b414bd54e5b3"
]
],
"pv": "0.9.21+git",
"recipes": [
"python3-gfutilities"
],
"source": "git://github.com/openglow-org/Glowforge-Utilities.git",
"srcrev": "b9e74b8c0238a994fd19308f13ce1ff54591eb39"
}
},
"content_sha256": "70ecd7867c2698d17f2f3c38db772868eda3364f541242c93fb5db4e1d593bcd",
"format": 1,
"image": {
"name": "forgefirm-image-dev",
"version": "20261018222431 (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": "d7a98e2fdf32b4de85c467c32013300e554f64080902a800e3f300952e3abb7a"
},
"meta-freescale": {
"rev": "b699d026506a6fc402e03afb432dcabd3d81c7ab"
},
"meta-freescale-distro": {
"rev": "b9d6a5d9931922558046d230c1f5f4ef6ee72345"
},
"meta-glowforge-bsp": {
"content_sha256": "a2a42a79d36b81aa35ed3b5b32380f408bd422dca3dc381799826cdafe849a0b"
},
"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": "70ecd7867c2698d17f2f3c38db772868eda3364f541242c93fb5db4e1d593bcd",
"sha256": "97018f73354c1b768b893f1538c43d8c506e06e8bd788ab4e194968910c4e5f1",
"tests": [
{
"always": true,
"covers": [
[
"forgectrl",
"init/**"
],
[
"forgeext",
"init/**"
],
[
"forgectrl",
"src/main.c"
],
[
"forgectrl",
"src/auth.c"
],
[
"forgectrl",
"src/status.*"
],
[
"forgectrl",
"CMakeLists.txt"
],
[
"grblhal-glowforge",
"src/boards/**"
],
[
"grblhal-glowforge",
"CMakeLists.txt"
],
[
"kernel-module-glowforge",
"**"
],
[
"linux-fslc",
"**"
]
],
"fingerprint": "c09a5064128085b64beeaaed3c15522b475e47169d7246414ff938667998ee2b",
"hardware": "api",
"id": "image.health",
"inherited": false,
"kind": "auto",
"record": {
"answers": [],
"campaign": "c-20261018224638-4ca0",
"duration_s": 0,
"evidence": {
"/data/forgefirm": "711",
"/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 |___/ 20261018222431 (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 |___/ 20261018222431 (dev)\n\n",
"CONFIG_IMX2_WDT": "y",
"CONFIG_PANIC_ON_OOPS": "y",
"CONFIG_PREEMPT": "y",
"accept_ra": "1",
"baseline": {
"post": [],
"pre": []
},
"batch": {
"group": "unattended",
"ts": "2026-10-18T22:46:38Z"
},
"cnc_free": 33521664,
"cnc_pool_bytes": 33554432,
"cnc_ring_bytes": 33554432,
"cnc_state": "idle",
"data_free_mb": 2768,
"dev_image": true,
"dhcp6_running": [],
"disable_ipv6": "0",
"extension_host_pids": [
481
],
"extension_packages": [],
"factory_mounts": [
"/factory/img1",
"/factory/img2"
],
"fixture": {
"channels": [
"lid",
"interlock",
"button"
],
"hostname": "<REDACTED-1>",
"ip": "<IP-2>",
"released": []
},
"forgectrl_pids": [
472
],
"forgefirm_version": "20261018222431 (dev)",
"getty": [
"/sbin/getty -L 115200 ttymxc0 vt102"
],
"global": [],
"ifstate": [
"lo",
"wlan0"
],
"ifup_running": [],
"kernel_release": "6.12.20-fslc-fslc-g21f36a8c1ebe",
"link_local": [
"<HEX-1>"
],
"mode": {
"controller": "running",
"gated": false,
"local": false,
"mode": "grbl",
"motion": "verified",
"pid": 589,
"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"
}
},
"pool_processes": 0,
"pulse_device_holders": [
472
],
"record_accounts": [
"scott"
],
"sdma_clk_enable_count": "1",
"temps": {
"chassis_c": 29.2,
"soc_c": 46.8,
"soc_throttle": 0,
"supply_raw": 593
},
"udhcpc": [
"udhcpc -R -b -p /var/run/udhcpc.wlan0.pid -i wlan0 -x hostname:forgefirm-b00a"
],
"userspace_watchdog_pids": [],
"watchdog": {
"bootstatus": "0",
"identity": "imx2+ watchdog",
"period_s": 60.0,
"state": "inactive",
"timeout": "60",
"wcr": "0x771f",
"wde": true
}
},
"fingerprint": "c09a5064128085b64beeaaed3c15522b475e47169d7246414ff938667998ee2b",
"image": "20261018222431 (dev)",
"log": [
"22:46:38 start image.health (auto, api) in campaign c-20261018224638-4ca0",
"22:46:38 fixture up: <REDACTED-1> at <IP-2>, v1.0.0, covers lid, interlock, button",
"22:46:38 fixture: <REDACTED-1> at <IP-2> covers lid, interlock, button",
"22:46:38 queued by the unattended queue opened 2026-10-18T22:46:38Z",
"22:46:38 baseline: pre: clean",
"22:46:38 forgefirm-version: 20261018222431 (dev) (manifest: 20261018222431 (dev))",
"22:46:38 CONFIG_PREEMPT=y",
"22:46:38 CONFIG_IMX2_WDT=y",
"22:46:38 CONFIG_PANIC_ON_OOPS=y",
"22:46:38 watchdog0: {'identity': 'imx2+ watchdog', 'state': 'inactive', 'timeout': '60', 'bootstatus': '0', 'wcr': '0x771f', 'wde': True, 'period_s': 60.0}",
"22:46:38 kernel release 6.12.20-fslc-fslc-g21f36a8c1ebe (manifest modules dirs: 6.12.20-fslc-fslc)",
"22:46:38 cnc/state: idle",
"22:46:38 cnc/free: 33521664 bytes",
"22:46:38 cnc-pulsebuf pool: 33554432 bytes, ring_mb: 33554432 bytes",
"22:46:38 sdma clk_enable_count: 1",
"22:46:38 forgectrl pids [472], holding /dev/glowforge: [472]",
"22:46:38 mode: {'mode': 'grbl', 'controller': 'running', 'pid': 589, 'motion': 'verified', 'gated': False, 'local': False, 'why': ''}",
"22:46:38 temps: {'chassis_c': 29.2, 'supply_raw': 593, 'soc_c': 46.8, 'soc_throttle': 0}",
"22:46:38 extension host pid [481], packages [], pool processes 0",
"22:46:38 /data/forgefirm/panel.token mode 600",
"22:46:38 /data/forgefirm/forgefirm.conf mode 600",
"22:46:38 /data/forgefirm mode 711",
"22:46:38 /data free: 2768 MiB",
"22:46:38 / mounted ro,relatime; /data rw,relatime; /var/lib rw,relatime",
"22:46:38 dev image True; /factory mounts: ['/factory/img1', '/factory/img2']",
"22:46:38 manifest 70ecd7867c26: 10 components",
"22:46:39 wlan0: 1 link-local, 0 global IPv6 address(es)",
"22:46:39 baseline: post: clean",
"22:46:39 result PASS"
],
"manifest_sha": "70ecd7867c2698d17f2f3c38db772868eda3364f541242c93fb5db4e1d593bcd",
"message": "",
"result": "PASS",
"test": "image.health",
"ts": "2026-10-18T22:46:39Z"
},
"requires": [],
"satisfied": true,
"source_sha": "e853691c651c9d51475848e8227713aad1752e2cd9f17b4ebb6c9ae448adc5ca",
"subsystem": "image",
"title": "Post-flash image health"
},
{
"always": true,
"covers": [
[
"kernel-module-glowforge",
"**"
],
[
"linux-fslc",
"**"
],
[
"forgectrl",
"src/super.c"
],
[
"grblhal-glowforge",
"src/glowforge_laser.c"
],
[
"grblhal-glowforge",
"src/driver.c"
]
],
"fingerprint": "5b5c6673f7129c32caed954646694a36a2d29541616204dec59fb10c36079005",
"hardware": "api",
"id": "kernel.latch-locked-idle",
"inherited": false,
"kind": "auto",
"record": {
"answers": [],
"campaign": "c-20261018224638-4ca0",
"duration_s": 0,
"evidence": {
"baseline": {
"post": [],
"pre": []
},
"batch": {
"group": "unattended",
"ts": "2026-10-18T22:46:38Z"
},
"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": "5b5c6673f7129c32caed954646694a36a2d29541616204dec59fb10c36079005",
"image": "20261018222431 (dev)",
"log": [
"22:46:39 start kernel.latch-locked-idle (auto, api) in campaign c-20261018224638-4ca0",
"22:46:39 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
"22:46:39 fixture: <REDACTED-1> at <IP-1> covers lid, interlock, button",
"22:46:39 queued by the unattended queue opened 2026-10-18T22:46:38Z",
"22:46:39 baseline: pre: clean",
"22:46:39 cnc/state: idle",
"22:46:39 interlock_circuit: 45 (0x2d)",
"22:46:39 laser_enable (FIRE line): 0",
"22:46:39 laser_on: 0, laser_on_sampled: 0",
"22:46:39 faults: 0",
"22:46:39 forgectrl /status laser_locked=True state=idle",
"22:46:39 baseline: post: clean",
"22:46:39 result PASS"
],
"manifest_sha": "70ecd7867c2698d17f2f3c38db772868eda3364f541242c93fb5db4e1d593bcd",
"message": "",
"result": "PASS",
"test": "kernel.latch-locked-idle",
"ts": "2026-10-18T22:46:39Z"
},
"requires": [],
"satisfied": true,
"source_sha": "a28d36c14c91592a21bf164ca1b39ea6ae4eabdbd2d91a0ac25182a78028301c",
"subsystem": "kernel",
"title": "Laser latch locked at idle"
},
{
"always": true,
"covers": [
[
"kernel-module-glowforge",
"**"
],
[
"linux-fslc",
"**"
]
],
"fingerprint": "f937296e7c7568c68373e1ff24f550d79df94a3dbdb229f1a11723597552e77c",
"hardware": "takeover",
"id": "kernel.k1-k2",
"inherited": false,
"kind": "auto",
"record": {
"answers": [],
"campaign": "c-20261018224638-4ca0",
"duration_s": 21,
"evidence": {
"baseline": {
"post": [],
"pre": []
},
"batch": {
"group": "unattended",
"ts": "2026-10-18T22:46:38Z"
},
"fixture": {
"channels": [
"lid",
"interlock",
"button"
],
"hostname": "<REDACTED-1>",
"ip": "<IP-1>",
"released": []
},
"k1": {
"faults": "0",
"state": "idle",
"stop_to_idle_s": 0.0909
},
"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": "f937296e7c7568c68373e1ff24f550d79df94a3dbdb229f1a11723597552e77c",
"image": "20261018222431 (dev)",
"log": [
"22:46:40 start kernel.k1-k2 (auto, takeover) in campaign c-20261018224638-4ca0",
"22:46:40 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
"22:46:40 fixture: <REDACTED-1> at <IP-1> covers lid, interlock, button",
"22:46:40 queued by the unattended queue opened 2026-10-18T22:46:38Z",
"22:46:40 baseline: pre: clean",
"22:46:40 takeover: waiting for forgectrl to be settled",
"22:46:40 baseline: /mode controller=running motion=verified",
"22:46:40 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:46:40 takeover: stopping the controller through forgectrl",
"22:46:40 takeover: POST /controller/stop -> 200",
"22:46:40 takeover: forgectrl stop -> rc 0",
"22:46:42 takeover: pulse device free",
"22:46:42 K1: 60001 bytes = 6.0 s of pads at 10000 Hz, ramp 125000 Hz/s",
"22:46:42 K1 pre: state=idle laser_enable=0 laser_on=0 laser_on_sampled=0 interlock=45",
"22:46:44 K1 controlled stop: state=idle after 0.0909 s, faults=0",
"22:46:48 K1 PASS: decelerating tail 0.0909 s, no burst, no fault",
"22:46:48 K2: 55001 bytes = 5.5 s; latch stays LOCKED; waypoint +200; motor_lock=15",
"22:46:48 K2 pre: state=idle laser_enable=0 laser_on=0 laser_on_sampled=0 interlock=13",
"22:46:49 K2: paused inside the pads; resuming with waypoint +200 (latch LOCKED)",
"22:46:54 K2 post: state=idle laser_enable=0 laser_on=0 laser_on_sampled=0 interlock=13",
"22:46:54 K2 done: state=idle pos before=(0, 0, 0, 0, 55001) after=(0, 0, 0, 55001, 55001)",
"22:46:54 K2 PASS: FIRE window replayed after the resume waypoint with laser_enable/laser_on at 0 throughout",
"22:46:54 takeover: forgectrl start -> rc 0",
"22:46:56 baseline: /mode controller=stopped motion=unverified",
"22:47:01 baseline: /mode controller=running motion=verified",
"22:47:02 baseline: post: clean",
"22:47:02 result PASS"
],
"manifest_sha": "70ecd7867c2698d17f2f3c38db772868eda3364f541242c93fb5db4e1d593bcd",
"message": "",
"result": "PASS",
"test": "kernel.k1-k2",
"ts": "2026-10-18T22:47:02Z"
},
"requires": [
"kernel.latch-locked-idle"
],
"satisfied": true,
"source_sha": "fdb921f759e826a1e0a3831fa0a12d240e8318f0a8a3cbb1c77f9c3ff4c842f6",
"subsystem": "kernel",
"title": "Controlled-stop floor and resume honors the locked latch"
},
{
"always": true,
"covers": [
[
"kernel-module-glowforge",
"**"
],
[
"linux-fslc",
"**"
]
],
"fingerprint": "0ee8d3835b31ee77c44b3e5bf44a8cbdc9aa875baa83a9c1e8ea155a16a6f954",
"hardware": "takeover",
"id": "kernel.deadman-close",
"inherited": false,
"kind": "auto",
"record": {
"answers": [],
"campaign": "c-20261018224638-4ca0",
"duration_s": 10,
"evidence": {
"baseline": {
"post": [],
"pre": []
},
"batch": {
"group": "unattended",
"ts": "2026-10-18T22:46:38Z"
},
"close": {
"faults": "0",
"halt_s": 0.0369,
"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": "0ee8d3835b31ee77c44b3e5bf44a8cbdc9aa875baa83a9c1e8ea155a16a6f954",
"image": "20261018222431 (dev)",
"log": [
"22:47:02 start kernel.deadman-close (auto, takeover) in campaign c-20261018224638-4ca0",
"22:47:02 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
"22:47:02 fixture: <REDACTED-1> at <IP-1> covers lid, interlock, button",
"22:47:02 queued by the unattended queue opened 2026-10-18T22:46:38Z",
"22:47:02 baseline: pre: clean",
"22:47:02 takeover: waiting for forgectrl to be settled",
"22:47:02 baseline: /mode controller=running motion=verified",
"22:47: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",
"22:47:02 takeover: stopping the controller through forgectrl",
"22:47:02 takeover: POST /controller/stop -> 200",
"22:47:02 takeover: forgectrl stop -> rc 0",
"22:47:03 takeover: pulse device free",
"22:47:03 deadman pre: state=idle laser_enable=0 laser_on=0 laser_on_sampled=0 interlock=45",
"22:47:05 deadman post: state=idle laser_enable=0 laser_on=0 laser_on_sampled=0 interlock=13",
"22:47:05 final close: state=idle after 0.0369 s; head {'z_enable': '1', 'z_current': '1', 'measure_laser': '0', 'uv_led': '0'}",
"22:47:05 PASS: the final close halted the engine in 0.037 s, latch locked, head safed",
"22:47:05 takeover: forgectrl start -> rc 0",
"22:47:07 baseline: /mode controller=stopped motion=unverified",
"22:47:12 baseline: /mode controller=running motion=verified",
"22:47:12 baseline: post: clean",
"22:47:12 result PASS"
],
"manifest_sha": "70ecd7867c2698d17f2f3c38db772868eda3364f541242c93fb5db4e1d593bcd",
"message": "",
"result": "PASS",
"test": "kernel.deadman-close",
"ts": "2026-10-18T22:47:12Z"
},
"requires": [
"kernel.k1-k2"
],
"satisfied": true,
"source_sha": "3de85cc0a2e5ed1ff47e9ea262a85eb4518b1e33508af94bf6e0dabc89274bad",
"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": "4085907667f8b66972b3febacb34acf936cc06d361b3b2e46447f262aaf6e15f",
"hardware": "takeover",
"id": "kernel.backtrack-bounds",
"inherited": false,
"kind": "auto",
"record": {
"answers": [],
"campaign": "c-20261018224638-4ca0",
"duration_s": 18,
"evidence": {
"after": {
"faults": "0",
"max_backtrack": 0,
"state": "idle",
"underruns": "0"
},
"baseline": {
"post": [],
"pre": []
},
"batch": {
"group": "unattended",
"ts": "2026-10-18T22:46:38Z"
},
"fixture": {
"channels": [
"lid",
"interlock",
"button"
],
"hostname": "<REDACTED-1>",
"ip": "<IP-1>",
"released": []
},
"max_backtrack": 15065,
"over_long_errno": 1,
"played": 15465
},
"fingerprint": "4085907667f8b66972b3febacb34acf936cc06d361b3b2e46447f262aaf6e15f",
"image": "20261018222431 (dev)",
"log": [
"22:47:12 start kernel.backtrack-bounds (auto, takeover) in campaign c-20261018224638-4ca0",
"22:47:12 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
"22:47:12 fixture: <REDACTED-1> at <IP-1> covers lid, interlock, button",
"22:47:12 queued by the unattended queue opened 2026-10-18T22:46:38Z",
"22:47:12 baseline: pre: clean",
"22:47:12 takeover: waiting for forgectrl to be settled",
"22:47:12 baseline: /mode controller=running motion=verified",
"22:47:12 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:47:12 takeover: stopping the controller through forgectrl",
"22:47:12 takeover: POST /controller/stop -> 200",
"22:47:13 takeover: forgectrl stop -> rc 0",
"22:47:13 takeover: pulse device free",
"22:47:13 60001 bytes = 6.0 s of pads at 10000 Hz; decel tail 400 steps",
"22:47:13 pre: state=idle laser_enable=0 laser_on=0 laser_on_sampled=0 interlock=45",
"22:47:15 played 15465 bytes; max_backtrack 15065",
"22:47:17 backtrack of 15065 done: state=idle max_backtrack now 0",
"22:47:23 PASS: max_backtrack tracks the played history, the boundary is enforced, and the run at it plays out clean",
"22:47:23 takeover: forgectrl start -> rc 0",
"22:47:25 baseline: /mode controller=stopped motion=unverified",
"22:47:30 baseline: /mode controller=running motion=verified",
"22:47:30 baseline: post: clean",
"22:47:30 result PASS"
],
"manifest_sha": "70ecd7867c2698d17f2f3c38db772868eda3364f541242c93fb5db4e1d593bcd",
"message": "",
"result": "PASS",
"test": "kernel.backtrack-bounds",
"ts": "2026-10-18T22:47:30Z"
},
"requires": [
"kernel.k1-k2"
],
"satisfied": true,
"source_sha": "21c1c610c4ca8748e00ec6726a647fd857c069593c258a9b559bbe2e80e0dc7a",
"subsystem": "kernel",
"title": "A backward run is bounded by the history the ring still holds"
},
{
"always": true,
"covers": [
[
"kernel-module-glowforge",
"**"
],
[
"linux-fslc",
"**"
]
],
"fingerprint": "75e4582d461893d2875b5414d6023ef7c28f2742c1703f56f0ba6f4f9ee74a9b",
"hardware": "takeover",
"id": "kernel.fire-line",
"inherited": false,
"kind": "auto",
"record": {
"answers": [],
"campaign": "c-20261018224638-4ca0",
"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.51
},
"moved": false,
"tail": {
"after_s": 6.04,
"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.51
},
"moved": false,
"tail": {
"after_s": 6.0,
"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-10-18T22:46:38Z"
},
"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": "75e4582d461893d2875b5414d6023ef7c28f2742c1703f56f0ba6f4f9ee74a9b",
"image": "20261018222431 (dev)",
"log": [
"22:47:30 start kernel.fire-line (auto, takeover) in campaign c-20261018224638-4ca0",
"22:47:31 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
"22:47:31 fixture: <REDACTED-1> at <IP-1> covers lid, interlock, button",
"22:47:31 queued by the unattended queue opened 2026-10-18T22:46:38Z",
"22:47:31 baseline: pre: clean",
"22:47:31 takeover: waiting for forgectrl to be settled",
"22:47:31 baseline: /mode controller=running motion=verified",
"22:47:31 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:47:31 takeover: stopping the controller through forgectrl",
"22:47:31 takeover: POST /controller/stop -> 200",
"22:47:31 takeover: forgectrl stop -> rc 0",
"22:47:33 takeover: pulse device free",
"22:47:33 fire A: stream 60001 bytes = 6.000 s",
"22:47:33 fire A pre: state=idle laser_enable=0 laser_on=0 laser_on_sampled=0 interlock=45",
"22:47:35 fire A mid (inside FIRE window): laser_enable=0 laser_on=0 laser_on_sampled=0 interlock=13",
"22:47:40 fire A done: state=idle after 6.0 s (laser_enable=0)",
"22:47:40 fire A post: state=idle laser_enable=0 laser_on=0 laser_on_sampled=0 interlock=13",
"22:47:40 fire A: moved=False underruns 0->0 faults=0",
"22:47:40 fire A PASS: latch locked, no FIRE drive, no LASER_ON",
"22:47:40 fire B: stream 60001 bytes = 6.000 s",
"22:47:40 hv off: released after 0.41 s",
"22:47:40 fire B pre: state=idle laser_enable=0 laser_on=0 laser_on_sampled=0 interlock=45",
"22:47:41 fire B: latch UNLOCKED for this run",
"22:47:42 fire B mid (inside FIRE window): laser_enable=1 laser_on=0 laser_on_sampled=0 interlock=7",
"22:47:47 fire B done: state=idle after 6.0 s (laser_enable=0)",
"22:47:47 fire B post: state=idle laser_enable=0 laser_on=0 laser_on_sampled=0 interlock=13",
"22:47:47 fire B: moved=False underruns 0->0 faults=0",
"22:47:47 fire B PASS: FIRE driven mid-window, LASER_ON off, FIRE clear at end-of-data",
"22:47:47 fire U: stream 60001 bytes = 6.000 s",
"22:47:47 hv off: released after 0.41 s",
"22:47:47 fire U pre: state=idle laser_enable=0 laser_on=0 laser_on_sampled=0 interlock=45",
"22:47:48 fire U: streaming=1, the terminal end-of-data will be a TRUE UNDERRUN",
"22:47:48 fire U: latch UNLOCKED for this run",
"22:47:49 fire U mid (inside FIRE window): laser_enable=1 laser_on=0 laser_on_sampled=0 interlock=7",
"22:47:54 fire U done: state=underrun after 6.0 s (laser_enable=0)",
"22:47:54 fire U: underrun state reached as EXPECTED; acking via stop",
"22:47:54 fire U: acked: state=idle",
"22:47:54 fire U post: state=idle laser_enable=0 laser_on=0 laser_on_sampled=0 interlock=13",
"22:47:54 fire U: moved=False underruns 0->1 faults=0",
"22:47:54 fire U PASS: true underrun, backstop dropped FIRE, stop acked",
"22:47:54 hv off: released after 0.41 s",
"22:47:54 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:47:54 K3 pre: state=idle laser_enable=0 laser_on=0 laser_on_sampled=0 interlock=45",
"22:47:55 K3: latch UNLOCKED mid-ramp; interlock=5 (bit 3 should read 0)",
"22:47:58 K3 post: state=idle laser_enable=0 laser_on=0 laser_on_sampled=0 interlock=5",
"22:47:58 K3 PASS: laser_enable stayed 0 for the entire run after the mid-ramp unlock",
"22:47:58 safe state restored: state=disabled latch=LOCKED",
"22:47:58 takeover: forgectrl start -> rc 0",
"22:48:00 baseline: /mode controller=stopped motion=unverified",
"22:48:02 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
"22:48:14 baseline: /mode controller=running motion=verified",
"22:48:14 baseline: post: clean",
"22:48:14 result PASS"
],
"manifest_sha": "70ecd7867c2698d17f2f3c38db772868eda3364f541242c93fb5db4e1d593bcd",
"message": "",
"result": "PASS",
"test": "kernel.fire-line",
"ts": "2026-10-18T22:48:14Z"
},
"requires": [
"kernel.k1-k2"
],
"satisfied": true,
"source_sha": "254ffbe9fb6338badf09cd51ce5d43ba564eb1ac3eec0692903d5fd2e16c017a",
"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": "8516093abae1415ec66123e4651f096a77853447d0a3d52accced3ec3f79ffcf",
"hardware": "takeover",
"id": "kernel.resume-lead",
"inherited": false,
"kind": "auto",
"record": {
"answers": [],
"campaign": "c-20261018224638-4ca0",
"duration_s": 22,
"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": 848,
"end_state": "idle",
"faults": "0",
"first_driven_s": 1.0036,
"inside_lead": [],
"laser_on_sampled": "0",
"last_driven_s": 2.004,
"samples": 1870
},
"baseline": {
"post": [],
"pre": []
},
"batch": {
"group": "unattended",
"ts": "2026-10-18T22:46:38Z"
},
"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": "8516093abae1415ec66123e4651f096a77853447d0a3d52accced3ec3f79ffcf",
"image": "20261018222431 (dev)",
"log": [
"22:48:14 start kernel.resume-lead (auto, takeover) in campaign c-20261018224638-4ca0",
"22:48:15 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
"22:48:15 fixture: <REDACTED-1> at <IP-1> covers lid, interlock, button",
"22:48:15 queued by the unattended queue opened 2026-10-18T22:46:38Z",
"22:48:15 baseline: pre: clean",
"22:48:15 takeover: waiting for forgectrl to be settled",
"22:48:15 baseline: /mode controller=running motion=verified",
"22:48:15 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:48:15 takeover: stopping the controller through forgectrl",
"22:48:15 takeover: POST /controller/stop -> 200",
"22:48:15 takeover: forgectrl stop -> rc 0",
"22:48:17 takeover: pulse device free",
"22:48:17 E: 501 bytes = 0.5 s of pads at 1000 Hz; resume with a 10000-byte lead (never reached)",
"22:48:17 E pre: state=idle laser_enable=0 laser_on=0 laser_on_sampled=0 interlock=45",
"22:48:18 E: idle after 0.505 s (the data is 0.501 s; a lost end-of-data would add 0.255 s)",
"22:48:18 E PASS: end-of-data before the waypoint ended the run on time",
"22:48:18 hv off: released after 0.36 s",
"22:48: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",
"22:48:18 L pre: state=idle laser_enable=0 laser_on=0 laser_on_sampled=0 interlock=45",
"22:48:21 L post: state=idle laser_enable=0 laser_on=0 laser_on_sampled=0 interlock=13",
"22:48:21 L: 1870 samples, FIRE driven in 848, first at 1.0036 s, last at 2.004 s, end state idle",
"22:48:21 L PASS: FIRE low through the 1.0 s lead, driven from the waypoint on, LASER_ON off",
"22:48:21 safe state restored: state=disabled latch=LOCKED",
"22:48:21 takeover: forgectrl start -> rc 0",
"22:48:23 baseline: /mode controller=stopped motion=unverified",
"22:48:37 baseline: /mode controller=running motion=verified",
"22:48:37 baseline: post: clean",
"22:48:37 result PASS"
],
"manifest_sha": "70ecd7867c2698d17f2f3c38db772868eda3364f541242c93fb5db4e1d593bcd",
"message": "",
"result": "PASS",
"test": "kernel.resume-lead",
"ts": "2026-10-18T22:48:37Z"
},
"requires": [
"kernel.k1-k2"
],
"satisfied": true,
"source_sha": "4e4d262d6f5a3e551640f652b67162e7c614ab5c3f9aff1e192be701060d5209",
"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": "b1ebe6beb422d98176debd8f967a5b287d693db9f459cebea3c758c0e0fabb96",
"hardware": "api",
"id": "kernel.pic-soc-load",
"inherited": false,
"kind": "auto",
"record": {
"answers": [],
"campaign": "c-20261018224638-4ca0",
"duration_s": 3,
"evidence": {
"baseline": {
"post": [],
"pre": []
},
"batch": {
"group": "unattended",
"ts": "2026-10-18T22:46:38Z"
},
"control": {
"busy": {
"iqr": 2,
"max": 673,
"mean": 665.64,
"med": 665,
"min": 661,
"n": 200
},
"idle": {
"iqr": 2,
"max": 678,
"mean": 661.11,
"med": 660,
"min": 651,
"n": 200
}
},
"control_split": 5,
"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": 677,
"mean": 663.47,
"med": 663,
"min": 653,
"n": 200
},
"idle": {
"iqr": 1,
"max": 671,
"mean": 662.59,
"med": 662,
"min": 658,
"n": 200
}
},
"settled_idle_moved": 2,
"settled_split": 1
},
"fingerprint": "b1ebe6beb422d98176debd8f967a5b287d693db9f459cebea3c758c0e0fabb96",
"image": "20261018222431 (dev)",
"log": [
"22:48:37 start kernel.pic-soc-load (auto, api) in campaign c-20261018224638-4ca0",
"22:48:38 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
"22:48:38 fixture: <REDACTED-1> at <IP-1> covers lid, interlock, button",
"22:48:38 queued by the unattended queue opened 2026-10-18T22:46:38Z",
"22:48:38 baseline: pre: clean",
"22:48:41 control (settle off): after sleep median 660 (iqr 2, 651..678); after spin median 665 (iqr 2, 661..673)",
"22:48:41 settled (500 us): after sleep median 662 (iqr 1, 658..671); after spin median 663 (iqr 2, 653..677)",
"22:48:41 split busy minus idle: control +5, settled +1",
"22:48:41 PASS: settled, an idle reader and a busy reader read the same (split +1); control split +5",
"22:48:41 baseline: post: clean",
"22:48:41 result PASS"
],
"manifest_sha": "70ecd7867c2698d17f2f3c38db772868eda3364f541242c93fb5db4e1d593bcd",
"message": "",
"result": "PASS",
"test": "kernel.pic-soc-load",
"ts": "2026-10-18T22:48:41Z"
},
"requires": [],
"satisfied": true,
"source_sha": "283ea7885d663e45432ad09e716320b05b626f962a83d2e45bc97db13077606e",
"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/button.*"
],
[
"forgectrl",
"src/ui/login.*"
],
[
"forgectrl",
"src/ui/wizard.js"
]
],
"fingerprint": "75a8c16ceda10074c814317e7f164f63f17b4aa06610fbbc7830e90d31807d5f",
"hardware": "api",
"id": "forgectrl.auth",
"inherited": false,
"kind": "auto",
"record": {
"answers": [],
"campaign": "c-20261018224638-4ca0",
"duration_s": 1,
"evidence": {
"alive_after_oversize": 200,
"baseline": {
"post": [],
"pre": []
},
"batch": {
"group": "unattended",
"ts": "2026-10-18T22:46:38Z"
},
"controller_has_a_secret": true,
"cool_state_from_lan": 403,
"cool_state_from_lan_http": {
"location": "https://<IP-1>/cool/state",
"status": 302
},
"cool_state_from_loopback": 200,
"cool_state_from_loopback_no_secret": 403,
"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": "75a8c16ceda10074c814317e7f164f63f17b4aa06610fbbc7830e90d31807d5f",
"image": "20261018222431 (dev)",
"log": [
"22:48:41 start forgectrl.auth (auto, api) in campaign c-20261018224638-4ca0",
"22:48:41 fixture up: <REDACTED-1> at <IP-2>, v1.0.0, covers lid, interlock, button",
"22:48:41 fixture: <REDACTED-1> at <IP-2> covers lid, interlock, button",
"22:48:41 queued by the unattended queue opened 2026-10-18T22:46:38Z",
"22:48:41 baseline: pre: clean",
"22:48:41 GET /status -> 200",
"22:48:41 POST /controller/stop (no token) -> 403 {'error': 'authentication required'}",
"22:48:41 POST /controller/start (no token) -> 403 {'error': 'authentication required'}",
"22:48:41 POST /mode (no token) -> 403 {'error': 'authentication required'}",
"22:48:41 POST /settings (no token) -> 403 {'error': 'authentication required'}",
"22:48:41 POST /diag/flow-verify (no token) -> 403 {'error': 'authentication required'}",
"22:48:41 POST /diag/abort (no token) -> 403 {'error': 'authentication required'}",
"22:48:41 POST /update/apply (no token) -> 403 {'error': 'authentication required'}",
"22:48:41 POST /boot (no token) -> 403 {'error': 'authentication required'}",
"22:48:41 POST /update/check (no token) -> 403 {'error': 'authentication required'}",
"22:48:41 POST /update/dismiss (no token) -> 403 {'error': 'authentication required'}",
"22:48:41 POST /system/reboot (no token) -> 403 {'error': 'authentication required'}",
"22:48:41 POST /restore/factory (no token) -> 403 {'error': 'authentication required'}",
"22:48:41 POST /restore/factory-return (no token) -> 403 {'error': 'authentication required'}",
"22:48:41 POST /system/ssh (no token) -> 403 {'error': 'authentication required'}",
"22:48:41 POST /wiz/advisories/accept (no token) -> 403 {'error': 'authentication required'}",
"22:48:41 POST /wiz/account (no token) -> 403 {'error': 'authentication required'}",
"22:48:41 POST /wiz/complete (no token) -> 403 {'error': 'authentication required'}",
"22:48:41 POST /update/upload (no token) -> 403",
"22:48:42 POST /settings (no token, 4 MiB body) -> 403",
"22:48:42 GET /status after the oversized body -> 200",
"22:48:42 GET /status Host=evil.example.net -> 403",
"22:48:42 GET /status Host=forgefirm-b00a -> 200",
"22:48:42 GET /status Host=forgefirm-b00a.example.net -> 403",
"22:48:42 GET /status Origin=http://evil.example.net -> 403",
"22:48:42 GET /status Sec-Fetch-Site=cross-site -> 403",
"22:48:42 GET /fuse-identity (no token) -> 403 {'error': 'authentication required'}",
"22:48:42 GET /fuse-identity (token, button not held) -> 403 ",
"22:48:42 POST /cool/state from loopback, no secret -> 403 the report channel is the running controller's alone",
"22:48:42 POST /cool/state from loopback with the controller's secret -> 200",
"22:48:42 POST http://<IP-1>/cool/state -> 302 https://<IP-1>/cool/state",
"22:48:42 POST https://<IP-1>/cool/state -> 403 {'error': 'loopback only'}",
"22:48:42 GET https://<IP-1>/setup?step=laser.focus (no session) -> 302 /login?next=/setup%3Fstep%3Dlaser.focus",
"22:48:42 baseline: post: clean",
"22:48:42 result PASS"
],
"manifest_sha": "70ecd7867c2698d17f2f3c38db772868eda3364f541242c93fb5db4e1d593bcd",
"message": "",
"result": "PASS",
"test": "forgectrl.auth",
"ts": "2026-10-18T22:48:42Z"
},
"requires": [],
"satisfied": true,
"source_sha": "caf34f23772a84eb3533dd8bfd3c175aab888648ceea8ccbe6a4d50e51464b9d",
"subsystem": "forgectrl",
"title": "API access control"
},
{
"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/button.*"
],
[
"forgectrl",
"src/led.*"
],
[
"forgectrl",
"src/status.c"
]
],
"fingerprint": "5f00dfd1197c238fb3a14d3ff57044018fa83613b4b15969a8a26ec5fd9401c5",
"hardware": "api",
"id": "setup.check-switches",
"inherited": false,
"kind": "operator",
"record": {
"answers": [],
"campaign": "c-20261018224638-4ca0",
"duration_s": 4,
"evidence": {
"actions": [
{
"by": "fixture",
"channel": "lid",
"state": "open",
"took_s": 0.26,
"ts": "2026-10-18T22:48:43Z"
},
{
"by": "fixture",
"channel": "lid",
"state": "close",
"took_s": 0.26,
"ts": "2026-10-18T22:48:44Z"
},
{
"by": "fixture",
"channel": "button",
"state": "press",
"took_s": 0.26,
"ts": "2026-10-18T22:48:45Z"
}
],
"baseline": {
"post": [],
"pre": []
},
"batch": {
"group": "unattended",
"ts": "2026-10-18T22:46:38Z"
},
"elapsed_s": 3.9,
"error": "",
"fixture": {
"channels": [
"lid",
"interlock",
"button"
],
"hostname": "<REDACTED-1>",
"ip": "<IP-1>",
"released": []
},
"log": [
"00:00 switches at start: 0x0b",
"00:00 lid-open: seen",
"00:01 lid-close: seen",
"00:01 HV enable readback: closed 0, open 0, closed 0 (did not follow the lid)",
"00:02 button-press: seen",
"00:02 button-release: seen",
"00:02 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": "5f00dfd1197c238fb3a14d3ff57044018fa83613b4b15969a8a26ec5fd9401c5",
"image": "20261018222431 (dev)",
"log": [
"22:48:42 start setup.check-switches (operator, api) in campaign c-20261018224638-4ca0",
"22:48:42 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
"22:48:42 fixture: <REDACTED-1> at <IP-1> covers lid, interlock, button",
"22:48:42 fixture: running unattended (no prompt can be answered)",
"22:48:42 queued by the unattended queue opened 2026-10-18T22:46:38Z",
"22:48:43 baseline: pre: clean",
"22:48:43 POST /wiz/switches/start -> 200 {'started': True, 'id': 'switches'}",
"22:48:43 switches: Open the lid.",
"22:48:43 prompt lid-open (wait): Open the lid.",
"22:48:43 ACT lid open (fixture)",
"22:48:43 ACT lid open: done after 0.3 s",
"22:48:44 switches: Close the lid.",
"22:48:44 prompt lid-close (wait): Close the lid.",
"22:48:44 ACT lid close (fixture)",
"22:48:44 ACT lid close: done after 0.3 s",
"22:48:45 switches: Press the button once.",
"22:48:45 prompt button-press (wait): Press the button once.",
"22:48:45 ACT button press (fixture)",
"22:48:45 ACT button press: done after 0.3 s",
"22:48:47 switches: {\"lid\": true, \"hv_enable_follows_lid\": false, \"button\": true, \"interlock\": \"satisfied\", \"head_present\": true}",
"22:48:47 baseline: post: clean",
"22:48:47 result PASS"
],
"manifest_sha": "70ecd7867c2698d17f2f3c38db772868eda3364f541242c93fb5db4e1d593bcd",
"message": "",
"result": "PASS",
"test": "setup.check-switches",
"ts": "2026-10-18T22:48:47Z"
},
"requires": [
"forgectrl.auth"
],
"satisfied": true,
"source_sha": "3656c25ac687bb31ac618fed8b8cd3235d1f5eb2b4bf932b2513cbb6e9c07539",
"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/button.*"
],
[
"forgectrl",
"src/led.*"
],
[
"forgectrl",
"src/cool.c"
],
[
"forgectrl",
"src/airflow.*"
],
[
"forgectrl",
"src/gates.c"
],
[
"forgectrl",
"src/super.c"
]
],
"fingerprint": "f67ce5ca242a552790891d294ba3744242ab962836590f3a7c398497ccc0450d",
"hardware": "takeover",
"id": "setup.check-airflow",
"inherited": false,
"kind": "auto",
"record": {
"answers": [],
"campaign": "c-20261018224638-4ca0",
"duration_s": 40,
"evidence": {
"baseline": {
"post": [],
"pre": []
},
"batch": {
"group": "unattended",
"ts": "2026-10-18T22:46:38Z"
},
"elapsed_s": 38.2,
"error": "",
"fixture": {
"channels": [
"lid",
"interlock",
"button"
],
"hostname": "<REDACTED-1>",
"ip": "<IP-1>",
"released": []
},
"intakes": {
"counted": "2",
"found": 2,
"intake_2_silent": false
},
"log": [
"00:00 fans to run duty, purge on",
"00:38 exhaust: 11620 rpm steady, 90 percent at 4.5 s",
"00:38 intake 1: 4152 rpm steady, 90 percent at 6.6 s",
"00:38 intake 2: 4159 rpm steady, 90 percent at 6.6 s",
"00:38 air assist: 10885 rpm steady, 90 percent at 0.8 s",
"00:38 purge current 629 on, 1 off",
"00:38 floors: exhaust 6391, intake 2283, air assist 5987, purge 346; grace 12 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": 630,
"state": "idle"
},
"purge_air": "1",
"took_s": 0.010473251342773438
},
"result": {
"fans": {
"air assist": {
"ok": true,
"spinup_s": 0.8,
"steady_rpm": 10885.0
},
"exhaust": {
"ok": true,
"spinup_s": 4.5,
"steady_rpm": 11620.0
},
"intake 1": {
"ok": true,
"spinup_s": 6.6,
"steady_rpm": 4152.0
},
"intake 2": {
"ok": true,
"spinup_s": 6.6,
"steady_rpm": 4159.0
}
},
"floors": {
"cool_fan_grace_s": "12",
"cool_purge_min_current": "346",
"cool_tach_air_assist_min_rpm": "5987",
"cool_tach_exhaust_min_rpm": "6391",
"cool_tach_intake_min_rpm": "2283"
},
"intake_fans": 2,
"purge_current_off": 1.0,
"purge_current_on": 629.0
},
"settings_before": {
"cool_fan_grace_s": "12",
"cool_intake_fans": "2",
"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": "f67ce5ca242a552790891d294ba3744242ab962836590f3a7c398497ccc0450d",
"image": "20261018222431 (dev)",
"log": [
"22:48:47 start setup.check-airflow (auto, takeover) in campaign c-20261018224638-4ca0",
"22:48:47 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
"22:48:47 fixture: <REDACTED-1> at <IP-1> covers lid, interlock, button",
"22:48:47 queued by the unattended queue opened 2026-10-18T22:46:38Z",
"22:48:47 baseline: pre: clean",
"22:48:47 POST /wiz/airflow/start -> 200 {'started': True, 'id': 'airflow'}",
"22:48:47 airflow: stopping the motion controller",
"22:48:48 airflow: fans to the run profile for 35 s",
"22:49:18 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
"22:49:23 airflow: purge off, reading the off current",
"22:49:26 intake fans: 2 (the machine counted 2)",
"22:49:26 exhaust: 11620.0 rpm steady, 90 percent at 4.5 s",
"22:49:26 intake 1: 4152.0 rpm steady, 90 percent at 6.6 s",
"22:49:26 intake 2: 4159.0 rpm steady, 90 percent at 6.6 s",
"22:49:26 air assist: 10885.0 rpm steady, 90 percent at 0.8 s",
"22:49:26 floors: {\"cool_tach_exhaust_min_rpm\": \"6391\", \"cool_tach_intake_min_rpm\": \"2283\", \"cool_tach_air_assist_min_rpm\": \"5987\", \"cool_purge_min_current\": \"346\", \"cool_fan_grace_s\": \"12\"}",
"22:49:26 purge after the check: commanded 1, drawing 630 against the 345 floor (after 0.0 s)",
"22:49:26 restore cool_tach_exhaust_min_rpm='6416' -> 200",
"22:49:26 restore cool_tach_intake_min_rpm='2277' -> 200",
"22:49:26 restore cool_tach_air_assist_min_rpm='6093' -> 200",
"22:49:26 restore cool_purge_min_current='345' -> 200",
"22:49:26 restore cool_fan_grace_s='12' -> 200",
"22:49:26 restore cool_intake_fans='2' -> 200",
"22:49:27 baseline: cool: diag/armed=False/hold=True was the engine's last word on the run; its next tick reads idle/armed=False/hold=False",
"22:49:27 baseline: post: clean",
"22:49:27 result PASS"
],
"manifest_sha": "70ecd7867c2698d17f2f3c38db772868eda3364f541242c93fb5db4e1d593bcd",
"message": "",
"result": "PASS",
"test": "setup.check-airflow",
"ts": "2026-10-18T22:49:27Z"
},
"requires": [
"forgectrl.auth"
],
"satisfied": true,
"source_sha": "dde4e1601f9b9c4395d241c0578d5213511e9b789ed6be9703a1683a2a7660f8",
"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/button.*"
],
[
"forgectrl",
"src/led.*"
],
[
"forgectrl",
"src/super.c"
],
[
"forgectrl",
"src/liveness.c"
],
[
"forgectrl",
"src/lenshome.*"
],
[
"forgectrl",
"src/accel.c"
],
[
"forgectrl",
"src/cool.c"
]
],
"fingerprint": "5afda9620a292412677b073b95dbf9c95a48aa7a08aa79f20d2dc424d9a29541",
"hardware": "takeover",
"id": "setup.check-motion",
"inherited": false,
"kind": "auto",
"record": {
"answers": [],
"campaign": "c-20261018224638-4ca0",
"duration_s": 20,
"evidence": {
"baseline": {
"post": [],
"pre": []
},
"batch": {
"group": "unattended",
"ts": "2026-10-18T22:46:38Z"
},
"elapsed_s": 20.2,
"error": "",
"fixture": {
"channels": [
"lid",
"interlock",
"button"
],
"hostname": "<REDACTED-1>",
"ip": "<IP-1>",
"released": []
},
"log": [
"00:06 liveness probe: head accel p2p x=3537 y=1407 (moving>=800 dead<=250)",
"00:08 lens reference pass 1: 0",
"00:09 lens reference pass 2: 0",
"00:10 lens reference pass 3: 0",
"00:11 lens reference pass 4: 0",
"00:12 lens reference pass 5: 0",
"00:14 at rest: accelerometer low-passed p2p x 276 y 182 (rms 153 72) over 176 samples",
"00:15 +X: accelerometer low-passed p2p x 2441 y 784 (rms 821 369, raw p2p 4230 2067, 190 sampl",
"00:17 -X: accelerometer low-passed p2p x 2394 y 858 (rms 794 365, raw p2p 4614 2207, 193 sampl",
"00:18 +Y: accelerometer low-passed p2p x 906 y 1373 (rms 393 392, raw p2p 4228 2254, 196 sampl",
"00:19 -Y: accelerometer low-passed p2p x 862 y 1158 (rms 306 305, raw p2p 2702 1977, 193 sampl"
],
"phases": [
"the lens hall reference",
"the lens finds its reference on the hall sensor: pass 1 of 5",
"the lens finds its reference on the hall sensor: pass 2 of 5",
"the lens finds its reference on the hall sensor: pass 3 of 5",
"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",
"the head at rest",
"jog +X",
"jog -X",
"jog +Y",
"jog -Y"
],
"result": {
"moves": {
"+X": {
"crash_event": false,
"p2p_lp_x": 2441,
"p2p_lp_y": 784,
"p2p_x": 4230,
"p2p_y": 2067,
"rms_x": 821.0,
"rms_y": 369.0,
"samples": 190,
"witnessed": true
},
"+Y": {
"crash_event": false,
"p2p_lp_x": 906,
"p2p_lp_y": 1373,
"p2p_x": 4228,
"p2p_y": 2254,
"rms_x": 393.0,
"rms_y": 392.0,
"samples": 196,
"witnessed": true
},
"-X": {
"crash_event": false,
"p2p_lp_x": 2394,
"p2p_lp_y": 858,
"p2p_x": 4614,
"p2p_y": 2207,
"rms_x": 794.0,
"rms_y": 365.0,
"samples": 193,
"witnessed": true
},
"-Y": {
"crash_event": false,
"p2p_lp_x": 862,
"p2p_lp_y": 1158,
"p2p_x": 2702,
"p2p_y": 1977,
"rms_x": 306.0,
"rms_y": 305.0,
"samples": 193,
"witnessed": true
}
},
"probe": "head accel p2p x=3537 y=1407 (moving>=800 dead<=250)",
"rail": "up",
"rest": {
"p2p_lp_x": 276,
"p2p_lp_y": 182,
"p2p_x": 976,
"p2p_y": 475,
"rms_x": 153.0,
"rms_y": 72.0,
"samples": 176
},
"z_passes": [
0,
0,
0,
0,
0
],
"z_referenced": true
},
"started": true
},
"fingerprint": "5afda9620a292412677b073b95dbf9c95a48aa7a08aa79f20d2dc424d9a29541",
"image": "20261018222431 (dev)",
"log": [
"22:49:43 start setup.check-motion (auto, takeover) in campaign c-20261018224638-4ca0",
"22:49:43 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
"22:49:43 fixture: <REDACTED-1> at <IP-1> covers lid, interlock, button",
"22:49:43 queued by the unattended queue opened 2026-10-18T22:46:38Z",
"22:49:43 baseline: pre: clean",
"22:49:43 NOTICE: The head moves 50 mm each way on X and on Y. Keep the bed clear.",
"22:49:43 POST /wiz/motion/start -> 200 {'started': True, 'id': 'motion'}",
"22:49:43 motion: stopping the motion controller",
"22:49:44 motion: rail up, the liveness probe",
"22:49:49 motion: the lens hall reference",
"22:49:50 motion: the lens finds its reference on the hall sensor: pass 1 of 5",
"22:49:52 motion: the lens finds its reference on the hall sensor: pass 2 of 5",
"22:49:53 motion: the lens finds its reference on the hall sensor: pass 3 of 5",
"22:49:54 motion: the lens finds its reference on the hall sensor: pass 4 of 5",
"22:49:55 motion: the lens finds its reference on the hall sensor: pass 5 of 5",
"22:49:56 motion: starting the controller in loopback posture",
"22:49:56 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.",
"22:49:57 motion: the head at rest",
"22:49:58 motion: jog +X",
"22:49:59 motion: jog -X",
"22:50:00 motion: jog +Y",
"22:50:01 motion: jog -Y",
"22:50:03 motion: probe 'head accel p2p x=3537 y=1407 (moving>=800 dead<=250)', passes [0, 0, 0, 0, 0], rest {'samples': 176, 'p2p_lp_x': 276, 'p2p_lp_y': 182, 'p2p_x': 976, 'p2p_y': 475, 'rms_x': 153.0, 'rms_y': 72.0}, moves {'+X': (2441, 784), '-X': (2394, 858), '+Y': (906, 1373), '-Y': (862, 1158)}",
"22:50:03 baseline: post: clean",
"22:50:03 result PASS"
],
"manifest_sha": "70ecd7867c2698d17f2f3c38db772868eda3364f541242c93fb5db4e1d593bcd",
"message": "",
"result": "PASS",
"test": "setup.check-motion",
"ts": "2026-10-18T22:50:03Z"
},
"requires": [
"forgectrl.auth",
"motion.pacing"
],
"satisfied": true,
"source_sha": "c0cbdbed26872925bb3801b972f636d6fcb907b589c24de839be236790f76c57",
"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/button.*"
],
[
"forgectrl",
"src/led.*"
],
[
"forgectrl",
"src/lensfind.*"
],
[
"forgectrl",
"src/lens.*"
],
[
"forgectrl",
"src/lenshome.*"
],
[
"forgectrl",
"src/accel.c"
],
[
"forgectrl",
"src/cool.c"
],
[
"forgectrl",
"src/super.c"
]
],
"fingerprint": "fdd1044cb2708e08b3a15b64a97e499b02bf34c2704d19d2064261d074f31892",
"hardware": "takeover",
"id": "setup.check-lens",
"inherited": false,
"kind": "auto",
"record": {
"answers": [],
"campaign": "c-20261018224638-4ca0",
"duration_s": 20,
"evidence": {
"baseline": {
"post": [],
"pre": []
},
"batch": {
"group": "unattended",
"ts": "2026-10-18T22:46:38Z"
},
"elapsed_s": 19.1,
"error": "",
"fixture": {
"channels": [
"lid",
"interlock",
"button"
],
"hostname": "<REDACTED-1>",
"ip": "<IP-1>",
"released": []
},
"log": [
"00:02 lens reference pass 1: 0",
"00:03 lens reference pass 2: 0",
"00:16 bottom ring 1-12 (x100): 39 117 72 156 88 89 56 155 108 90 67 211",
"00:16 the stops could not be found: the lens slipped at the bottom stop before its ring died",
"00:18 the lens window: 10 half-steps below the reference, 12 above (the fallback)",
"00:19 lens: lens on the hall edge (3 off, 3 back)"
],
"phases": [
"the fans stop before the listening: 1 s of 10",
"the fans stop before the listening: 2 s of 10",
"the fans stop before the listening: 3 s of 10",
"the fans stop before the listening: 4 s of 10",
"the fans stop before the listening: 5 s of 10",
"the fans stop before the listening: 6 s of 10",
"the fans stop before the listening: 7 s of 10",
"the fans stop before the listening: 8 s of 10",
"the fans stop before the listening: 9 s of 10",
"finding the bottom stop by the head accelerometer: 4 half-steps below the edge",
"finding the bottom stop by the head accelerometer: 9 half-steps below the edge",
"finding the bottom stop by the head accelerometer: 12 half-steps below the edge"
],
"restart": {
"mode": "grbl",
"pid": 1473,
"start": 200,
"stop": 200
},
"result": {
"stops": {
"above": 0,
"below": 0,
"contact_above": 0,
"contact_below": 0,
"found": false,
"why": "the lens slipped at the bottom stop before its ring died"
},
"summary": "The stops could not be found on this head (the lens slipped at the bottom stop before its ring died). The lens keeps a reduced travel that clears the stops on any head. Please open an issue at github.com/openglow-org/forgefirm or post on community.openglow.org so the head can be looked at.",
"window": {
"above": 12,
"below": 10,
"found": false
},
"z_passes": [
0,
0
]
},
"settings_before": {
"lens_stop_above_steps": "20",
"lens_stop_below_steps": "14"
},
"started": true,
"window": {
"settings": [
"10",
"12"
],
"status": {
"above": 12,
"below": 10,
"edge_z": 4.51,
"reach_max": 8.62,
"reach_min": 1.09,
"stops_found": true,
"tray": "in",
"tray_offset_mm": 34.29
},
"stops": {
"above": 0,
"below": 0,
"contact_above": 0,
"contact_below": 0,
"found": false,
"why": "the lens slipped at the bottom stop before its ring died"
},
"window": {
"above": 12,
"below": 10,
"found": false
}
}
},
"fingerprint": "fdd1044cb2708e08b3a15b64a97e499b02bf34c2704d19d2064261d074f31892",
"image": "20261018222431 (dev)",
"log": [
"22:50:04 start setup.check-lens (auto, takeover) in campaign c-20261018224638-4ca0",
"22:50:04 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
"22:50:04 fixture: <REDACTED-1> at <IP-1> covers lid, interlock, button",
"22:50:04 queued by the unattended queue opened 2026-10-18T22:46:38Z",
"22:50:04 baseline: pre: clean",
"22:50:04 POST /wiz/lens.travel/start -> 200 {'started': True, 'id': 'lens.travel'}",
"22:50:04 lens.travel: stopping the motion controller",
"22:50:05 lens.travel: the lens finds its reference on the hall sensor",
"22:50:06 lens.travel: the lens finds its reference on the hall sensor: pass 1 of 2",
"22:50:07 lens.travel: the lens finds its reference on the hall sensor: pass 2 of 2",
"22:50:08 lens.travel: the fans stop before the listening: 0 s of 10",
"22:50:09 lens.travel: the fans stop before the listening: 1 s of 10",
"22:50:10 lens.travel: the fans stop before the listening: 2 s of 10",
"22:50:11 lens.travel: the fans stop before the listening: 3 s of 10",
"22:50:12 lens.travel: the fans stop before the listening: 4 s of 10",
"22:50:13 lens.travel: the fans stop before the listening: 5 s of 10",
"22:50:14 lens.travel: the fans stop before the listening: 6 s of 10",
"22:50:15 lens.travel: the fans stop before the listening: 7 s of 10",
"22:50:16 lens.travel: the fans stop before the listening: 8 s of 10",
"22:50:17 lens.travel: the fans stop before the listening: 9 s of 10",
"22:50:18 lens.travel: finding the bottom stop by the head accelerometer: 4 half-steps below the edge",
"22:50:19 lens.travel: finding the bottom stop by the head accelerometer: 9 half-steps below the edge",
"22:50:20 lens.travel: finding the bottom stop by the head accelerometer: 12 half-steps below the edge",
"22:50:23 lens travel: 10 half-steps below the edge, 12 above (the fallback: the lens slipped at the bottom stop before its ring died); contact 0/0",
"22:50:23 restore lens_stop_below_steps='14' -> 200",
"22:50:23 restore lens_stop_above_steps='20' -> 200",
"22:50:23 restarting the controller on the window as found: POST /controller/stop -> 200 {'stopped': True}",
"22:50:23 POST /controller/start -> 200 {'started': True}",
"22:50:24 baseline: post: clean",
"22:50:24 result PASS"
],
"manifest_sha": "70ecd7867c2698d17f2f3c38db772868eda3364f541242c93fb5db4e1d593bcd",
"message": "",
"result": "PASS",
"test": "setup.check-lens",
"ts": "2026-10-18T22:50:24Z"
},
"requires": [
"forgectrl.auth",
"setup.check-motion"
],
"satisfied": true,
"source_sha": "438e014057796d154c7f14e14832c3c2a5712212a623a1e6f7dbcde0c49e9876",
"subsystem": "setup",
"title": "The lens travel check finds the stops and writes the window"
},
{
"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/button.*"
],
[
"forgectrl",
"src/led.*"
],
[
"forgectrl",
"src/super.c"
],
[
"python3-gfhardware",
"gfhardware/machine.py"
],
[
"python3-gfhardware",
"forgefirm-app/gfcloud.py"
],
[
"python3-gfhardware",
"forgefirm-app/ffmachine.py"
]
],
"fingerprint": "21f011466a227b6551c24ed95622049622d6820bda0b72b31e9f73048b175ec0",
"hardware": "takeover",
"id": "setup.cloud-header-capture",
"inherited": false,
"kind": "operator",
"record": {
"answers": [],
"campaign": "c-20261018224638-4ca0",
"duration_s": 76,
"evidence": {
"baseline": {
"post": [],
"pre": []
},
"batch": {
"group": "attended",
"ts": "2026-10-18T23:07:24Z"
},
"elapsed_s": 75.5,
"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": [
"01:11 factory envelope captured: 134 tags, 57 calibration-bearing"
],
"mode": {
"detail": "already in grbl mode",
"found": "grbl",
"needs": "grbl",
"ok": true,
"switched": false
},
"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-10-18T23:08:35Z",
"job_id": 1596428785,
"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": "manual"
},
"started": true
},
"fingerprint": "21f011466a227b6551c24ed95622049622d6820bda0b72b31e9f73048b175ec0",
"image": "20261018222431 (dev)",
"log": [
"23:07:24 start setup.cloud-header-capture (operator, takeover) in campaign c-20261018224638-4ca0",
"23:07:24 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
"23:07:24 fixture: <REDACTED-1> at <IP-1> covers lid, interlock, button",
"23:07:24 queued by the attended queue opened 2026-10-18T23:07:24Z",
"23:07:24 baseline: pre: clean",
"23:07:24 mode: test needs grbl - already in grbl mode",
"23:07:24 NOTICE: Print any small design from the Glowforge app once it shows the machine online. Do not press the machine's button.",
"23:07:24 POST /wiz/cloud.header/start -> 200 {'started': True, 'id': 'cloud.header'}",
"23:07:25 cloud.header: starting the cloud client",
"23:07:29 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.",
"23:07:30 cloud.header: waiting for the print's header from the service",
"23:07:54 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
"23:08:26 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
"23:08:36 cloud.header: the cloud client cancels the print",
"23:08:39 cloud.header: back to GRBL mode",
"23:08:40 header: 134 tags, 57 kept; job 1596428785",
"23:08:40 restore cloud_enabled='1' -> 200",
"23:08:40 restore homing_mode='manual' -> 200",
"23:08:40 restore controller_mode='grbl' -> 200",
"23:08:40 baseline: post: clean",
"23:08:40 result PASS"
],
"manifest_sha": "70ecd7867c2698d17f2f3c38db772868eda3364f541242c93fb5db4e1d593bcd",
"message": "",
"result": "PASS",
"test": "setup.cloud-header-capture",
"ts": "2026-10-18T23:08:40Z"
},
"requires": [
"forgectrl.auth",
"cloud.mode-switch"
],
"satisfied": true,
"source_sha": "094090b0111d8701eb5225b06008c1f937b024d58b371b1a2df0ca304888b2f7",
"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/lenshome.*"
],
[
"forgectrl",
"src/font_hershey.*"
],
[
"forgectrl",
"src/jobstream.*"
],
[
"forgectrl",
"src/jobrun.*"
],
[
"forgectrl",
"src/lease.*"
],
[
"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"
],
[
"grblhal-glowforge",
"src/glowforge_laser.c"
],
[
"grblhal-glowforge",
"src/glowforge_status.c"
],
[
"grblhal-glowforge",
"src/glowforge_homing.*"
],
[
"grblhal-glowforge",
"src/glowforge_io.*"
]
],
"fingerprint": "96b8d738499d0f273c6934be167cdba4338987f5ca9a24011efd7f52edac9a5e",
"hardware": "takeover",
"id": "setup.focus",
"inherited": false,
"kind": "live",
"record": {
"answers": [],
"campaign": "c-20261018224638-4ca0",
"duration_s": 88,
"evidence": {
"actions": [
{
"by": "operator",
"channel": "button",
"state": "presence",
"took_s": 3.4,
"ts": "2026-10-18T23:09:56Z"
},
{
"by": "fixture",
"channel": "button",
"state": "arm",
"ts": "2026-10-18T23:10:07Z"
}
],
"baseline": {
"post": [],
"pre": []
},
"batch": {
"group": "attended",
"ts": "2026-10-18T23:07:24Z"
},
"elapsed_s": 69.9,
"emission": {
"beam_sensor_seen": true,
"hv_max": 1023,
"laser_on_samples": 235,
"lit_s": 47.34946822399979,
"thermopile_delta": 1202
},
"emission_seen": {
"hv_max": 1016,
"laser_on_max": 235,
"reads": 70
},
"error": "",
"fixture": {
"channels": [
"lid",
"interlock",
"button"
],
"hostname": "<REDACTED-1>",
"ip": "<IP-1>",
"released": []
},
"focus_window": {
"edge": "6.94",
"held": {
"settings": {
"lens_stop_above_steps": "20",
"lens_stop_below_steps": "14"
},
"stops_found": true,
"window": [
14,
20
]
},
"ladder_z": [
10.194626967830253,
9.167932922655716,
8.141238877481177,
7.114544832306639,
6.087850787132101,
5.061156741957563,
3.6922313483915126,
2.6655373032169747,
1.6388432580424368,
0.6121492128678989,
-0.41454483230663897,
-1.4412388774811773
],
"preview_bytes": 3922,
"program_lines": 295,
"program_z_after": {
"reach": [
2.15,
13.78
],
"stops_found": true,
"z": [
6.94,
13.78,
12.76,
11.73,
10.7,
9.68,
8.65,
7.28,
6.26,
5.23,
4.2,
3.18,
2.15,
6.94
]
},
"program_z_before": {
"reach": [
-1.44,
10.19
],
"stops_found": true,
"z": [
3.35,
10.19,
9.17,
8.14,
7.11,
6.09,
5.06,
3.69,
2.67,
1.64,
0.61,
-0.41,
-1.44,
3.35
]
},
"window": {
"above": 20,
"below": 14,
"reach_max": 10.194626967830253,
"reach_min": -1.4412388774811773
}
},
"head_at_start": {
"home_source": "startup",
"homed_axes": 4,
"judged": false,
"pos": {
"x": 0.0,
"y": 0.0,
"z": 4.45
}
},
"lens_fresh": {
"above": 20,
"below": 14,
"edge_z": 3.35,
"reach_max": 10.19,
"reach_min": -1.44,
"stops_found": true,
"tray": "in",
"tray_offset_mm": 34.29
},
"log": [
"00:02 lens reference pass 1: 0",
"00:04 lens reference pass 2: 0",
"00:05 lens: lens on the hall edge (3 off, 3 back)",
"00:05 the head is home, the operator says",
"01:09 streamed 298 lines; tube current peak 1023, LASER_ON samples 235, thermopile +1202",
"01:09 line 11 on 0.125 in: -11 half-steps from the hall edge, so the focus at the edge is 0.27"
],
"mode": {
"detail": "already in grbl mode",
"found": "grbl",
"needs": "grbl",
"ok": true,
"switched": false
},
"operator": {
"ack_live": true,
"ts": "2026-10-18T23:09:52Z"
},
"phases": [
"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: 1 s lit",
"burning: 2 s lit",
"burning: the tube is between passes",
"the tube is dark: the samples run on, 0 s more",
"the tube is dark: the pulse engine plays the rest"
],
"program_tail": {
"laser.focus": [
"G0 Z6.94",
"G0 X0 Y0",
"G92.1",
"M2"
]
},
"program_z": {
"laser.focus": {
"reach": [
2.15,
13.78
],
"stops_found": true,
"z": [
6.94,
13.78,
12.76,
11.73,
10.7,
9.68,
8.65,
7.28,
6.26,
5.23,
4.2,
3.18,
2.15,
6.94
]
}
},
"restart": {
"mode": "grbl",
"pid": 5563,
"start": 200,
"stop": 200
},
"result": {
"edge_z_mm": 6.939544832306639,
"emission": {
"beam_sensor_seen": true,
"hv_max": 1023,
"laser_on_samples": 235,
"lit_s": 47.34946822399979,
"thermopile_delta": 1202
},
"focus_range_mm": {
"max": 13.784171800136892,
"min": 2.148305954825462
},
"ladder_z": [
10.194626967830253,
9.167932922655716,
8.141238877481177,
7.114544832306639,
6.087850787132101,
5.061156741957563,
3.6922313483915126,
2.6655373032169747,
1.6388432580424368,
0.6121492128678989,
-0.41454483230663897,
-1.4412388774811773
],
"max_height_mm": 13.784171800136892,
"pick": 11.0,
"pick_half_steps": -11.0,
"picked_lines": [
11,
11
],
"steps_per_mm": 2.922,
"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 lens reaches 0.085 in to 0.543 in, a reduced travel until the Lens travel check runs.",
"thickness_mm": 3.175,
"window": {
"above": 20,
"below": 14,
"reach_max": 10.194626967830253,
"reach_min": -1.4412388774811773
},
"z_passes": [
0,
0
]
},
"settings_before": {
"lens_hall_edge_z_mm": "4.51",
"lens_stop_above_steps": "20",
"lens_stop_below_steps": "14"
},
"started": true,
"thickness_answer": "0.125"
},
"fingerprint": "96b8d738499d0f273c6934be167cdba4338987f5ca9a24011efd7f52edac9a5e",
"image": "20261018222431 (dev)",
"log": [
"23:09:52 start setup.focus (live, takeover) in campaign c-20261018224638-4ca0",
"23:09:52 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
"23:09:52 fixture: <REDACTED-1> at <IP-1> covers lid, interlock, button",
"23:09:52 queued by the attended queue opened 2026-10-18T23:07:24Z",
"23:09:52 baseline: pre: clean",
"23:09:52 mode: test needs grbl - already in grbl mode",
"23:09:52 NOTICE: The focus burn: twelve lines on the scrap after a press. The bench presses when the button lights. Then press the button on the machine to start.",
"23:09:52 READY: waiting for the operator's press on the machine (the bench then does every press in this test)",
"23:09:56 READY: operator present (press after 3.4 s); the bench takes the presses",
"23:09:56 the head's place rests on the operator's word at the ready gate (X and Y unreferenced: homed_axes 4, home_source startup, pos {'x': 0.0, 'y': 0.0, 'z': 4.45})",
"23:09:56 POST /wiz/laser.focus/start -> 200 {'started': True, 'id': 'laser.focus'}",
"23:09:56 prompt gantry-stops (confirm): This burn is drawn from the head's home against the gantry stops (Install, Gantry stops). Are the gantry stops installed?",
"23:09:57 laser.focus: the lens finds its reference on the hall sensor: pass 1 of 2",
"23:09:59 laser.focus: the lens finds its reference on the hall sensor: pass 2 of 2",
"23:10:01 laser.focus: starting the motion controller: 0 s (60 at most)",
"23:10:01 prompt home (choice): Every card is drawn from the head's home: the back-left corner, against the gantry stops. Is the head there?",
"23:10:02 laser.focus: the cooling engine takes the controller's report: 0 s (20 at most)",
"23:10:03 prompt scrap (continue): Open the lid and put a flat scrap of wood, at least 3.071 in by 2.677 in, in the back-left corner of the cut area: as far left as it goes, its top edge at the top of the cut area. Close the lid.",
"23:10:04 prompt thickness (number): The scrap's thickness in inches.",
"23:10:06 prompt focus-arm (continue): The lens is on its hall reference. Twelve 1.772 in lines burn heavy, the lens stepped from 0.269 in above the reference to 0.189 in below it (a reduced travel: run the Lens travel check for this head's own). Lid closed. Continue, then press the button when it lights white; this page says when.",
"23:10:07 laser.focus: the program goes to the controller, the button lights at the arm",
"23:10:07 prompt press (wait): The button is lit white. Press it now: the laser fires after your press.",
"23:10:07 ARM press by the fixture, at the machine's own press prompt",
"23:10:08 laser.focus: the button is lit: press it now (1 s; the job waits 600 at most)",
"23:10:09 laser.focus: the program goes to the controller, the button lights at the arm: 2 s",
"23:10:10 laser.focus: the program goes to the controller, the button lights at the arm: 3 s",
"23:10:11 laser.focus: the program goes to the controller, the button lights at the arm: 4 s",
"23:10:12 laser.focus: the program goes to the controller, the button lights at the arm: 5 s",
"23:10:13 laser.focus: the program goes to the controller, the button lights at the arm: 6 s",
"23:10:14 laser.focus: the program goes to the controller, the button lights at the arm: 7 s",
"23:10:15 laser.focus: the program goes to the controller, the button lights at the arm: 8 s",
"23:10:16 laser.focus: the program goes to the controller, the button lights at the arm: 9 s",
"23:10:17 laser.focus: burning: 1 s lit",
"23:10:18 laser.focus: burning: 2 s lit",
"23:10:19 laser.focus: burning: 3 s lit",
"23:10:20 laser.focus: burning: 4 s lit",
"23:10:21 laser.focus: burning: the tube is between passes",
"23:10:22 laser.focus: burning: 0 s lit",
"23:10:22 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
"23:10:26 laser.focus: burning: the tube is between passes",
"23:10:27 laser.focus: burning: 0 s lit",
"23:10:28 laser.focus: burning: the tube is between passes",
"23:10:29 laser.focus: burning: 0 s lit",
"23:10:30 laser.focus: burning: the tube is between passes",
"23:10:33 laser.focus: burning: 1 s lit",
"23:10:34 laser.focus: burning: the tube is between passes",
"23:10:35 laser.focus: burning: 0 s lit",
"23:10:36 laser.focus: burning: 1 s lit",
"23:10:37 laser.focus: burning: the tube is between passes",
"23:10:38 laser.focus: burning: 1 s lit",
"23:10:39 laser.focus: burning: 2 s lit",
"23:10:40 laser.focus: burning: 0 s lit",
"23:10:41 laser.focus: burning: 1 s lit",
"23:10:42 laser.focus: burning: the tube is between passes",
"23:10:43 laser.focus: burning: 1 s lit",
"23:10:44 laser.focus: burning: 2 s lit",
"23:10:45 laser.focus: burning: the tube is between passes",
"23:10:46 laser.focus: burning: 1 s lit",
"23:10:47 laser.focus: burning: the tube is between passes",
"23:10:48 laser.focus: burning: 0 s lit",
"23:10:49 laser.focus: burning: 1 s lit",
"23:10:50 laser.focus: burning: the tube is between passes",
"23:10:51 laser.focus: burning: 1 s lit",
"23:10:52 laser.focus: burning: the tube is between passes",
"23:10:53 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
"23:10:53 laser.focus: burning: 0 s lit",
"23:10:54 laser.focus: burning: 1 s lit",
"23:10:55 laser.focus: burning: the tube is between passes",
"23:10:56 laser.focus: burning: 1 s lit",
"23:10:57 laser.focus: burning: 2 s lit",
"23:10:58 laser.focus: burning: 0 s lit",
"23:10:59 laser.focus: burning: 1 s lit",
"23:11:00 laser.focus: burning: the tube is between passes",
"23:11:01 laser.focus: burning: 1 s lit",
"23:11:02 laser.focus: burning: 2 s lit",
"23:11:03 laser.focus: burning: the tube is between passes",
"23:11:04 laser.focus: the tube is dark: the samples run on, 0 s more",
"23:11:05 laser.focus: the tube is dark: the pulse engine plays the rest",
"23:11:05 prompt focus-pick (multichoice): Which dark line is the narrowest, with the crispest edges? Count from the top, 1 to 12. Neighbors can look the same, since the depth of focus spans a few lines: choose every one that does, and the middle is taken. Then Done. Look, but do not move the scrap until the step is done.",
"23:11:06 seen from here: LASER_ON count peak 235, tube current peak 1016 over 70 polls",
"23:11:06 the beam sensor rose 1202 (seen: True)",
"23:11:06 focus: line 11.0, the edge at 6.939544832306639 mm, the window 14/20",
"23:11:06 restore lens_hall_edge_z_mm='4.51' -> 200",
"23:11:07 restore lens_stop_below_steps='14' -> 200",
"23:11:07 restore lens_stop_above_steps='20' -> 200",
"23:11:07 restarting the controller on the edge and the window as found: POST /controller/stop -> 200 {'stopped': True}",
"23:11:07 POST /controller/start -> 200 {'started': True}",
"23:11:07 PASS: the focus burn ran in the window the machine holds and wrote the edge alone; settings restored and the controller restarted on them",
"23:11:20 baseline: cool: smoke/armed=False/hold=False ended on its own after 13 s; the engine's own post-job work, not a leftover",
"23:11:20 baseline: post: clean",
"23:11:20 result PASS"
],
"manifest_sha": "70ecd7867c2698d17f2f3c38db772868eda3364f541242c93fb5db4e1d593bcd",
"message": "",
"result": "PASS",
"test": "setup.focus",
"ts": "2026-10-18T23:11:20Z"
},
"requires": [
"forgectrl.auth",
"setup.check-motion",
"laser.emission-witness",
"setup.check-lens"
],
"satisfied": true,
"source_sha": "b52ac2f2a3851019f35159261b4e4eaa8657c2b9c145ce6cf4c95317d6032130",
"subsystem": "setup",
"title": "The focus burn: the ladder in the lens window, and the edge it writes"
},
{
"always": false,
"covers": [
[
"grblhal-glowforge",
"src/**"
],
[
"kernel-module-glowforge",
"**"
],
[
"forgectrl",
"src/super.*"
],
[
"forgectrl",
"src/liveness.*"
]
],
"fingerprint": "65e2c1530968698934ea7b650cb06a08fc766520ebf5cfe5f9d285cd28b56508",
"hardware": "api",
"id": "motion.pacing",
"inherited": false,
"kind": "auto",
"record": {
"answers": [],
"campaign": "c-20261018224638-4ca0",
"duration_s": 15,
"evidence": {
"baseline": {
"post": [],
"pre": []
},
"batch": {
"group": "unattended",
"ts": "2026-10-18T22:46:38Z"
},
"controller_pid": 1298,
"final_drift_mm": 0.0,
"fixture": {
"channels": [
"lid",
"interlock",
"button"
],
"hostname": "<REDACTED-1>",
"ip": "<IP-1>",
"released": []
},
"held_state": "Hold:0",
"idle_cpu_pct": 1.3,
"mode": {
"detail": "already in grbl mode",
"found": "grbl",
"needs": "grbl",
"ok": true,
"switched": false
},
"moved_mm": 30.0,
"moving_cpu_pct": 32.0,
"parked_cpu_pct": 1.3
},
"fingerprint": "65e2c1530968698934ea7b650cb06a08fc766520ebf5cfe5f9d285cd28b56508",
"image": "20261018222431 (dev)",
"log": [
"22:49:27 start motion.pacing (auto, api) in campaign c-20261018224638-4ca0",
"22:49:27 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
"22:49:27 fixture: <REDACTED-1> at <IP-1> covers lid, interlock, button",
"22:49:27 queued by the unattended queue opened 2026-10-18T22:46:38Z",
"22:49:27 baseline: pre: clean",
"22:49:27 mode: test needs grbl - already in grbl mode",
"22:49:28 connect: Idle",
"22:49:31 [1] idle CPU = 1.3%",
"22:49:33 [3] state=Run CPU during move = 32.0%",
"22:49:37 [2] Hold:0: CPU parked in Hold = 1.3%",
"22:49:39 [4] start X=0.000 end X=30.000 moved=30.000 (expect 30.0)",
"22:49:42 PASS: idle 1.3%, moving 32.0%, parked 1.3%, hold/resume exact",
"22:49:43 baseline: post: clean",
"22:49:43 result PASS"
],
"manifest_sha": "70ecd7867c2698d17f2f3c38db772868eda3364f541242c93fb5db4e1d593bcd",
"message": "",
"result": "PASS",
"test": "motion.pacing",
"ts": "2026-10-18T22:49:43Z"
},
"requires": [
"kernel.latch-locked-idle"
],
"satisfied": true,
"source_sha": "7c0b5ccb1507dcc058d662e1b6c07cb7b4de32ff73fa9daab45834b3984933a1",
"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.*"
],
[
"forgectrl",
"src/main.c"
]
],
"fingerprint": "167f7bc47a2856820b32b2051804688c42b76d95902f22b48366dc475e710d2c",
"hardware": "api",
"id": "motion.jog-roundtrip",
"inherited": false,
"kind": "auto",
"record": {
"answers": [],
"campaign": "c-20261018224638-4ca0",
"duration_s": 18,
"evidence": {
"accel_moving_legs": [
"X max-rate 60mm back",
"diag 40mm back"
],
"accel_overall": {
"errors": 0,
"p2p": [
3934,
1766
],
"samples": 17
},
"baseline": {
"post": [],
"pre": []
},
"batch": {
"group": "unattended",
"ts": "2026-10-18T22:46:38Z"
},
"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": [
2,
181
],
"accel_samples": 2,
"leg": "out",
"name": "X sanity 40mm",
"peak": 2400.0,
"states": [
"Jog",
"Idle"
],
"t0": 1792363825.4100647,
"t1": 1792363826.524853
},
{
"accel_p2p": [
725,
531
],
"accel_samples": 3,
"leg": "back",
"name": "X sanity 40mm",
"peak": 2400.0,
"states": [
"Jog",
"Idle"
],
"t0": 1792363826.5250788,
"t1": 1792363827.6371784
},
{
"accel_p2p": [
464,
141
],
"accel_samples": 3,
"leg": "out",
"name": "Y sanity 40mm",
"peak": 2400.0,
"states": [
"Jog",
"Idle"
],
"t0": 1792363827.6374068,
"t1": 1792363828.7526503
},
{
"accel_p2p": [
493,
124
],
"accel_samples": 2,
"leg": "back",
"name": "Y sanity 40mm",
"peak": 2400.0,
"states": [
"Jog",
"Idle"
],
"t0": 1792363828.7528515,
"t1": 1792363829.8636105
},
{
"accel_p2p": [
139,
230
],
"accel_samples": 2,
"leg": "out",
"name": "X max-rate 60mm",
"peak": 10500.0,
"states": [
"Jog",
"Idle"
],
"t0": 1792363829.8638222,
"t1": 1792363830.5692635
},
{
"accel_p2p": [
2239,
12
],
"accel_samples": 2,
"leg": "back",
"name": "X max-rate 60mm",
"peak": 10500.0,
"states": [
"Jog",
"Idle"
],
"t0": 1792363830.5694687,
"t1": 1792363831.2644637
},
{
"accel_p2p": [
0,
0
],
"accel_samples": 1,
"leg": "out",
"name": "diag 40mm",
"peak": 8000.0,
"states": [
"Jog",
"Idle"
],
"t0": 1792363831.2646766,
"t1": 1792363831.9733396
},
{
"accel_p2p": [
833,
1722
],
"accel_samples": 2,
"leg": "back",
"name": "diag 40mm",
"peak": 8000.0,
"states": [
"Jog",
"Idle"
],
"t0": 1792363831.9735389,
"t1": 1792363832.6655304
}
],
"reset": {
"faults": [
"0",
"0"
],
"homed_after": 4,
"homed_before": 4,
"kernel_after": [
3487,
0,
0,
0,
0
],
"kernel_before": [
0,
0,
0,
1421172,
1421172
],
"kernel_delta_steps": [
3487,
0,
0
],
"kernel_end_state": "idle",
"kernel_handed_back": [
0,
0,
0,
67339,
67339
],
"last_running_s": 0.3381,
"left_running_s": 0.3441,
"lost_messages": [],
"mpos_after": [
16.345,
0.0,
4.449
],
"mpos_before": [
0.0,
0.0,
4.449
],
"mpos_delta_steps": [
3486.93,
0.0,
0.0
],
"queue_at_x": 22301,
"ramp_rate": 500000,
"ramp_s": 0.2235,
"ramp_ticks": 12686,
"readback_log": [
"2026-10-18T22:50:39.323005+00:00 grblhal[1494] INFO soft reset: the kernel ramped the motion down; the position drops 31 0 0 steps that never played"
],
"ring_after": 0,
"ring_at_idle": 315,
"samples": 59,
"spm": [
213.33299,
213.33299,
2.922
],
"state_after_x": "Alarm",
"step_freq": 112640,
"t_x": 1792363838.974,
"tail": {
"fraction": 0.037,
"rate_hz": 4188,
"window_s": 0.0291
},
"underruns": [
1,
1
],
"unlock": [
"[MSG:Caution: Unlocked]",
"ok"
]
},
"start": [
0.0,
0.0,
4.449
]
},
"fingerprint": "167f7bc47a2856820b32b2051804688c42b76d95902f22b48366dc475e710d2c",
"image": "20261018222431 (dev)",
"log": [
"22:50:24 start motion.jog-roundtrip (auto, api) in campaign c-20261018224638-4ca0",
"22:50:24 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
"22:50:24 fixture: <REDACTED-1> at <IP-1> covers lid, interlock, button",
"22:50:24 queued by the unattended queue opened 2026-10-18T22:46:38Z",
"22:50:24 baseline: pre: clean",
"22:50:24 mode: test needs grbl - already in grbl mode",
"22:50:25 connect: Idle",
"22:50:26 X sanity 40mm out: peak 2400 mm/min, states ['Jog', 'Idle']; accel p2p x=2 y=181 over 2 samples",
"22:50:27 X sanity 40mm back: peak 2400 mm/min, states ['Jog', 'Idle']; accel p2p x=725 y=531 over 3 samples",
"22:50:28 Y sanity 40mm out: peak 2400 mm/min, states ['Jog', 'Idle']; accel p2p x=464 y=141 over 3 samples",
"22:50:29 Y sanity 40mm back: peak 2400 mm/min, states ['Jog', 'Idle']; accel p2p x=493 y=124 over 2 samples",
"22:50:30 X max-rate 60mm out: peak 10500 mm/min, states ['Jog', 'Idle']; accel p2p x=139 y=230 over 2 samples",
"22:50:31 X max-rate 60mm back: peak 10500 mm/min, states ['Jog', 'Idle']; accel p2p x=2239 y=12 over 2 samples",
"22:50:31 diag 40mm out: peak 8000 mm/min, states ['Jog', 'Idle']; accel p2p x=0 y=0 over 1 samples",
"22:50:32 diag 40mm back: peak 8000 mm/min, states ['Jog', 'Idle']; accel p2p x=833 y=1722 over 2 samples",
"22:50:32 accel over all 8 legs: p2p x=3934 y=1766 (17 samples, 0 errors); motion seen on 2 legs",
"22:50:34 after !: Hold:0",
"22:50:36 after ~: states ['Run', 'Idle']",
"22:50:42 soft reset during the move: kernel idle 344 ms after the ^X (queue 22301 ticks at the ^X, ramp 12686 ticks over 224 ms), tail {'window_s': 0.0291, 'rate_hz': 4188, 'fraction': 0.037}; kernel delta [3487, 0, 0] steps, MPos delta [3486.93, 0.0, 0.0] steps, homed 4 -> 4, ring 0 after the reset, read-back ['2026-10-18T22:50:39.323005+00:00 grblhal[1494] INFO soft reset: the kernel ramped the motion down; the position drops 31 0 0 steps that never played']",
"22:50:42 final drift 0.000 mm (start (0.0, 0.0, 4.449), final (0.0, 0.0, 4.449))",
"22:50:42 PASS: 8 jogs, peak 10500 mm/min, hold parked, drift 0.000 mm, accel p2p 3934 over the jogs, motion on 2 of 8 legs",
"22:50:42 baseline: post: clean",
"22:50:42 result PASS"
],
"manifest_sha": "70ecd7867c2698d17f2f3c38db772868eda3364f541242c93fb5db4e1d593bcd",
"message": "",
"result": "PASS",
"test": "motion.jog-roundtrip",
"ts": "2026-10-18T22:50:42Z"
},
"requires": [
"kernel.latch-locked-idle",
"kernel.k1-k2"
],
"satisfied": true,
"source_sha": "c06681105fb24527a6b7a9e194d0ae67556a2b514dab4b44a7fa1e4d3a83bf83",
"subsystem": "motion",
"title": "Motion quality: bounded jogs, max rate, diagonal, hold/resume, a soft reset during a move"
},
{
"always": false,
"covers": [
[
"grblhal-glowforge",
"src/**"
],
[
"kernel-module-glowforge",
"**"
],
[
"forgectrl",
"src/super.*"
],
[
"forgectrl",
"src/liveness.*"
],
[
"forgectrl",
"src/main.c"
],
[
"forgectrl",
"src/settings.*"
]
],
"fingerprint": "d35091e337f818139ee937c9119bb858d26cfc3bcc582a684ef77cfb72985761",
"hardware": "api",
"id": "motion.microstep-modes",
"inherited": false,
"kind": "auto",
"record": {
"answers": [],
"campaign": "c-20261018224638-4ca0",
"duration_s": 24,
"evidence": {
"baseline": {
"post": [],
"pre": []
},
"batch": {
"group": "unattended",
"ts": "2026-10-18T22:46:38Z"
},
"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": [
2826,
586
],
"accel_samples": 5,
"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": [
3373,
439
],
"accel_samples": 5,
"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": [
3419,
472
],
"accel_samples": 5,
"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": "d35091e337f818139ee937c9119bb858d26cfc3bcc582a684ef77cfb72985761",
"image": "20261018222431 (dev)",
"log": [
"22:50:43 start motion.microstep-modes (auto, api) in campaign c-20261018224638-4ca0",
"22:50:43 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
"22:50:43 fixture: <REDACTED-1> at <IP-1> covers lid, interlock, button",
"22:50:43 queued by the unattended queue opened 2026-10-18T22:46:38Z",
"22:50:43 baseline: pre: clean",
"22:50:43 mode: test needs grbl - already in grbl mode",
"22:50:43 --- x8 ---",
"22:50:45 baseline: /mode controller=running motion=verified",
"22:50:46 baseline: controller configured 1.0 s after running",
"22:50:47 connect: Idle",
"22:50:49 x8: out 39.990 mm by the kernel, peak 9578/9578 mm/min, drift 0.000 mm, accel p2p x=2826 y=586 over 5 samples",
"22:50:49 --- x16 ---",
"22:50:52 baseline: /mode controller=running motion=verified",
"22:50:53 baseline: controller configured 1.0 s after running",
"22:50:53 connect: Idle",
"22:50:56 x16: out 40.000 mm by the kernel, peak 9580/9580 mm/min, drift 0.000 mm, accel p2p x=3373 y=439 over 5 samples",
"22:50:56 --- x32 ---",
"22:50:59 baseline: /mode controller=running motion=verified",
"22:51:00 baseline: controller configured 1.0 s after running",
"22:51:00 connect: Idle",
"22:51:03 x32: out 40.000 mm by the kernel, peak 9579/9579 mm/min, drift 0.000 mm, accel p2p x=3419 y=472 over 5 samples",
"22:51:05 baseline: /mode controller=running motion=verified",
"22:51:06 baseline: controller configured 1.0 s after running",
"22:51:07 PASS: x8: 39.990 mm, drift 0.000, accel 2826; x16: 40.000 mm, drift 0.000, accel 3373; x32: 40.000 mm, drift 0.000, accel 3419",
"22:51:07 baseline: post: clean",
"22:51:07 result PASS"
],
"manifest_sha": "70ecd7867c2698d17f2f3c38db772868eda3364f541242c93fb5db4e1d593bcd",
"message": "",
"result": "PASS",
"test": "motion.microstep-modes",
"ts": "2026-10-18T22:51:07Z"
},
"requires": [
"motion.jog-roundtrip"
],
"satisfied": true,
"source_sha": "73e3878439b4589d44de7d62818de18b54db8244930e5d8e2c508848af3ad440",
"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": "13a6687b9e1cd4d5005886cc68b30931f9461a9b23b32e26e945720c933ffcd1",
"hardware": "api",
"id": "motion.liveness-probe",
"inherited": false,
"kind": "auto",
"record": {
"answers": [],
"campaign": "c-20261018224638-4ca0",
"duration_s": 9,
"evidence": {
"baseline": {
"post": [],
"pre": []
},
"batch": {
"group": "unattended",
"ts": "2026-10-18T22:46:38Z"
},
"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": 1711,
"why": ""
},
"motor_lock_after": "0",
"probe_lines": [
"2026-10-18T22:51:14.369551+00:00 forgectrl[1683] INFO super: liveness probe: MOTION OK - head accel p2p x=3491 y=1456 (moving>=800 dead<=250)"
]
},
"mode_after": {
"controller": "running",
"gated": false,
"local": false,
"mode": "grbl",
"motion": "verified",
"pid": 1622,
"why": ""
},
"mode_before": {
"controller": "running",
"gated": false,
"local": false,
"mode": "grbl",
"motion": "verified",
"pid": 1622,
"why": ""
}
},
"fingerprint": "13a6687b9e1cd4d5005886cc68b30931f9461a9b23b32e26e945720c933ffcd1",
"image": "20261018222431 (dev)",
"log": [
"22:51:07 start motion.liveness-probe (auto, api) in campaign c-20261018224638-4ca0",
"22:51:07 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
"22:51:07 fixture: <REDACTED-1> at <IP-1> covers lid, interlock, button",
"22:51:07 queued by the unattended queue opened 2026-10-18T22:46:38Z",
"22:51:08 baseline: pre: clean",
"22:51:08 mode: {'mode': 'grbl', 'controller': 'running', 'pid': 1622, 'motion': 'verified', 'gated': False, 'local': False, 'why': ''}",
"22:51:08 mode after: {'mode': 'grbl', 'controller': 'running', 'pid': 1622, 'motion': 'verified', 'gated': False, 'local': False, 'why': ''}",
"22:51:08 masked every axis (cnc/motor_lock=15); restarting forgectrl for a fresh probe",
"22:51:16 super: liveness probe: MOTION OK - head accel p2p x=3491 y=1456 (moving>=800 dead<=250)",
"22:51:16 kernel X 0.0 -> 0.0 mm across the probe (out and back)",
"22:51:16 PASS: masked restart probed MOTION OK on the first try, mask cleared, controller up",
"22:51:16 baseline: post: clean",
"22:51:16 result PASS"
],
"manifest_sha": "70ecd7867c2698d17f2f3c38db772868eda3364f541242c93fb5db4e1d593bcd",
"message": "",
"result": "PASS",
"test": "motion.liveness-probe",
"ts": "2026-10-18T22:51:16Z"
},
"requires": [
"kernel.latch-locked-idle"
],
"satisfied": true,
"source_sha": "c0696e95b8c60c40589e2470d437dda25a60c78a854c8db3bd78cb6307717861",
"subsystem": "motion",
"title": "Supervisor motion-liveness verdict"
},
{
"always": false,
"covers": [
[
"grblhal-glowforge",
"src/**"
],
[
"kernel-module-glowforge",
"**"
],
[
"forgectrl",
"src/super.*"
],
[
"forgectrl",
"src/liveness.*"
],
[
"forgectrl",
"src/main.c"
],
[
"forgectrl",
"init/**"
]
],
"fingerprint": "583f95537e21401412908d5861c0de976d1ecfcd8f37dc56b945aa3272fd67d6",
"hardware": "api",
"id": "motion.deadman",
"inherited": false,
"kind": "auto",
"record": {
"answers": [],
"campaign": "c-20261018224638-4ca0",
"duration_s": 45,
"evidence": {
"baseline": {
"post": [],
"pre": []
},
"batch": {
"group": "unattended",
"ts": "2026-10-18T22:46:38Z"
},
"fixture": {
"channels": [
"lid",
"interlock",
"button"
],
"hostname": "<REDACTED-1>",
"ip": "<IP-1>",
"released": []
},
"homing_kill": {
"homing_mode": "manual",
"kernel_state_at_respawn": "idle",
"mode_after": {
"controller": "running",
"gated": false,
"local": false,
"mode": "grbl",
"motion": "verified",
"pid": 1904,
"why": ""
},
"pulse_holders": [
"forgectrl",
"grblHAL_glowfor"
],
"respawn_s": 2.0,
"runner_gone_s": 2.0123884677886963,
"super_lines": [
"2026-10-18T22:52:00.421374+00:00 forgectrl[1809] 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": 1865,
"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-10-18T22:51:33.637493+00:00 grblhal[1751] WARNING gfstream: run: 94 late events clamped (max behind 92.5 ms, lead 10 ms) - step generation was starved of CPU"
},
"sigkill": {
"new": {
"controller": "running",
"gated": false,
"local": false,
"mode": "grbl",
"motion": "verified",
"pid": 1751,
"why": ""
},
"old_pid": 1711,
"respawn_s": 1.2,
"unlocked_seen": false
},
"sigstop": {
"after": {
"controller": "running",
"gated": false,
"local": false,
"mode": "grbl",
"motion": "verified",
"pid": 1751,
"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": "583f95537e21401412908d5861c0de976d1ecfcd8f37dc56b945aa3272fd67d6",
"image": "20261018222431 (dev)",
"log": [
"22:51:16 start motion.deadman (auto, api) in campaign c-20261018224638-4ca0",
"22:51:16 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
"22:51:16 fixture: <REDACTED-1> at <IP-1> covers lid, interlock, button",
"22:51:16 queued by the unattended queue opened 2026-10-18T22:46:38Z",
"22:51:16 baseline: pre: clean",
"22:51:16 mode: test needs grbl - already in grbl mode",
"22:51:17 connect: Idle",
"22:51:18 SIGKILL sent to controller pid 1711 mid-move",
"22:51:19 after SIGKILL: respawned as {'mode': 'grbl', 'controller': 'running', 'pid': 1751, 'motion': 'verified', 'gated': False, 'local': False, 'why': ''} in 1.2 s; latch unlocked seen: False",
"22:51:22 kernel X: 0.0 -> 0.0 mm",
"22:51:23 connect: Idle",
"22:51:24 SIGSTOP sent to controller pid 1751 mid-move",
"22:51:24 after SIGSTOP: kernel underrun in 0.21 s, latch locked True, underruns 1 -> 2",
"22:51:25 controller resumed: state Alarm",
"22:51:25 $X before the reset: ['ALARM:17', 'error:79']",
"22:51:27 after the soft reset: Alarm",
"22:51:27 $X after the reset: ['[MSG:Caution: Unlocked]', 'ok']",
"22:51:27 ring after the reset: free 33521664 (idle 33521664)",
"22:51:32 connect: Idle",
"22:51:33 SIGSTOP 100 ms sent to controller pid 1751 mid-move",
"22:51:39 short stall: states ['Run', 'Idle'], underruns +0, warning '2026-10-18T22:51:33.637493+00:00 grblhal[1751] WARNING gfstream: run: 94 late events clamped (max behind 92.5 ms, lead 10 ms) - step generation was starved of CPU', kernel dx 30.0 mm",
"22:51:42 connect: Idle",
"22:51:44 forgectrl restart mid-move -> rc 0",
"22:51:48 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
"22:51:48 move after the restart: states ['Run', 'Idle']",
"22:51:56 mode after restart: {'mode': 'grbl', 'controller': 'running', 'pid': 1865, 'motion': 'verified', 'gated': False, 'local': False, 'why': ''}",
"22:51:56 retake: unmanaged pid 1751 finished the move; supervised pid 1865 started at idle",
"22:51:56 connect: Idle",
"22:52:00 SIGKILL sent to controller pid 1865 during $H (runner pid [1877])",
"22:52:02 kill during $H: runner gone in 2.0123884677886963 s, respawned as 1904, kernel idle, pulse held by ['forgectrl', 'grblHAL_glowfor']",
"22:52:02 restore homing_mode='manual' -> 200",
"22:52:02 PASS: kill respawned in 1.2 s, hang -> underrun in 0.21 s, short stall warned and completed, restart retook supervision (pid 1865), the kill during $H ended the runner (2.0123884677886963)",
"22:52:02 baseline: post: clean",
"22:52:02 result PASS"
],
"manifest_sha": "70ecd7867c2698d17f2f3c38db772868eda3364f541242c93fb5db4e1d593bcd",
"message": "",
"result": "PASS",
"test": "motion.deadman",
"ts": "2026-10-18T22:52:02Z"
},
"requires": [
"motion.pacing",
"kernel.k1-k2"
],
"satisfied": true,
"source_sha": "9af0217eb8432f930efa00a8635e0b9c6d748ff07724524157f1ac17ee3d003f",
"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": "845f1fb14651012b35906e0efb077c0bba52ec50c9b2dd7c3c2f7e4f10b12d03",
"hardware": "api",
"id": "motion.step-timing-under-load",
"inherited": false,
"kind": "auto",
"record": {
"answers": [],
"campaign": "c-20261018224638-4ca0",
"duration_s": 30,
"evidence": {
"baseline": {
"post": [],
"pre": []
},
"batch": {
"group": "unattended",
"ts": "2026-10-18T22:46:38Z"
},
"clamp_lines": [],
"controller_cpu_pct": 30.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.6,
"rt_priorities": [
9,
10
],
"threads": 4
},
"fingerprint": "845f1fb14651012b35906e0efb077c0bba52ec50c9b2dd7c3c2f7e4f10b12d03",
"image": "20261018222431 (dev)",
"log": [
"22:52:02 start motion.step-timing-under-load (auto, api) in campaign c-20261018224638-4ca0",
"22:52:03 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
"22:52:03 fixture: <REDACTED-1> at <IP-1> covers lid, interlock, button",
"22:52:03 queued by the unattended queue opened 2026-10-18T22:46:38Z",
"22:52:03 baseline: pre: clean",
"22:52:03 mode: test needs grbl - already in grbl mode",
"22:52:03 controller threads: 4, SCHED_FIFO priorities: [9, 10]",
"22:52:03 CPU hog started (pid 1932, nice 5)",
"22:52:03 connect: Idle",
"22:52:30 20 legs in 26.6 s, controller CPU 30.6 %",
"22:52:32 CPU hog stopped",
"22:52:32 PASS: 20 legs at 2000 mm/min against a nice-5 CPU hog, no clamped events",
"22:52:33 baseline: post: clean",
"22:52:33 result PASS"
],
"manifest_sha": "70ecd7867c2698d17f2f3c38db772868eda3364f541242c93fb5db4e1d593bcd",
"message": "",
"result": "PASS",
"test": "motion.step-timing-under-load",
"ts": "2026-10-18T22:52:33Z"
},
"requires": [
"kernel.latch-locked-idle",
"motion.jog-roundtrip"
],
"satisfied": true,
"source_sha": "506323b4fc5b9590e8a7cba67a5b9f6f0188d586114e9efe477d1eb4d779eece",
"subsystem": "motion",
"title": "Step timing holds while userspace competes for the core"
},
{
"always": false,
"covers": [
[
"grblhal-glowforge",
"src/**"
],
[
"kernel-module-glowforge",
"**"
],
[
"forgectrl",
"src/super.*"
],
[
"forgectrl",
"src/liveness.*"
],
[
"forgectrl",
"src/status.*"
],
[
"forgectrl",
"src/wizdark.*"
]
],
"fingerprint": "7c82f74b964351d8cdbc8c2cac6a59583684f7f852bd5c75789a1d0fe6dd4935",
"hardware": "takeover",
"id": "motion.release",
"inherited": false,
"kind": "auto",
"record": {
"answers": [],
"campaign": "c-20261018224638-4ca0",
"duration_s": 26,
"evidence": {
"baseline": {
"post": [],
"pre": []
},
"batch": {
"group": "unattended",
"ts": "2026-10-18T22:46:38Z"
},
"elapsed_s": 19.2,
"energized_currents": [
"33",
"5"
],
"error": "",
"faults_energized": 0,
"faults_released": 0,
"fixture": {
"channels": [
"lid",
"interlock",
"button"
],
"hostname": "<REDACTED-1>",
"ip": "<IP-1>",
"released": []
},
"homed_axes_released": 4,
"kernel_position": [
[
0,
0,
0,
3259780,
3259780
],
[
0,
0,
0,
3259780,
3259780
]
],
"kernel_state_released": "idle",
"log": [
"00:06 liveness probe: head accel p2p x=2367 y=2189 (moving>=800 dead<=250)",
"00:08 lens reference pass 1: 0",
"00:08 lens reference pass 2: 0",
"00:09 lens reference pass 3: 0",
"00:10 lens reference pass 4: 0",
"00:12 lens reference pass 5: 0",
"00:13 at rest: accelerometer low-passed p2p x 280 y 133 (rms 170 57) over 176 samples",
"00:14 +X: accelerometer low-passed p2p x 1756 y 871 (rms 787 415, raw p2p 3762 3157, 195 sampl",
"00:16 -X: accelerometer low-passed p2p x 2001 y 922 (rms 811 473, raw p2p 5151 3624, 192 sampl",
"00:17 +Y: accelerometer low-passed p2p x 438 y 1696 (rms 224 771, raw p2p 1266 3163, 193 sampl",
"00:18 -Y: accelerometer low-passed p2p x 388 y 1526 (rms 221 576, raw p2p 1266 2820, 192 sampl"
],
"mode": {
"detail": "already in grbl mode",
"found": "grbl",
"needs": "grbl",
"ok": true,
"switched": false
},
"mode_cloud_released": {
"body": "the X and Y motors are released: energize them first",
"cloud_enabled": true,
"status": 409
},
"moves": {
"+X": {
"crash_event": false,
"p2p_lp_x": 1756,
"p2p_lp_y": 871,
"p2p_x": 3762,
"p2p_y": 3157,
"rms_x": 787.0,
"rms_y": 415.0,
"samples": 195,
"witnessed": true
},
"+Y": {
"crash_event": false,
"p2p_lp_x": 438,
"p2p_lp_y": 1696,
"p2p_x": 1266,
"p2p_y": 3163,
"rms_x": 224.0,
"rms_y": 771.0,
"samples": 193,
"witnessed": true
},
"-X": {
"crash_event": false,
"p2p_lp_x": 2001,
"p2p_lp_y": 922,
"p2p_x": 5151,
"p2p_y": 3624,
"rms_x": 811.0,
"rms_y": 473.0,
"samples": 192,
"witnessed": true
},
"-Y": {
"crash_event": false,
"p2p_lp_x": 388,
"p2p_lp_y": 1526,
"p2p_x": 1266,
"p2p_y": 2820,
"rms_x": 221.0,
"rms_y": 576.0,
"samples": 192,
"witnessed": true
}
},
"phases": [
"the lens hall reference",
"the lens finds its reference on the hall sensor: pass 1 of 5",
"the lens finds its reference on the hall sensor: pass 2 of 5",
"the lens finds its reference on the hall sensor: pass 3 of 5",
"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",
"the head at rest",
"jog +X",
"jog -X",
"jog +Y",
"jog -Y"
],
"probe": "head accel p2p x=2367 y=2189 (moving>=800 dead<=250)",
"rail_lines": [
9,
9
],
"refusals": {
"$J=G91X10F2400": "error:8",
"$X": "error:9",
"G0X10": "error:9",
"^X then $X": "error:9"
},
"released_accel_p2p": [
261,
92,
3
],
"released_currents": [
"0",
"0"
],
"result": {
"moves": {
"+X": {
"crash_event": false,
"p2p_lp_x": 1756,
"p2p_lp_y": 871,
"p2p_x": 3762,
"p2p_y": 3157,
"rms_x": 787.0,
"rms_y": 415.0,
"samples": 195,
"witnessed": true
},
"+Y": {
"crash_event": false,
"p2p_lp_x": 438,
"p2p_lp_y": 1696,
"p2p_x": 1266,
"p2p_y": 3163,
"rms_x": 224.0,
"rms_y": 771.0,
"samples": 193,
"witnessed": true
},
"-X": {
"crash_event": false,
"p2p_lp_x": 2001,
"p2p_lp_y": 922,
"p2p_x": 5151,
"p2p_y": 3624,
"rms_x": 811.0,
"rms_y": 473.0,
"samples": 192,
"witnessed": true
},
"-Y": {
"crash_event": false,
"p2p_lp_x": 388,
"p2p_lp_y": 1526,
"p2p_x": 1266,
"p2p_y": 2820,
"rms_x": 221.0,
"rms_y": 576.0,
"samples": 192,
"witnessed": true
}
},
"probe": "head accel p2p x=2367 y=2189 (moving>=800 dead<=250)",
"rail": "up",
"rest": {
"p2p_lp_x": 280,
"p2p_lp_y": 133,
"p2p_x": 944,
"p2p_y": 418,
"rms_x": 170.0,
"rms_y": 57.0,
"samples": 176
},
"z_passes": [
0,
0,
0,
0,
0
],
"z_referenced": true
},
"started": true,
"state_after_reset": "Alarm",
"state_energized": "Idle",
"state_released": "Alarm"
},
"fingerprint": "7c82f74b964351d8cdbc8c2cac6a59583684f7f852bd5c75789a1d0fe6dd4935",
"image": "20261018222431 (dev)",
"log": [
"22:52:33 start motion.release (auto, takeover) in campaign c-20261018224638-4ca0",
"22:52:33 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
"22:52:33 fixture: <REDACTED-1> at <IP-1> covers lid, interlock, button",
"22:52:33 queued by the unattended queue opened 2026-10-18T22:46:38Z",
"22:52:33 baseline: pre: clean",
"22:52:33 mode: test needs grbl - already in grbl mode",
"22:52:34 connect: Idle",
"22:52:35 $MD: step currents ['0', '0'], Alarm, cnc/state idle, faults 0, homed_axes 4",
"22:52:39 refused while released: {'$J=G91X10F2400': 'error:8', 'G0X10': 'error:9', '$X': 'error:9', '^X then $X': 'error:9'}; accel p2p x=261 y=92 over 3 samples; kernel record (0, 0, 0, 3259780, 3259780) -> (0, 0, 0, 3259780, 3259780)",
"22:52:39 POST /mode controller=cloud while released -> 409 the X and Y motors are released: energize them first",
"22:52:40 NOTICE: The head moves 50 mm each way on X and on Y. Keep the bed clear.",
"22:52:40 POST /wiz/motion/start -> 200 {'started': True, 'id': 'motion'}",
"22:52:40 motion: stopping the motion controller",
"22:52:41 motion: rail up, the liveness probe",
"22:52:46 motion: the lens hall reference",
"22:52:47 motion: the lens finds its reference on the hall sensor: pass 1 of 5",
"22:52:48 motion: the lens finds its reference on the hall sensor: pass 2 of 5",
"22:52:49 motion: the lens finds its reference on the hall sensor: pass 3 of 5",
"22:52:50 motion: the lens finds its reference on the hall sensor: pass 4 of 5",
"22:52:51 motion: the lens finds its reference on the hall sensor: pass 5 of 5",
"22:52:52 motion: starting the controller in loopback posture",
"22:52:52 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.",
"22:52:53 motion: the head at rest",
"22:52:54 motion: jog +X",
"22:52:55 motion: jog -X",
"22:52:56 motion: jog +Y",
"22:52:57 motion: jog -Y",
"22:52:59 after energize: probe 'head accel p2p x=2367 y=2189 (moving>=800 dead<=250)', moves {'+X': True, '-X': True, '+Y': True, '-Y': True}",
"22:52:59 PASS: released with the rail untouched, every motion refused and nothing shipped, energized with no fault, and the liveness probe and the witnessed jogs say the drivers are alive",
"22:52:59 baseline: post: clean",
"22:52:59 result PASS"
],
"manifest_sha": "70ecd7867c2698d17f2f3c38db772868eda3364f541242c93fb5db4e1d593bcd",
"message": "",
"result": "PASS",
"test": "motion.release",
"ts": "2026-10-18T22:52:59Z"
},
"requires": [
"motion.jog-roundtrip"
],
"satisfied": true,
"source_sha": "249e36b4bebb85be1c706d5735164c6321f193e6b180ad6f070ed9ef5748dbca",
"subsystem": "motion",
"title": "Motor release: nothing moves a released gantry, only the operator energizes it"
},
{
"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": "0b172a1d48a879020957670682d8e588b69652c08c2dc9ab9044031d94df518a",
"hardware": "api",
"id": "cooling.aa-offset-calibrate",
"inherited": false,
"kind": "auto",
"record": {
"answers": [],
"campaign": "c-20261018224638-4ca0",
"duration_s": 92,
"evidence": {
"baseline": {
"post": [],
"pre": []
},
"batch": {
"group": "unattended",
"ts": "2026-10-18T22:46:38Z"
},
"fixture": {
"channels": [
"lid",
"interlock",
"button"
],
"hostname": "<REDACTED-1>",
"ip": "<IP-1>",
"released": []
},
"result": {
"offset_counts": 15.5,
"recommend": 15.5,
"spread_counts": 1.7,
"steps": [
[
16.0,
15.4
],
[
-15.5,
-15.5
],
[
15.5,
14.6
],
[
-15.1,
-15.5
],
[
15.6,
15.5
],
[
-15.6,
-16.3
]
]
}
},
"fingerprint": "0b172a1d48a879020957670682d8e588b69652c08c2dc9ab9044031d94df518a",
"image": "20261018222431 (dev)",
"log": [
"22:53:00 start cooling.aa-offset-calibrate (auto, api) in campaign c-20261018224638-4ca0",
"22:53:00 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
"22:53:00 fixture: <REDACTED-1> at <IP-1> covers lid, interlock, button",
"22:53:00 queued by the unattended queue opened 2026-10-18T22:46:38Z",
"22:53:00 baseline: pre: clean",
"22:53:00 POST /diag/aa-offset-calibrate -> 202 {'started': True}",
"22:53:00 phase: stopping the motion controller",
"22:53:02 phase: settling with the fans idle",
"22:53:16 phase: cycle 1/3: air assist to run",
"22:53:28 phase: cycle 1/3: air assist to idle",
"22:53:30 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
"22:53:40 phase: cycle 2/3: air assist to run",
"22:53:54 phase: cycle 2/3: air assist to idle",
"22:54:01 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
"22:54:06 phase: cycle 3/3: air assist to run",
"22:54:18 phase: cycle 3/3: air assist to idle",
"22:54:31 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
"22:54:32 phase: done",
"22:54:32 diag: 0:00 start: air assist 204 <-> 1023, 3 cycles",
"22:54:32 diag: 0:27 edge 1 (to run): down +16.0, up +15.4 counts",
"22:54:32 diag: 0:40 edge 2 (to idle): down -15.5, up -15.5 counts",
"22:54:32 diag: 0:52 edge 3 (to run): down +15.5, up +14.6 counts",
"22:54:32 diag: 1:05 edge 4 (to idle): down -15.1, up -15.5 counts",
"22:54:32 diag: 1:18 edge 5 (to run): down +15.6, up +15.5 counts",
"22:54:32 diag: 1:30 edge 6 (to idle): down -15.6, up -16.3 counts",
"22:54:32 diag: 1:30 offset 15.5 counts (spread 1.7) over 6 edges",
"22:54:32 diag: 1:30 done",
"22:54:32 offset 15.5 counts, spread 1.7, recommend 15.5, edges [[16.0, 15.4], [-15.5, -15.5], [15.5, 14.6], [-15.1, -15.5], [15.6, 15.5], [-15.6, -16.3]]",
"22:54:32 baseline: post: clean",
"22:54:32 result PASS"
],
"manifest_sha": "70ecd7867c2698d17f2f3c38db772868eda3364f541242c93fb5db4e1d593bcd",
"message": "",
"result": "PASS",
"test": "cooling.aa-offset-calibrate",
"ts": "2026-10-18T22:54:32Z"
},
"requires": [
"kernel.latch-locked-idle"
],
"satisfied": true,
"source_sha": "8a40e4653ab3c9a5bdc6fa8c141ecb4f63e49e5b1546b530a2b11ffd4b6d4c64",
"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": "a6ff88946822557015d1ecbd5e23ea0527d244a151f94f05157d0bca318a63c9",
"hardware": "api",
"id": "cooling.flow-verify",
"inherited": false,
"kind": "auto",
"record": {
"answers": [],
"campaign": "c-20261018224638-4ca0",
"duration_s": 157,
"evidence": {
"baseline": {
"post": [],
"pre": []
},
"batch": {
"group": "unattended",
"ts": "2026-10-18T22:46:38Z"
},
"fixture": {
"channels": [
"lid",
"interlock",
"button"
],
"hostname": "<REDACTED-1>",
"ip": "<IP-1>",
"released": []
},
"result": {
"flow_dt": 9.1,
"flow_rise": 10.5,
"margin_flow": 4.0,
"margin_noflow": 1.8,
"noflow_dt": 11.7,
"noflow_rise": 16.3,
"pass": true,
"thin_margin": false,
"threshold": 14.5
}
},
"fingerprint": "a6ff88946822557015d1ecbd5e23ea0527d244a151f94f05157d0bca318a63c9",
"image": "20261018222431 (dev)",
"log": [
"22:54:33 start cooling.flow-verify (auto, api) in campaign c-20261018224638-4ca0",
"22:54:33 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
"22:54:33 fixture: <REDACTED-1> at <IP-1> covers lid, interlock, button",
"22:54:33 queued by the unattended queue opened 2026-10-18T22:46:38Z",
"22:54:33 baseline: pre: clean",
"22:54:33 POST /diag/flow-verify -> 202 {'started': True}",
"22:54:33 phase: stopping the motion controller (down 24.9 C, up 24.8 C)",
"22:54:35 phase: settling before trial 1/1 (pump on) (down 24.9 C, up 24.9 C)",
"22:54:49 phase: trial 1/1: heater 40% for 50 s (pump on) (down 24.9 C, up 24.9 C)",
"22:55:04 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
"22:55:35 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
"22:55:41 phase: settling before trial 1/1 (pump off) (down 34.9 C, up 25.0 C)",
"22:56:05 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
"22:56:17 phase: trial 1/1: heater 40% for 50 s (pump off) (down 23.2 C, up 22.6 C)",
"22:56:36 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
"22:57:06 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
"22:57:09 phase: done (down 39.7 C, up 28.1 C)",
"22:57:09 diag: 0:00 start: duty 40%, window 50 s, threshold 14.5 C",
"22:57:09 diag: 1:07 trial 1/1 flow: rise 10.5 C, dT 9.1 C",
"22:57:09 diag: 2:35 trial 1/1 no-flow: rise 16.3 C, dT 11.7 C",
"22:57:09 diag: 2:35 verdict: PASS (flow 10.5 / threshold 14.5 / no-flow 16.3)",
"22:57:09 diag: 2:35 done",
"22:57:09 verdict: pass=True threshold=14.5 flow_rise=10.5 noflow_rise=16.3 margins 4.0/1.8 thin=False",
"22:57:10 baseline: post: clean",
"22:57:10 result PASS"
],
"manifest_sha": "70ecd7867c2698d17f2f3c38db772868eda3364f541242c93fb5db4e1d593bcd",
"message": "",
"result": "PASS",
"test": "cooling.flow-verify",
"ts": "2026-10-18T22:57:10Z"
},
"requires": [
"kernel.latch-locked-idle"
],
"satisfied": true,
"source_sha": "6ab41e5ccf73559de77d6e8709cbd18d93e9d5d8d2e09cdb024467fc82f59c67",
"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/main.c"
]
],
"fingerprint": "945f0999e92965d478e18fc458f01a628d86d51c231b6656fb3f012fda63f670",
"hardware": "api",
"id": "cooling.flow-under-load",
"inherited": false,
"kind": "live",
"record": {
"answers": [],
"campaign": "c-20261018224638-4ca0",
"duration_s": 95,
"evidence": {
"actions": [
{
"by": "operator",
"channel": "button",
"state": "presence",
"took_s": 5.44,
"ts": "2026-10-18T23:11:27Z"
},
{
"by": "fixture",
"channel": "button",
"state": "arm",
"took_s": 0.25,
"ts": "2026-10-18T23:11:27Z"
}
],
"baseline": {
"post": [],
"pre": []
},
"batch": {
"group": "attended",
"ts": "2026-10-18T23:07:24Z"
},
"check_s": 50,
"disarm_after_m2_s": 0.6,
"dt_c": 9.4,
"emission_peak": 255,
"fixture": {
"channels": [
"lid",
"interlock",
"button"
],
"hostname": "<REDACTED-1>",
"ip": "<IP-1>",
"released": []
},
"heater_seen": true,
"job_to_verdict_s": 72.8,
"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-10-18T23:11:21Z"
},
"raw_rise_c": 13.0,
"rise_c": 11.4,
"verdict_line": "coolant flow verified (heater rise 11.4 C, dT 9.4 C; laser 1.6 off 13.0)",
"verdicts_seen": []
},
"fingerprint": "945f0999e92965d478e18fc458f01a628d86d51c231b6656fb3f012fda63f670",
"image": "20261018222431 (dev)",
"log": [
"23:11:21 start cooling.flow-under-load (live, api) in campaign c-20261018224638-4ca0",
"23:11:21 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
"23:11:21 fixture: <REDACTED-1> at <IP-1> covers lid, interlock, button",
"23:11:21 queued by the attended queue opened 2026-10-18T23:07:24Z",
"23:11:21 baseline: pre: clean",
"23:11:21 mode: test needs grbl - already in grbl mode",
"23:11:21 connect: Idle",
"23:11:21 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.",
"23:11:21 READY: waiting for the operator's press on the machine (the bench then does every press in this test)",
"23:11:27 READY: operator present (press after 5.4 s); the bench takes the presses",
"23:11:27 ARM: the fixture presses when the button lights (the bench's arm_press opt-in)",
"23:11:28 ARM press by the fixture, button lit after 0.3 s",
"23:11:51 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
"23:12:21 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
"23:12:40 M2: ['ok']",
"23:12:40 engine: coolant flow verified (heater rise 11.4 C, dT 9.4 C; laser 1.6 off 13.0)",
"23:12:40 PASS: lit through the window, raw rise 13.0 C, laser 1.6 C off, judged 11.4 C against 14.5 (dT 9.4), window closed 0.6 s after M2",
"23:12:52 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
"23:12:56 baseline: cool: run/armed=False/hold=False ended on its own after 16 s; the engine's own post-job work, not a leftover",
"23:12:56 baseline: post: clean",
"23:12:56 result PASS"
],
"manifest_sha": "70ecd7867c2698d17f2f3c38db772868eda3364f541242c93fb5db4e1d593bcd",
"message": "",
"result": "PASS",
"test": "cooling.flow-under-load",
"ts": "2026-10-18T23:12:56Z"
},
"requires": [
"laser.emission-witness",
"cooling.flow-verify"
],
"satisfied": true,
"source_sha": "e4b507a6169c09c94f7f37949b11f14c0911f0e950d5a0fa24eab2b022fbe77a",
"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*"
],
[
"forgectrl",
"src/super.*"
]
],
"fingerprint": "60d2294f67748c01238aa127a2f2361d0f8e6b086cb6446e1b25ffbf7b014101",
"hardware": "api",
"id": "cooling.fail-tier-stop",
"inherited": false,
"kind": "operator",
"record": {
"answers": [],
"campaign": "c-20261018224638-4ca0",
"duration_s": 20,
"evidence": {
"actions": [
{
"by": "operator",
"channel": "button",
"state": "arm",
"ts": "2026-10-18T22:57:11Z"
}
],
"baseline": {
"post": [],
"pre": []
},
"batch": {
"group": "unattended",
"ts": "2026-10-18T22:46:38Z"
},
"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-10-18T22:57:12.684928+00:00 forgectrl[1809] WARNING cool: HEAD CRASH SIGNAL (axes y) - motion stopped, laser locked"
],
"fault_cleared_s": 0.005177021026611328,
"kernel": "idle",
"latch_locked": true,
"mode_after": {
"controller": "running",
"gated": false,
"local": false,
"mode": "grbl",
"motion": "verified",
"pid": 2296,
"why": ""
},
"super_lines": [
"2026-10-18T22:57:12.685236+00:00 forgectrl[1809] WARNING super: head crash signal - the controller is stopped and started again"
]
}
},
"fingerprint": "60d2294f67748c01238aa127a2f2361d0f8e6b086cb6446e1b25ffbf7b014101",
"image": "20261018222431 (dev)",
"log": [
"22:57:10 start cooling.fail-tier-stop (operator, api) in campaign c-20261018224638-4ca0",
"22:57:10 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
"22:57:10 fixture: <REDACTED-1> at <IP-1> covers lid, interlock, button",
"22:57:10 fixture: running unattended (no prompt can be answered)",
"22:57:10 queued by the unattended queue opened 2026-10-18T22:46:38Z",
"22:57:10 baseline: pre: clean",
"22:57:10 mode: test needs grbl - already in grbl mode",
"22:57:11 connect: Idle",
"22:57:11 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:57:11 NOTICE: The button lights white: press it to arm. The machine fires after your press.",
"22:57:12 the crash tier tripped after 1.569854974746704 s",
"22:57:13 after the crash tier: {'mode_after': {'mode': 'grbl', 'controller': 'running', 'pid': 2296, 'motion': 'verified', 'gated': False, 'local': False, 'why': ''}, 'engine_lines': ['2026-10-18T22:57:12.684928+00:00 forgectrl[1809] WARNING cool: HEAD CRASH SIGNAL (axes y) - motion stopped, laser locked'], 'super_lines': ['2026-10-18T22:57:12.685236+00:00 forgectrl[1809] WARNING super: head crash signal - the controller is stopped and started again'], 'emission': 0, 'kernel': 'idle', 'latch_locked': True}",
"22:57:13 the crash fault ended with the run session after 0.005177021026611328 s: {'phase': 'smoke', 'verdict': 'OK', 'hold': False, 'armed': False}",
"22:57:14 restore thresholds: POST /settings {'cool_accel_x_alert': '', 'cool_accel_y_alert': '', 'cool_accel_abort': ''} -> 200",
"22:57:14 PASS: the crash tier stopped the job, locked the latch, and the supervisor restarted the controller (pid 2242 -> 2296)",
"22:57:30 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:57:30 baseline: post: clean",
"22:57:30 result PASS"
],
"manifest_sha": "70ecd7867c2698d17f2f3c38db772868eda3364f541242c93fb5db4e1d593bcd",
"message": "",
"result": "PASS",
"test": "cooling.fail-tier-stop",
"ts": "2026-10-18T22:57:30Z"
},
"requires": [
"motion.deadman"
],
"satisfied": true,
"source_sha": "277a0bccb446e23de5e227350c36fc20edf6602f38c2494cbe457afeb9ff4f47",
"subsystem": "cooling",
"title": "A fail-tier verdict ends the controller: CRASH stops motion, locks the laser, and the supervisor restarts the controller"
},
{
"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": "c86cfd96ff02973a6053bcd78ac9247955cbcc14d89499f2089a5de91ae85460",
"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-10-18T23:09:40Z"
}
],
"campaign": "c-20261018224638-4ca0",
"duration_s": 71,
"evidence": {
"actions": [
{
"by": "operator",
"channel": "button",
"state": "presence",
"took_s": 28.4,
"ts": "2026-10-18T23:09:10Z"
},
{
"by": "fixture",
"channel": "button",
"state": "arm",
"took_s": 0.26,
"ts": "2026-10-18T23:09:10Z"
}
],
"armed_seen": true,
"baseline": {
"post": [],
"pre": []
},
"batch": {
"group": "attended",
"ts": "2026-10-18T23:07:24Z"
},
"beam": {
"delta": 932,
"digital_seen": true,
"idle": 1677,
"peak": 2609,
"samples": 102
},
"button_dark": false,
"button_latch_set_at": [],
"button_latch_unlocked_max": 0,
"button_latch_unlocked_samples": 88,
"disarm_after_idle_s": 1.2,
"emission_end": 0,
"emission_peak": 149,
"exhaust_at_first_fire": 11653,
"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": 929,
"hv_min": 0,
"idle_airflow_fire": [],
"lid_ir_peak": [
53,
52,
55,
61
],
"mode": {
"detail": "already in grbl mode",
"found": "grbl",
"needs": "grbl",
"ok": true,
"switched": false
},
"operator": {
"ack_live": true,
"ts": "2026-10-18T23:08:40Z"
},
"pgood_peak": 255,
"pre_fire": {
"armed": false,
"beam": 1677,
"beam_d": 0,
"button": false,
"button_latch": 1,
"button_lit": false,
"emission": 0,
"exhaust": 3251,
"faults": 0,
"fire_watch": "armed",
"gstate": null,
"homed": false,
"hv": 0,
"hv_enable": false,
"il": 45,
"ir": [
49,
48,
51,
53
],
"kstate": "idle",
"lid": true,
"locked": true,
"msgs": "",
"pgood": 255,
"phase": "idle",
"t": 1792364921.4694262,
"verdict": "OK"
},
"rapid": {
"back_at_s": 4.03,
"emission_reads": {
"gap_max_s": 0.276,
"read": 37,
"unread": 0
},
"hv_max": 0,
"hv_reads": {
"gap_max_s": 0.276,
"read": 37,
"unread": 0
},
"locked_at_dark": false,
"locked_at_out": false,
"out_at_s": 0.63,
"relit": [],
"sampled_past_close_s": 3.01,
"samples": 23,
"span_s": 5.21,
"x_max": 20.002,
"x_start": 0.0
},
"samples": 139,
"trail": [
[
0.0,
null,
"idle",
0,
false,
"idle",
45,
1,
true,
true,
false,
false,
1818,
0,
null
],
[
0.03,
"Idle",
"idle",
0,
false,
"idle",
45,
1,
true,
true,
false,
false,
1815,
0,
"[MSG:Info: press the button to start the laser job]"
],
[
0.21,
"Idle",
"idle",
0,
true,
"idle",
37,
1,
false,
true,
false,
false,
1818,
0,
null
],
[
0.39,
"Idle",
"idle",
0,
true,
"idle",
33,
0,
false,
true,
true,
false,
1817,
0,
null
],
[
0.57,
"Idle",
"idle",
0,
true,
"run",
33,
0,
false,
true,
false,
false,
1816,
0,
null
],
[
0.75,
"Idle",
"idle",
0,
true,
"run",
33,
0,
false,
true,
false,
false,
1817,
0,
null
],
[
0.97,
"Idle",
"idle",
0,
true,
"run",
33,
0,
false,
true,
false,
false,
1817,
0,
null
],
[
1.16,
"Idle",
"idle",
0,
true,
"run",
33,
0,
false,
true,
false,
false,
1819,
0,
null
],
[
1.4,
"Idle",
"idle",
0,
true,
"run",
33,
0,
false,
true,
false,
false,
1819,
0,
null
],
[
1.58,
"Idle",
"idle",
0,
true,
"run",
33,
0,
false,
true,
false,
false,
1818,
0,
null
],
[
1.75,
"Idle",
"idle",
0,
true,
"run",
33,
0,
false,
true,
false,
false,
1819,
0,
null
],
[
1.93,
"Idle",
"idle",
0,
true,
"run",
33,
0,
false,
true,
false,
false,
1818,
0,
null
],
[
2.11,
"Idle",
"idle",
0,
true,
"run",
33,
0,
false,
true,
false,
false,
1821,
0,
null
],
[
2.32,
"Idle",
"idle",
0,
true,
"run",
33,
0,
false,
true,
false,
false,
1817,
0,
null
],
[
2.5,
"Idle",
"idle",
0,
true,
"run",
33,
0,
false,
true,
false,
false,
1823,
0,
null
],
[
2.68,
"Idle",
"idle",
0,
true,
"run",
33,
0,
false,
true,
false,
false,
1818,
0,
null
],
[
2.85,
"Idle",
"idle",
0,
true,
"run",
33,
0,
false,
true,
false,
false,
1819,
0,
null
],
[
3.03,
"Idle",
"idle",
0,
true,
"run",
33,
0,
false,
true,
false,
false,
1823,
0,
null
],
[
3.21,
"Idle",
"idle",
0,
true,
"run",
33,
0,
false,
true,
false,
false,
1818,
0,
null
],
[
3.41,
"Idle",
"idle",
0,
true,
"run",
33,
0,
false,
true,
false,
false,
1819,
0,
null
],
[
3.59,
"Idle",
"idle",
0,
true,
"run",
33,
0,
false,
true,
false,
false,
1821,
0,
null
],
[
3.77,
"Idle",
"idle",
0,
true,
"run",
33,
0,
false,
true,
false,
false,
1819,
0,
null
],
[
3.94,
"Idle",
"idle",
0,
true,
"run",
33,
0,
false,
true,
false,
false,
1821,
0,
null
],
[
4.17,
"Idle",
"idle",
0,
true,
"run",
33,
0,
false,
true,
false,
false,
1821,
0,
null
],
[
4.35,
"Idle",
"idle",
0,
true,
"run",
33,
0,
false,
true,
false,
false,
1819,
0,
null
],
[
4.54,
"Idle",
"idle",
0,
true,
"run",
33,
0,
false,
true,
false,
false,
1820,
0,
null
],
[
4.77,
"Idle",
"idle",
0,
true,
"run",
33,
0,
false,
true,
false,
false,
1819,
0,
null
],
[
4.94,
"Idle",
"idle",
0,
true,
"run",
33,
0,
false,
true,
false,
false,
1821,
0,
null
],
[
5.12,
"Idle",
"idle",
0,
true,
"run",
33,
0,
false,
true,
false,
false,
1819,
0,
null
],
[
5.3,
"Idle",
"idle",
0,
true,
"run",
33,
0,
false,
true,
false,
false,
1823,
0,
null
],
[
5.47,
"Idle",
"idle",
0,
true,
"run",
33,
0,
false,
true,
false,
false,
1823,
0,
null
],
[
5.71,
"Run",
"idle",
0,
true,
"run",
33,
0,
false,
true,
false,
false,
1820,
0,
"[MSG:Info: laser armed (density, floor 14 %, curve custom)]"
],
[
5.99,
"Run",
"running",
0,
true,
"run",
1,
0,
false,
true,
false,
true,
1825,
0,
null
],
[
6.18,
"Run",
"running",
0,
true,
"run",
2,
0,
false,
true,
false,
true,
2589,
170,
null
],
[
6.37,
"Run",
"running",
0,
true,
"run",
2,
0,
false,
true,
false,
true,
2609,
735,
null
],
[
6.57,
"Run",
"running",
0,
true,
"run",
1,
0,
false,
true,
false,
true,
2559,
305,
null
],
[
6.77,
"Run",
"running",
95,
true,
"run",
2,
0,
false,
true,
false,
true,
2539,
311,
null
],
[
6.96,
"Run",
"running",
95,
true,
"run",
1,
0,
false,
true,
false,
true,
2527,
403,
null
],
[
7.15,
"Run",
"running",
95,
true,
"run",
2,
0,
false,
true,
false,
true,
2575,
692,
null
],
[
7.35,
"Run",
"running",
95,
true,
"run",
2,
0,
false,
true,
false,
true,
2507,
449,
null
],
[
7.54,
"Run",
"running",
95,
true,
"run",
1,
0,
false,
true,
false,
true,
2544,
887,
null
],
[
7.75,
"Run",
"running",
146,
true,
"run",
1,
0,
false,
true,
false,
true,
2524,
498,
null
],
[
7.99,
"Run",
"running",
146,
true,
"run",
1,
0,
false,
true,
false,
true,
2530,
259,
null
],
[
8.18,
"Run",
"running",
146,
true,
"run",
2,
0,
false,
true,
false,
true,
2506,
262,
null
],
[
8.37,
"Run",
"running",
146,
true,
"run",
2,
0,
false,
true,
false,
true,
2534,
505,
null
],
[
8.57,
"Run",
"running",
146,
true,
"run",
2,
0,
false,
true,
false,
true,
2513,
221,
null
],
[
8.76,
"Run",
"running",
146,
true,
"run",
1,
0,
false,
true,
false,
true,
2511,
340,
null
],
[
8.97,
"Run",
"running",
146,
true,
"run",
2,
0,
false,
true,
false,
true,
2524,
184,
null
],
[
9.16,
"Run",
"running",
146,
true,
"run",
2,
0,
false,
true,
false,
true,
2534,
374,
null
],
[
9.35,
"Run",
"running",
146,
true,
"run",
2,
0,
false,
true,
false,
true,
2584,
617,
null
],
[
9.55,
"Run",
"running",
146,
true,
"run",
2,
0,
false,
true,
false,
true,
2529,
426,
null
],
[
9.74,
"Run",
"running",
148,
true,
"run",
1,
0,
false,
true,
false,
true,
2577,
327,
null
],
[
9.92,
"Idle",
"running",
148,
true,
"run",
2,
0,
false,
true,
false,
true,
2542,
782,
null
],
[
10.15,
"Idle",
"idle",
148,
true,
"run",
1,
0,
false,
true,
false,
true,
1835,
0,
null
],
[
10.38,
"Idle",
"idle",
148,
true,
"run",
1,
0,
false,
true,
false,
true,
1834,
0,
null
],
[
10.56,
"Idle",
"idle",
148,
true,
"run",
33,
0,
false,
true,
false,
false,
1833,
0,
null
],
[
10.75,
"Idle",
"idle",
57,
true,
"run",
33,
0,
false,
true,
false,
false,
1831,
0,
null
],
[
10.93,
"Idle",
"idle",
57,
true,
"run",
33,
0,
false,
true,
false,
false,
1832,
0,
null
],
[
11.15,
"Idle",
"idle",
57,
true,
"run",
33,
0,
false,
true,
false,
false,
1835,
0,
null
],
[
11.36,
"Idle",
"idle",
57,
true,
"run",
33,
0,
false,
true,
false,
false,
1835,
0,
null
],
[
11.54,
"Idle",
"idle",
57,
true,
"run",
33,
0,
false,
true,
false,
false,
1835,
0,
null
],
[
11.78,
"Idle",
"idle",
0,
true,
"run",
33,
0,
false,
true,
false,
false,
1829,
0,
null
],
[
11.96,
"Idle",
"idle",
0,
true,
"run",
33,
0,
false,
true,
false,
false,
1833,
0,
null
],
[
12.14,
"Idle",
"idle",
0,
true,
"run",
33,
0,
false,
true,
false,
false,
1833,
0,
null
],
[
12.45,
"Run",
"running",
0,
true,
"run",
1,
0,
false,
true,
false,
true,
1834,
0,
null
],
[
12.64,
"Run",
"running",
0,
true,
"run",
1,
0,
false,
true,
false,
true,
2568,
197,
null
],
[
12.83,
"Run",
"running",
18,
true,
"run",
2,
0,
false,
true,
false,
true,
2562,
298,
null
],
[
13.02,
"Run",
"running",
18,
true,
"run",
1,
0,
false,
true,
false,
true,
2586,
264,
null
],
[
13.21,
"Run",
"running",
18,
true,
"run",
3,
0,
false,
true,
false,
true,
2559,
129,
null
],
[
13.4,
"Run",
"running",
18,
true,
"run",
2,
0,
false,
true,
false,
true,
2521,
193,
null
],
[
13.59,
"Run",
"running",
18,
true,
"run",
1,
0,
false,
true,
false,
true,
2557,
607,
null
],
[
13.78,
"Run",
"running",
148,
true,
"run",
2,
0,
false,
true,
false,
true,
2546,
669,
null
],
[
13.98,
"Run",
"running",
148,
true,
"run",
2,
0,
false,
true,
false,
true,
2549,
306,
null
],
[
14.17,
"Run",
"running",
148,
true,
"run",
1,
0,
false,
true,
false,
true,
2599,
416,
null
],
[
14.36,
"Run",
"running",
148,
true,
"run",
2,
0,
false,
true,
false,
true,
2506,
497,
null
],
[
14.57,
"Run",
"running",
148,
true,
"run",
1,
0,
false,
true,
false,
true,
2487,
484,
null
],
[
14.76,
"Run",
"running",
149,
true,
"run",
1,
0,
false,
true,
false,
true,
2516,
549,
null
],
[
14.95,
"Run",
"running",
149,
true,
"run",
2,
0,
false,
true,
false,
true,
2515,
475,
null
],
[
15.14,
"Run",
"running",
149,
true,
"run",
2,
0,
false,
true,
false,
true,
2559,
350,
null
],
[
15.33,
"Run",
"running",
149,
true,
"run",
1,
0,
false,
true,
false,
true,
2540,
929,
null
],
[
15.59,
"Run",
"running",
149,
true,
"run",
2,
0,
false,
true,
false,
true,
2497,
669,
null
],
[
15.78,
"Run",
"running",
149,
true,
"run",
2,
0,
false,
true,
false,
true,
2538,
170,
null
],
[
15.97,
"Run",
"running",
149,
true,
"run",
2,
0,
false,
true,
false,
true,
2554,
119,
null
],
[
16.16,
"Run",
"running",
149,
true,
"run",
2,
0,
false,
true,
false,
true,
2509,
196,
null
],
[
16.35,
"Idle",
"running",
149,
true,
"run",
2,
0,
false,
true,
false,
true,
2558,
449,
null
],
[
16.53,
"Idle",
"running",
149,
true,
"run",
1,
0,
false,
true,
false,
true,
2517,
319,
null
],
[
16.71,
"Idle",
"idle",
132,
true,
"run",
1,
0,
false,
true,
false,
true,
1842,
0,
null
],
[
16.89,
"Idle",
"idle",
132,
true,
"run",
1,
0,
false,
true,
false,
true,
1841,
0,
null
],
[
17.07,
"Idle",
"idle",
132,
true,
"run",
33,
0,
false,
true,
false,
false,
1839,
0,
null
],
[
17.25,
"Idle",
"idle",
132,
true,
"run",
33,
0,
false,
true,
false,
false,
1839,
0,
null
],
[
17.42,
"Idle",
"idle",
132,
true,
"run",
33,
0,
false,
true,
false,
false,
1839,
0,
null
],
[
17.6,
"Idle",
"idle",
132,
true,
"run",
33,
0,
false,
true,
false,
false,
1838,
0,
null
],
[
17.79,
"Idle",
"idle",
0,
true,
"run",
33,
0,
false,
true,
false,
false,
1837,
0,
null
],
[
17.96,
"Idle",
"idle",
0,
true,
"run",
33,
0,
false,
true,
false,
false,
1836,
0,
null
],
[
18.14,
"Idle",
"idle",
0,
true,
"run",
33,
0,
false,
true,
false,
false,
1835,
0,
null
],
[
18.32,
"Idle",
"idle",
0,
true,
"run",
33,
0,
false,
true,
false,
false,
1834,
0,
null
],
[
18.5,
"Idle",
"idle",
0,
true,
"run",
33,
0,
false,
true,
false,
false,
1834,
0,
null
],
[
18.67,
"Idle",
"idle",
0,
true,
"run",
33,
0,
false,
true,
false,
false,
1837,
0,
null
],
[
18.85,
"Idle",
"idle",
0,
true,
"run",
33,
0,
false,
true,
false,
false,
1834,
0,
null
],
[
19.03,
"Idle",
"idle",
0,
true,
"run",
33,
0,
false,
true,
false,
false,
1835,
0,
null
],
[
19.21,
"Idle",
"idle",
0,
true,
"run",
33,
0,
false,
true,
false,
false,
1834,
0,
null
],
[
19.39,
"Idle",
"idle",
0,
true,
"run",
33,
0,
false,
true,
false,
false,
1833,
0,
null
],
[
19.55,
"Idle",
"idle",
0,
true,
"run",
33,
0,
false,
true,
false,
false,
1836,
0,
null
],
[
19.72,
"Run",
"running",
0,
true,
"run",
1,
0,
false,
true,
false,
true,
1837,
0,
null
],
[
19.97,
"Run",
"running",
0,
true,
"run",
1,
0,
false,
true,
false,
true,
1837,
0,
null
],
[
20.18,
"Idle",
"running",
0,
true,
"run",
1,
0,
false,
true,
false,
true,
1836,
0,
null
],
[
20.42,
"Idle",
"idle",
0,
true,
"run",
1,
0,
false,
true,
false,
true,
1837,
0,
null
],
[
20.66,
"Idle",
"idle",
0,
true,
"run",
33,
0,
false,
true,
false,
false,
1841,
0,
null
],
[
20.91,
"Idle",
"idle",
0,
true,
"run",
33,
0,
false,
true,
false,
false,
1836,
0,
null
],
[
21.15,
"Idle",
"idle",
0,
true,
"run",
33,
0,
false,
true,
false,
false,
1839,
0,
null
],
[
21.39,
"Idle",
"idle",
0,
true,
"run",
33,
0,
false,
true,
false,
false,
1840,
0,
null
],
[
21.63,
"Idle",
"idle",
0,
true,
"run",
33,
0,
false,
true,
false,
false,
1835,
0,
null
],
[
21.87,
"Idle",
"idle",
0,
true,
"run",
33,
0,
false,
true,
false,
false,
1841,
0,
null
],
[
22.13,
"Idle",
"idle",
0,
true,
"run",
33,
0,
false,
true,
false,
false,
1840,
0,
null
],
[
22.35,
"Idle",
"idle",
0,
true,
"run",
33,
0,
false,
true,
false,
false,
1838,
0,
null
],
[
22.6,
"Idle",
"idle",
0,
true,
"run",
33,
0,
false,
true,
false,
false,
1840,
0,
null
],
[
22.84,
"Idle",
"idle",
0,
true,
"run",
33,
0,
false,
true,
false,
false,
1839,
0,
null
],
[
23.11,
"Run",
"running",
0,
true,
"run",
1,
0,
false,
true,
false,
true,
1841,
0,
null
],
[
23.33,
"Run",
"running",
0,
true,
"run",
1,
0,
false,
true,
false,
true,
1842,
0,
null
],
[
23.58,
"Idle",
"running",
0,
true,
"run",
1,
0,
false,
true,
false,
true,
1839,
0,
null
],
[
23.82,
"Idle",
"idle",
0,
true,
"run",
1,
0,
false,
true,
false,
true,
1841,
0,
null
],
[
24.06,
"Idle",
"idle",
0,
true,
"run",
33,
0,
false,
true,
false,
false,
1839,
0,
null
],
[
24.33,
"Idle",
"idle",
0,
true,
"run",
33,
0,
false,
true,
false,
false,
1837,
0,
null
],
[
24.55,
"Idle",
"idle",
0,
true,
"run",
33,
0,
false,
true,
false,
false,
1835,
0,
null
],
[
24.76,
"Idle",
"idle",
0,
false,
"run",
45,
1,
true,
true,
false,
false,
1838,
0,
null
],
[
24.96,
"Idle",
"idle",
0,
false,
"run",
45,
1,
true,
true,
false,
false,
1840,
0,
null
],
[
25.16,
"Idle",
"idle",
0,
false,
"run",
45,
1,
true,
true,
false,
false,
1839,
0,
null
],
[
25.41,
"Idle",
"idle",
0,
false,
"run",
45,
1,
true,
true,
false,
false,
1838,
0,
null
],
[
25.62,
"Idle",
"idle",
0,
false,
"smoke",
45,
1,
true,
true,
false,
false,
1839,
0,
null
],
[
25.82,
"Idle",
"idle",
0,
false,
"smoke",
45,
1,
true,
true,
false,
false,
1839,
0,
null
],
[
26.02,
"Idle",
"idle",
0,
false,
"smoke",
45,
1,
true,
true,
false,
false,
1836,
0,
null
],
[
26.22,
"Idle",
"idle",
0,
false,
"smoke",
45,
1,
true,
true,
false,
false,
1836,
0,
null
],
[
26.42,
"Idle",
"idle",
0,
false,
"smoke",
45,
1,
true,
true,
false,
false,
1836,
0,
null
],
[
26.63,
"Idle",
"idle",
0,
false,
"smoke",
45,
1,
true,
true,
false,
false,
1836,
0,
null
],
[
26.83,
"Idle",
"idle",
0,
false,
"smoke",
45,
1,
true,
true,
false,
false,
1838,
0,
null
],
[
27.03,
"Idle",
"idle",
0,
false,
"smoke",
45,
1,
true,
true,
false,
false,
1835,
0,
null
],
[
27.23,
"Idle",
"idle",
0,
false,
"smoke",
45,
1,
true,
true,
false,
false,
1837,
0,
null
],
[
27.43,
"Idle",
"idle",
0,
false,
"smoke",
45,
1,
true,
true,
false,
false,
1837,
0,
null
],
[
27.64,
"Idle",
"idle",
0,
false,
"smoke",
45,
1,
true,
true,
false,
false,
1838,
0,
null
]
],
"trail_fields": [
"t",
"gstate",
"kstate",
"emission",
"armed",
"phase",
"il",
"button_latch",
"locked",
"lid",
"button",
"hv_enable",
"beam",
"hv",
"msgs"
]
},
"fingerprint": "c86cfd96ff02973a6053bcd78ac9247955cbcc14d89499f2089a5de91ae85460",
"image": "20261018222431 (dev)",
"log": [
"23:08:40 start laser.emission-witness (live, api) in campaign c-20261018224638-4ca0",
"23:08:40 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
"23:08:40 fixture: <REDACTED-1> at <IP-1> covers lid, interlock, button",
"23:08:40 queued by the attended queue opened 2026-10-18T23:07:24Z",
"23:08:41 baseline: pre: clean",
"23:08:41 mode: test needs grbl - already in grbl mode",
"23:08:41 connect: Idle",
"23:08:41 pre-fire: emission=0 hv=0 armed=False verdict=OK",
"23:08:41 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.",
"23:08:41 READY: waiting for the operator's press on the machine (the bench then does every press in this test)",
"23:09:10 READY: operator present (press after 28.4 s); the bench takes the presses",
"23:09:10 ARM: the fixture presses when the button lights (the bench's arm_press opt-in)",
"23:09:10 ARM press by the fixture, button lit after 0.3 s",
"23:09:11 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
"23:09:38 beam detector: idle 1677, peak 2609, digital asserted True",
"23:09:38 emission_samples peak=149 end=0; hv 0..929; lid_ir peak [53, 52, 55, 61]; armed seen True",
"23:09:38 dwell gap: button latch through the unlocked window max=0 over 88 samples (set at []); HV_ENABLE dipped=True, back with emission after it=True",
"23:09:38 exhaust at the first emission sample: 11653 rpm (floor 6416)",
"23:09:38 the rapid after the M5: 23 samples over 5.2 s from the dark point to the close, out at +0.63 s, back at +4.03 s; sampled 3.01 s past the close, 0 of 37 samples with emission, HV max 0, 37 of 37 carried the LASER_ON count, longest unread stretch 0.276 s; the window closed 1.2 s after the head was back",
"23:09:38 button dark after 0.0 s",
"23:09:38 PROMPT: Did the laser mark a 20 mm square outline on the scrap, all four sides?",
"23:09:40 ANSWER: Yes",
"23:09:40 PASS: emission peak 149 -> 0, HV 0..929, beam +932; the rapid after the M5 dark (HV max 0); disarmed 1.2 s after the head was back, button dark, mark confirmed",
"23:09:42 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
"23:09:51 baseline: cool: smoke/armed=False/hold=False ended on its own after 11 s; the engine's own post-job work, not a leftover",
"23:09:51 baseline: post: clean",
"23:09:51 result PASS"
],
"manifest_sha": "70ecd7867c2698d17f2f3c38db772868eda3364f541242c93fb5db4e1d593bcd",
"message": "",
"result": "PASS",
"test": "laser.emission-witness",
"ts": "2026-10-18T23:09:51Z"
},
"requires": [
"kernel.latch-locked-idle",
"kernel.k1-k2",
"motion.jog-roundtrip"
],
"satisfied": true,
"source_sha": "95a24204411309e65a827def1c57ac8e6867f5c3b1127227e962175711cf16b1",
"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"
],
[
"forgectrl",
"src/main.c"
]
],
"fingerprint": "fcad9a2ae69c87684673820533b2be59062de34e001c4da99f290e7342c954ad",
"hardware": "api",
"id": "laser.armed-kill",
"inherited": false,
"kind": "live",
"record": {
"answers": [],
"campaign": "c-20261018224638-4ca0",
"duration_s": 43,
"evidence": {
"actions": [
{
"by": "operator",
"channel": "button",
"state": "presence",
"took_s": 6.1,
"ts": "2026-10-18T23:13:04Z"
},
{
"by": "fixture",
"channel": "button",
"state": "arm",
"took_s": 0.26,
"ts": "2026-10-18T23:13:04Z"
},
{
"by": "fixture",
"channel": "button",
"state": "arm",
"took_s": 0.25,
"ts": "2026-10-18T23:13:22Z"
}
],
"baseline": {
"post": [],
"pre": []
},
"batch": {
"group": "attended",
"ts": "2026-10-18T23:07:24Z"
},
"beam_at_fire_kill": 2620,
"beam_at_fire_stop": 2654,
"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.51,
"post_status": 200,
"tail_zero": true,
"trail": [
[
0.54,
110,
"idle",
false
],
[
0.68,
110,
"idle",
false
],
[
0.87,
51,
"idle",
false
],
[
1.02,
51,
"idle",
false
],
[
1.16,
51,
"idle",
false
],
[
1.31,
51,
"idle",
false
],
[
1.45,
51,
"idle",
false
],
[
1.6,
51,
"idle",
false
],
[
1.74,
51,
"idle",
false
],
[
1.89,
0,
"idle",
false
],
[
2.03,
0,
"idle",
false
],
[
2.18,
0,
"idle",
false
],
[
2.32,
0,
"idle",
false
],
[
2.47,
0,
"idle",
false
],
[
2.61,
0,
"idle",
false
],
[
2.76,
0,
"idle",
false
],
[
2.91,
0,
"idle",
false
],
[
3.07,
0,
"idle",
false
],
[
3.21,
0,
"idle",
false
],
[
3.36,
0,
"idle",
false
],
[
3.5,
0,
"idle",
false
],
[
3.65,
0,
"idle",
false
],
[
3.79,
0,
"idle",
false
],
[
3.94,
0,
"idle",
false
],
[
4.11,
0,
"idle",
false
],
[
4.26,
0,
"idle",
false
],
[
4.4,
0,
"idle",
false
],
[
4.55,
0,
"idle",
false
],
[
4.69,
0,
"idle",
false
],
[
4.84,
0,
"idle",
false
],
[
4.98,
0,
"idle",
false
],
[
5.13,
0,
"idle",
false
],
[
5.28,
0,
"idle",
false
],
[
5.42,
0,
"idle",
false
],
[
5.57,
0,
"idle",
false
],
[
5.72,
0,
"idle",
false
],
[
5.86,
0,
"idle",
false
],
[
6.01,
0,
"idle",
false
],
[
6.15,
0,
"idle",
false
],
[
6.32,
0,
"idle",
false
],
[
6.47,
0,
"idle",
false
]
],
"zero_at_s": 1.89
},
"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": 6422,
"why": ""
},
"mode_after_start": {
"controller": "running",
"gated": false,
"local": false,
"mode": "grbl",
"motion": "verified",
"pid": 6371,
"why": ""
},
"operator": {
"ack_live": true,
"ts": "2026-10-18T23:12:57Z"
},
"sigkill": {
"fast": {
"kernel_stopped_at_s": 0.271,
"latch_locked_at_s": 0.032
},
"kernel_not_running": true,
"latch_locked": true,
"pid": 6371,
"tail_zero": true,
"trail": [
[
0.3,
96,
"idle",
false
],
[
0.45,
96,
"idle",
false
],
[
0.6,
96,
"idle",
false
],
[
0.75,
96,
"idle",
false
],
[
0.89,
96,
"idle",
false
],
[
1.04,
14,
"idle",
false
],
[
1.19,
14,
"idle",
false
],
[
1.34,
14,
"idle",
false
],
[
1.49,
14,
"idle",
false
],
[
1.63,
14,
"idle",
false
],
[
1.78,
14,
"idle",
false
],
[
1.93,
14,
"idle",
false
],
[
2.07,
0,
"idle",
false
],
[
2.22,
0,
"idle",
false
],
[
2.39,
0,
"idle",
false
],
[
2.54,
0,
"idle",
false
],
[
2.68,
0,
"idle",
false
],
[
2.83,
0,
"idle",
false
],
[
2.98,
0,
"idle",
false
],
[
3.12,
0,
"idle",
false
],
[
3.27,
0,
"idle",
false
],
[
3.45,
0,
"idle",
false
],
[
3.6,
0,
"idle",
false
],
[
3.74,
0,
"idle",
false
],
[
3.89,
0,
"idle",
false
],
[
4.04,
0,
"idle",
false
],
[
4.18,
0,
"idle",
false
],
[
4.33,
0,
"idle",
false
],
[
4.48,
0,
"idle",
false
],
[
4.62,
0,
"idle",
false
],
[
4.77,
0,
"idle",
false
],
[
4.92,
0,
"idle",
false
],
[
5.07,
0,
"idle",
false
],
[
5.21,
0,
"idle",
false
],
[
5.36,
0,
"idle",
false
],
[
5.5,
0,
"idle",
false
],
[
5.65,
0,
"idle",
false
],
[
5.8,
0,
"idle",
false
],
[
5.94,
0,
"idle",
false
],
[
6.11,
0,
"idle",
false
],
[
6.25,
0,
"idle",
false
]
],
"zero_at_s": 2.07
}
},
"fingerprint": "fcad9a2ae69c87684673820533b2be59062de34e001c4da99f290e7342c954ad",
"image": "20261018222431 (dev)",
"log": [
"23:12:57 start laser.armed-kill (live, api) in campaign c-20261018224638-4ca0",
"23:12:57 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
"23:12:57 fixture: <REDACTED-1> at <IP-1> covers lid, interlock, button",
"23:12:57 queued by the attended queue opened 2026-10-18T23:07:24Z",
"23:12:57 baseline: pre: clean",
"23:12:57 mode: test needs grbl - already in grbl mode",
"23:12:58 connect: Idle",
"23:12:58 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.",
"23:12:58 READY: waiting for the operator's press on the machine (the bench then does every press in this test)",
"23:13:04 READY: operator present (press after 6.1 s); the bench takes the presses",
"23:13:04 ARM: the fixture presses when the button lights (the bench's arm_press opt-in)",
"23:13:04 ARM press by the fixture, button lit after 0.3 s",
"23:13:09 emission live (110) - stopping the controller NOW",
"23:13:09 POST /controller/stop -> 200 {'stopped': True} (0.51 s)",
"23:13:15 post-stop (0.54, 110, 'idle', False)",
"23:13:15 post-stop (0.68, 110, 'idle', False)",
"23:13:15 post-stop (0.87, 51, 'idle', False)",
"23:13:15 post-stop (1.02, 51, 'idle', False)",
"23:13:15 post-stop (1.16, 51, 'idle', False)",
"23:13:15 post-stop (1.31, 51, 'idle', False)",
"23:13:15 post-stop (1.45, 51, 'idle', False)",
"23:13:15 post-stop (1.6, 51, 'idle', False)",
"23:13:15 post-stop (1.74, 51, 'idle', False)",
"23:13:15 post-stop (1.89, 0, 'idle', False)",
"23:13:15 post-stop (2.03, 0, 'idle', False)",
"23:13:15 post-stop (2.18, 0, 'idle', False)",
"23:13:15 post-stop (2.32, 0, 'idle', False)",
"23:13:15 post-stop (2.47, 0, 'idle', False)",
"23:13:15 post-stop (2.61, 0, 'idle', False)",
"23:13:15 post-stop (2.76, 0, 'idle', False)",
"23:13:15 post-stop (2.91, 0, 'idle', False)",
"23:13:15 post-stop (3.07, 0, 'idle', False)",
"23:13:15 post-stop (3.21, 0, 'idle', False)",
"23:13:15 post-stop (3.36, 0, 'idle', False)",
"23:13:15 post-stop (3.5, 0, 'idle', False)",
"23:13:15 post-stop (3.65, 0, 'idle', False)",
"23:13:15 post-stop (3.79, 0, 'idle', False)",
"23:13:15 post-stop (3.94, 0, 'idle', False)",
"23:13:15 post-stop (4.11, 0, 'idle', False)",
"23:13:15 post-stop (4.26, 0, 'idle', False)",
"23:13:15 post-stop (4.4, 0, 'idle', False)",
"23:13:15 post-stop (4.55, 0, 'idle', False)",
"23:13:15 post-stop (4.69, 0, 'idle', False)",
"23:13:15 post-stop (4.84, 0, 'idle', False)",
"23:13:15 post-stop (4.98, 0, 'idle', False)",
"23:13:15 post-stop (5.13, 0, 'idle', False)",
"23:13:15 post-stop (5.28, 0, 'idle', False)",
"23:13:15 post-stop (5.42, 0, 'idle', False)",
"23:13:15 post-stop (5.57, 0, 'idle', False)",
"23:13:15 post-stop (5.72, 0, 'idle', False)",
"23:13:15 post-stop (5.86, 0, 'idle', False)",
"23:13:15 post-stop (6.01, 0, 'idle', False)",
"23:13:15 post-stop (6.15, 0, 'idle', False)",
"23:13:15 post-stop (6.32, 0, 'idle', False)",
"23:13:15 post-stop (6.47, 0, 'idle', False)",
"23:13:15 emission first 0 at +1.89 s; last 2 s all zero: True; kernel not running: True",
"23:13:15 the controller is stopped (supervision held); restarting it (no motion, no laser)",
"23:13:15 POST /controller/start -> 200 {'started': True}",
"23:13:21 /mode after start: {'mode': 'grbl', 'controller': 'running', 'pid': 6371, 'motion': 'verified', 'gated': False, 'local': False, 'why': ''}",
"23:13:21 expected stop PASS: returned in 0.51 s, emission 0 at +1.89 s, controller restarted",
"23:13:22 connect: Idle",
"23:13:22 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.",
"23:13:22 READY: presence already proved this test; the bench has the presses",
"23:13:22 ARM: the fixture presses when the button lights (the bench's arm_press opt-in)",
"23:13:22 ARM press by the fixture, button lit after 0.3 s",
"23:13:23 emission live (96) - SIGKILL controller pid 6371 NOW",
"23:13:28 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
"23:13:30 after the kill (sysfs): {'latch_locked_at_s': 0.032, 'kernel_stopped_at_s': 0.271}",
"23:13:30 post-kill (0.3, 96, 'idle', False)",
"23:13:30 post-kill (0.45, 96, 'idle', False)",
"23:13:30 post-kill (0.6, 96, 'idle', False)",
"23:13:30 post-kill (0.75, 96, 'idle', False)",
"23:13:30 post-kill (0.89, 96, 'idle', False)",
"23:13:30 post-kill (1.04, 14, 'idle', False)",
"23:13:30 post-kill (1.19, 14, 'idle', False)",
"23:13:30 post-kill (1.34, 14, 'idle', False)",
"23:13:30 post-kill (1.49, 14, 'idle', False)",
"23:13:30 post-kill (1.63, 14, 'idle', False)",
"23:13:30 post-kill (1.78, 14, 'idle', False)",
"23:13:30 post-kill (1.93, 14, 'idle', False)",
"23:13:30 post-kill (2.07, 0, 'idle', False)",
"23:13:30 post-kill (2.22, 0, 'idle', False)",
"23:13:30 post-kill (2.39, 0, 'idle', False)",
"23:13:30 post-kill (2.54, 0, 'idle', False)",
"23:13:30 post-kill (2.68, 0, 'idle', False)",
"23:13:30 post-kill (2.83, 0, 'idle', False)",
"23:13:30 post-kill (2.98, 0, 'idle', False)",
"23:13:30 post-kill (3.12, 0, 'idle', False)",
"23:13:30 post-kill (3.27, 0, 'idle', False)",
"23:13:30 post-kill (3.45, 0, 'idle', False)",
"23:13:30 post-kill (3.6, 0, 'idle', False)",
"23:13:30 post-kill (3.74, 0, 'idle', False)",
"23:13:30 post-kill (3.89, 0, 'idle', False)",
"23:13:30 post-kill (4.04, 0, 'idle', False)",
"23:13:30 post-kill (4.18, 0, 'idle', False)",
"23:13:30 post-kill (4.33, 0, 'idle', False)",
"23:13:30 post-kill (4.48, 0, 'idle', False)",
"23:13:30 post-kill (4.62, 0, 'idle', False)",
"23:13:30 post-kill (4.77, 0, 'idle', False)",
"23:13:30 post-kill (4.92, 0, 'idle', False)",
"23:13:30 post-kill (5.07, 0, 'idle', False)",
"23:13:30 post-kill (5.21, 0, 'idle', False)",
"23:13:30 post-kill (5.36, 0, 'idle', False)",
"23:13:30 post-kill (5.5, 0, 'idle', False)",
"23:13:30 post-kill (5.65, 0, 'idle', False)",
"23:13:30 post-kill (5.8, 0, 'idle', False)",
"23:13:30 post-kill (5.94, 0, 'idle', False)",
"23:13:30 post-kill (6.11, 0, 'idle', False)",
"23:13:30 post-kill (6.25, 0, 'idle', False)",
"23:13:30 emission first 0 at +2.07 s; last 2 s all zero: True; kernel not running: True",
"23:13:30 latch locked after the kill: True",
"23:13:30 /mode after the kill: {'mode': 'grbl', 'controller': 'running', 'pid': 6422, 'motion': 'verified', 'gated': False, 'local': False, 'why': ''}",
"23:13:32 button dark after 0.0 s",
"23:13:32 PASS: expected stop 0 at +1.89 s and SIGKILL 0 at +2.07 s, latch locked, controller respawned with the latch still locked, button dark",
"23:13:40 baseline: cool: smoke/armed=False/hold=False ended on its own after 8 s; the engine's own post-job work, not a leftover",
"23:13:40 baseline: post: clean",
"23:13:40 result PASS"
],
"manifest_sha": "70ecd7867c2698d17f2f3c38db772868eda3364f541242c93fb5db4e1d593bcd",
"message": "",
"result": "PASS",
"test": "laser.armed-kill",
"ts": "2026-10-18T23:13:40Z"
},
"requires": [
"laser.emission-witness",
"motion.deadman"
],
"satisfied": true,
"source_sha": "7f9f194cd8239e7213968330b3d775f6d4b17a4c3c1124d5296adcca034b219c",
"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"
],
[
"grblhal-glowforge",
"src/glowforge_switches.c"
],
[
"grblhal-glowforge",
"src/glowforge_switch_map.h"
]
],
"fingerprint": "f3a0ad773b639fcdfda61ca43f15749c5f93d27f1b40978b84ff82c10f13d29c",
"hardware": "api",
"id": "laser.pause-resume-lid-cancel",
"inherited": false,
"kind": "live",
"record": {
"answers": [],
"campaign": "c-20261018224638-4ca0",
"duration_s": 36,
"evidence": {
"actions": [
{
"by": "operator",
"channel": "button",
"state": "presence",
"took_s": 6.35,
"ts": "2026-10-18T23:13:48Z"
},
{
"by": "fixture",
"channel": "button",
"state": "arm",
"took_s": 0.25,
"ts": "2026-10-18T23:13:48Z"
},
{
"by": "fixture",
"channel": "button",
"state": "press",
"took_s": 0.11,
"ts": "2026-10-18T23:13:55Z"
},
{
"by": "fixture",
"channel": "button",
"state": "press",
"took_s": 0.12,
"ts": "2026-10-18T23:13:59Z"
},
{
"by": "fixture",
"channel": "lid",
"state": "open",
"took_s": 0.02,
"ts": "2026-10-18T23:14:00Z"
},
{
"by": "fixture",
"channel": "lid",
"state": "close",
"took_s": 0.28,
"ts": "2026-10-18T23:14:08Z"
}
],
"armed_after": false,
"armed_while_paused": true,
"baseline": {
"post": [],
"pre": []
},
"batch": {
"group": "attended",
"ts": "2026-10-18T23:07:24Z"
},
"beam": {
"delta": 742,
"digital_seen": true,
"idle": 1859,
"peak": 2601,
"samples": 4
},
"button_dark": false,
"button_latch": 1,
"drift_mm": 0.028,
"emission_back_after_s": 0.42,
"emission_running": 96,
"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.89,
"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-10-18T23:13:41Z"
},
"pause_message": true,
"paused_trail": [
[
0.03,
96,
true
],
[
0.25,
96,
true
],
[
0.48,
96,
true
],
[
0.71,
81,
true
],
[
0.99,
81,
true
],
[
1.21,
81,
true
],
[
1.44,
81,
true
],
[
1.67,
0,
true
],
[
1.89,
0,
true
],
[
2.12,
0,
true
],
[
2.34,
0,
true
],
[
2.57,
0,
true
],
[
2.8,
0,
true
],
[
3.02,
0,
true
],
[
3.25,
0,
true
],
[
3.47,
0,
true
],
[
3.7,
0,
true
],
[
3.93,
0,
true
]
],
"resume_message": true,
"resume_trail": [
[
0.04,
0
],
[
0.23,
0
],
[
0.42,
23
]
],
"resumed_state": "Run",
"returned_message": true,
"start": [
0.0,
0.0,
4.449
]
},
"fingerprint": "f3a0ad773b639fcdfda61ca43f15749c5f93d27f1b40978b84ff82c10f13d29c",
"image": "20261018222431 (dev)",
"log": [
"23:13:41 start laser.pause-resume-lid-cancel (live, api) in campaign c-20261018224638-4ca0",
"23:13:41 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
"23:13:41 fixture: <REDACTED-1> at <IP-1> covers lid, interlock, button",
"23:13:41 queued by the attended queue opened 2026-10-18T23:07:24Z",
"23:13:41 baseline: pre: clean",
"23:13:41 mode: test needs grbl - already in grbl mode",
"23:13:42 unlock: ['[MSG:Caution: Unlocked]', 'ok']",
"23:13:42 connect: Idle",
"23:13: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.",
"23:13:42 READY: waiting for the operator's press on the machine (the bench then does every press in this test)",
"23:13:48 READY: operator present (press after 6.3 s); the bench takes the presses",
"23:13:48 ARM: the fixture presses when the button lights (the bench's arm_press opt-in)",
"23:13:49 ARM press by the fixture, button lit after 0.3 s",
"23:13:55 emission live (96) - asking the operator to pause",
"23:13:55 ACT button press (fixture)",
"23:13:55 ACT button press: done after 0.1 s",
"23:13:59 paused (0.03, 96, True)",
"23:13:59 paused (0.25, 96, True)",
"23:13:59 paused (0.48, 96, True)",
"23:13:59 paused (0.71, 81, True)",
"23:13:59 paused (0.99, 81, True)",
"23:13:59 paused (1.21, 81, True)",
"23:13:59 paused (1.44, 81, True)",
"23:13:59 paused (1.67, 0, True)",
"23:13:59 paused (1.89, 0, True)",
"23:13:59 paused (2.12, 0, True)",
"23:13:59 paused (2.34, 0, True)",
"23:13:59 paused (2.57, 0, True)",
"23:13:59 paused (2.8, 0, True)",
"23:13:59 paused (3.02, 0, True)",
"23:13:59 paused (3.25, 0, True)",
"23:13:59 paused (3.47, 0, True)",
"23:13:59 paused (3.7, 0, True)",
"23:13:59 paused (3.93, 0, True)",
"23:13:59 paused: Hold:0, emission 0 = True, armed = True, latch locked = False",
"23:13:59 ACT button press (fixture)",
"23:13:59 ACT button press: done after 0.1 s",
"23:14:00 emission after the resume: [(0.04, 0), (0.23, 0), (0.42, 23)]",
"23:14:00 ACT lid open (fixture)",
"23:14:00 ACT lid open: done after 0.0 s",
"23:14:08 post-lid (0.04, 23, 'running', True)",
"23:14:08 post-lid (0.26, 23, 'running', False)",
"23:14:08 post-lid (0.51, 23, 'running', False)",
"23:14:08 post-lid (0.71, 23, 'running', False)",
"23:14:08 post-lid (0.9, 34, 'idle', False)",
"23:14:08 post-lid (1.1, 34, 'idle', False)",
"23:14:08 post-lid (1.29, 34, 'idle', False)",
"23:14:08 post-lid (1.49, 34, 'idle', False)",
"23:14:08 post-lid (1.69, 34, 'idle', False)",
"23:14:08 post-lid (1.89, 0, 'idle', False)",
"23:14:08 post-lid (2.08, 0, 'idle', False)",
"23:14:08 post-lid (2.28, 0, 'idle', False)",
"23:14:08 post-lid (2.48, 0, 'idle', False)",
"23:14:08 post-lid (2.67, 0, 'idle', False)",
"23:14:08 post-lid (2.87, 0, 'idle', False)",
"23:14:08 post-lid (3.07, 0, 'idle', False)",
"23:14:08 post-lid (3.26, 0, 'idle', False)",
"23:14:08 post-lid (3.46, 0, 'idle', False)",
"23:14:08 post-lid (3.65, 0, 'idle', False)",
"23:14:08 post-lid (3.85, 0, 'idle', False)",
"23:14:08 post-lid (4.05, 0, 'idle', False)",
"23:14:08 post-lid (4.25, 0, 'idle', False)",
"23:14:08 post-lid (4.44, 0, 'idle', False)",
"23:14:08 post-lid (4.64, 0, 'idle', False)",
"23:14:08 post-lid (4.84, 0, 'idle', False)",
"23:14:08 post-lid (5.03, 0, 'idle', False)",
"23:14:08 post-lid (5.23, 0, 'idle', False)",
"23:14:08 post-lid (5.43, 0, 'idle', False)",
"23:14:08 post-lid (5.62, 0, 'idle', False)",
"23:14:08 post-lid (5.86, 0, 'idle', False)",
"23:14:08 post-lid (6.06, 0, 'idle', False)",
"23:14:08 post-lid (6.25, 0, 'idle', False)",
"23:14:08 post-lid (6.45, 0, 'idle', False)",
"23:14:08 post-lid (6.64, 0, 'idle', False)",
"23:14:08 post-lid (6.84, 0, 'idle', False)",
"23:14:08 post-lid (7.04, 0, 'idle', False)",
"23:14:08 post-lid (7.23, 0, 'idle', False)",
"23:14:08 post-lid (7.43, 0, 'idle', False)",
"23:14:08 post-lid (7.63, 0, 'idle', False)",
"23:14:08 post-lid (7.82, 0, 'idle', False)",
"23:14:08 post-lid (8.07, 0, 'idle', False)",
"23:14:08 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]']",
"23:14:08 returned: drift 0.028 mm; armed=False latch_locked=True button_latch=1",
"23:14:08 kernel counters: start (0.00, 0.00) -> now (0.03, 0.00), drift 0.030 mm",
"23:14:08 beam detector: idle 1859, peak 2601, digital asserted True",
"23:14:08 button dark after 0.0 s",
"23:14:08 ACT lid close (fixture)",
"23:14:08 ACT lid close: done after 0.3 s",
"23:14:09 PASS: button paused the burn (emission 0, armed kept, latch unlocked) and resumed it; the lid then canceled it - emission 0 at +1.89 s, reset without alarm, returned (drift 0.028 mm), button latch SET",
"23:14:12 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
"23:14:16 baseline: cool: smoke/armed=False/hold=False ended on its own after 7 s; the engine's own post-job work, not a leftover",
"23:14:18 baseline: head jogged back -0.028/-0.000 mm to its start",
"23:14:18 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",
"23:14:18 baseline: post: clean",
"23:14:18 result PASS"
],
"manifest_sha": "70ecd7867c2698d17f2f3c38db772868eda3364f541242c93fb5db4e1d593bcd",
"message": "",
"result": "PASS",
"test": "laser.pause-resume-lid-cancel",
"ts": "2026-10-18T23:14:18Z"
},
"requires": [
"laser.emission-witness"
],
"satisfied": true,
"source_sha": "e89cf3007e54fd62e75c796ea9cd7f4cbe9851d966c58e45bc71068043ba4362",
"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": "60ac33ab644bcf1cf18d1f22d1aa2da8d9dd506767f2821a7c5c6813acdace69",
"hardware": "api",
"id": "camera.snapshot",
"inherited": false,
"kind": "auto",
"record": {
"answers": [],
"campaign": "c-20261018224638-4ca0",
"duration_s": 16,
"evidence": {
"background_after_watching": [
200,
95535
],
"background_bad_value": [
400,
"background must be '0' or '1'"
],
"background_while_watched": [
409,
"somebody is watching a camera: a background capture waits until they stop"
],
"baseline": {
"post": [],
"pre": []
},
"batch": {
"group": "unattended",
"ts": "2026-10-18T22:46:38Z"
},
"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,
"withheld": 0
},
"hw_fps_skip": false,
"running": false,
"sensor": "OV5648",
"snapshot": {
"height": 1944,
"width": 2592
},
"stopped_by_lid": false,
"stream": {
"height": 972,
"width": 1296
},
"timing": {
"convert_ms": 0.0,
"copy_ms": 0.0,
"encode_ms": 0.0,
"latency_ms": 0.0,
"skipped": 0
}
},
"cam_status_after": {
"buffers": "uncached",
"cam": "lid",
"capture_allowed": true,
"clients": 0,
"convert": "gpu",
"encoder": "vpu",
"fps": 0.3,
"fps_cap": 0.0,
"frames": 4,
"h264": {
"active": false,
"clients": 0
},
"health": {
"captured": 80,
"corrupt": 0,
"restarts": 0,
"withheld": 0
},
"hw_fps_skip": false,
"running": true,
"sensor": "OV5648",
"snapshot": {
"height": 1944,
"width": 2592
},
"stopped_by_lid": false,
"stream": {
"height": 972,
"width": 1296
},
"timing": {
"convert_ms": 0.0,
"copy_ms": 0.0,
"encode_ms": 0.0,
"latency_ms": 0.0,
"skipped": 9
}
},
"clients_while_watching": 1,
"fixture": {
"channels": [
"lid",
"interlock",
"button"
],
"hostname": "<REDACTED-1>",
"ip": "<IP-1>",
"released": []
},
"lid_lamp": "132",
"operator_while_watched": [
200,
95552
],
"snapshot_bytes": 94890,
"snapshot_dark_bytes": 49877,
"snapshot_full_bytes": 301044,
"stream_ctype": "multipart/x-mixed-replace; boundary=forgectrl-frame"
},
"fingerprint": "60ac33ab644bcf1cf18d1f22d1aa2da8d9dd506767f2821a7c5c6813acdace69",
"image": "20261018222431 (dev)",
"log": [
"22:57:30 start camera.snapshot (auto, api) in campaign c-20261018224638-4ca0",
"22:57:30 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
"22:57:30 fixture: <REDACTED-1> at <IP-1> covers lid, interlock, button",
"22:57:30 queued by the unattended queue opened 2026-10-18T22:46:38Z",
"22:57:30 baseline: pre: clean",
"22:57:30 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, 'withheld': 0}, 'timing': {'latency_ms': 0.0, 'convert_ms': 0.0, 'copy_ms': 0.0, 'encode_ms': 0.0, 'skipped': 0}, 'capture_allowed': True, 'stopped_by_lid': False}",
"22:57:31 GET /cam/snapshot?cam=lid&res=half -> 200 (94890 bytes)",
"22:57:33 lamp 132 -> 94890 bytes; lamp off -> 49877 bytes",
"22:57:34 GET /cam/snapshot?cam=lid&res=full -> 200 (301044 bytes)",
"22:57:35 stream: multipart/x-mixed-replace; boundary=forgectrl-frame, first 65536 bytes",
"22:57:35 background capture while a viewer watches -> 409 somebody is watching a camera: a background capture waits until they stop",
"22:57:38 cam status after: {'running': True, 'cam': 'lid', 'clients': 0, 'frames': 4, 'fps': 0.3, 'fps_cap': 0.0, 'hw_fps_skip': False, 'encoder': 'vpu', 'convert': 'gpu', 'buffers': 'uncached', 'sensor': 'OV5648', 'stream': {'width': 1296, 'height': 972}, 'snapshot': {'width': 2592, 'height': 1944}, 'h264': {'active': False, 'clients': 0}, 'health': {'captured': 80, 'corrupt': 0, 'restarts': 0, 'withheld': 0}, 'timing': {'latency_ms': 0.0, 'convert_ms': 0.0, 'copy_ms': 0.0, 'encode_ms': 0.0, 'skipped': 9}, 'capture_allowed': True, 'stopped_by_lid': False}",
"22:57:38 PASS: half-res snapshot 94890 bytes, 49877 with the lamp off; full-res 301044; stream multipart/x-mixed-replace; boundary=forgectrl-frame",
"22:57:47 baseline: post: clean",
"22:57:47 result PASS"
],
"manifest_sha": "70ecd7867c2698d17f2f3c38db772868eda3364f541242c93fb5db4e1d593bcd",
"message": "",
"result": "PASS",
"test": "camera.snapshot",
"ts": "2026-10-18T22:57:47Z"
},
"requires": [],
"satisfied": true,
"source_sha": "ef51a9cb61a787f0e760006fa271b499176eb8f01cd4a04acb55be9f207329e0",
"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": "0dda2319a9934bc240145d421c4d4a51326b7461eaf30103c0e33984a1abfbe8",
"hardware": "api",
"id": "camera.sensor-profile",
"inherited": false,
"kind": "auto",
"record": {
"answers": [],
"campaign": "c-20261018224638-4ca0",
"duration_s": 13,
"evidence": {
"baseline": {
"post": [],
"pre": []
},
"batch": {
"group": "unattended",
"ts": "2026-10-18T22:46:38Z"
},
"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": "0dda2319a9934bc240145d421c4d4a51326b7461eaf30103c0e33984a1abfbe8",
"image": "20261018222431 (dev)",
"log": [
"22:57:47 start camera.sensor-profile (auto, api) in campaign c-20261018224638-4ca0",
"22:57:47 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
"22:57:47 fixture: <REDACTED-1> at <IP-1> covers lid, interlock, button",
"22:57:47 queued by the unattended queue opened 2026-10-18T22:46:38Z",
"22:57:47 baseline: pre: clean",
"22:57:47 sensor: OV5648",
"22:57:47 advertised: snapshot 2592x1944, stream 1296x972",
"22:57:49 full snapshot: (2592, 1944) (300170 bytes)",
"22:57:49 half snapshot: (1296, 972) (95757 bytes)",
"22:58:00 baseline: post: clean",
"22:58:00 result PASS"
],
"manifest_sha": "70ecd7867c2698d17f2f3c38db772868eda3364f541242c93fb5db4e1d593bcd",
"message": "",
"result": "PASS",
"test": "camera.sensor-profile",
"ts": "2026-10-18T22:58:00Z"
},
"requires": [],
"satisfied": true,
"source_sha": "5d572142d1c3073188493518b55a39a5c6e9c1a110d5bb36d595eef5f4a75e50",
"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": "c34d83443a3cd0338042fb0cc32dc75c5c8a85e31381227780747c82eb1cc545",
"hardware": "api",
"id": "camera.h264-stream",
"inherited": false,
"kind": "auto",
"record": {
"answers": [],
"campaign": "c-20261018224638-4ca0",
"duration_s": 12,
"evidence": {
"baseline": {
"post": [],
"pre": []
},
"batch": {
"group": "unattended",
"ts": "2026-10-18T22:46:38Z"
},
"bytes": 65536,
"cam_status": {
"buffers": "uncached",
"cam": "lid",
"capture_allowed": true,
"clients": 0,
"convert": "gpu",
"encoder": "vpu",
"fps": 0.0,
"fps_cap": 0.0,
"frames": 0,
"h264": {
"active": true,
"clients": 1
},
"health": {
"captured": 373,
"corrupt": 0,
"restarts": 0,
"withheld": 0
},
"hw_fps_skip": false,
"running": true,
"sensor": "OV5648",
"snapshot": {
"height": 1944,
"width": 2592
},
"stopped_by_lid": false,
"stream": {
"height": 972,
"width": 1296
},
"timing": {
"convert_ms": 0.0,
"copy_ms": 0.0,
"encode_ms": 0.0,
"latency_ms": 0.0,
"skipped": 13
}
},
"codec": "avc1.424020",
"content_type": "video/mp4",
"fixture": {
"channels": [
"lid",
"interlock",
"button"
],
"hostname": "<REDACTED-1>",
"ip": "<IP-1>",
"released": []
}
},
"fingerprint": "c34d83443a3cd0338042fb0cc32dc75c5c8a85e31381227780747c82eb1cc545",
"image": "20261018222431 (dev)",
"log": [
"22:58:01 start camera.h264-stream (auto, api) in campaign c-20261018224638-4ca0",
"22:58:01 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
"22:58:01 fixture: <REDACTED-1> at <IP-1> covers lid, interlock, button",
"22:58:01 queued by the unattended queue opened 2026-10-18T22:46:38Z",
"22:58:01 baseline: pre: clean",
"22:58:02 codec avc1.424020, content-type video/mp4",
"22:58:02 convert=gpu h264={'active': True, 'clients': 1}",
"22:58:14 baseline: post: clean",
"22:58:14 result PASS"
],
"manifest_sha": "70ecd7867c2698d17f2f3c38db772868eda3364f541242c93fb5db4e1d593bcd",
"message": "",
"result": "PASS",
"test": "camera.h264-stream",
"ts": "2026-10-18T22:58:14Z"
},
"requires": [],
"satisfied": true,
"source_sha": "09ea64f2553a27090e38aae787094d84582453707aa93562ca2a4a22e8f7ed83",
"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": "4ed3732a26795634f5c464a3e841f818d8d841b9eba40963a66dc4f2d37666b9",
"hardware": "api",
"id": "camera.frame-health",
"inherited": false,
"kind": "auto",
"record": {
"answers": [],
"campaign": "c-20261018224638-4ca0",
"duration_s": 18,
"evidence": {
"baseline": {
"post": [],
"pre": []
},
"batch": {
"group": "unattended",
"ts": "2026-10-18T22:46:38Z"
},
"captured": 14,
"corrupt": 0,
"fixture": {
"channels": [
"lid",
"interlock",
"button"
],
"hostname": "<REDACTED-1>",
"ip": "<IP-1>",
"released": []
},
"health_after": {
"captured": 540,
"corrupt": 0,
"restarts": 0,
"withheld": 0
},
"health_before": {
"captured": 526,
"corrupt": 0,
"restarts": 0,
"withheld": 0
},
"restarts": 0,
"stream_bytes": 12648448,
"stream_captured": 75,
"stream_health": [
{
"captured": 540,
"corrupt": 0,
"restarts": 0,
"withheld": 0
},
{
"captured": 615,
"corrupt": 0,
"restarts": 0,
"withheld": 0
}
],
"stream_timing": {
"convert_ms": 16.1,
"copy_ms": 11.8,
"encode_ms": 7.1,
"latency_ms": 67.4,
"skipped": 18
},
"stream_withheld": 0
},
"fingerprint": "4ed3732a26795634f5c464a3e841f818d8d841b9eba40963a66dc4f2d37666b9",
"image": "20261018222431 (dev)",
"log": [
"22:58:14 start camera.frame-health (auto, api) in campaign c-20261018224638-4ca0",
"22:58:14 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
"22:58:14 fixture: <REDACTED-1> at <IP-1> covers lid, interlock, button",
"22:58:14 queued by the unattended queue opened 2026-10-18T22:46:38Z",
"22:58:14 baseline: pre: clean",
"22:58:14 before: {'captured': 526, 'corrupt': 0, 'restarts': 0, 'withheld': 0}",
"22:58:16 after: {'captured': 540, 'corrupt': 0, 'restarts': 0, 'withheld': 0}",
"22:58:16 captured 14 frames, 0 corrupt, 0 stream restarts",
"22:58:21 stream: 12648448 bytes in 5 s, timing {'latency_ms': 67.4, 'convert_ms': 16.1, 'copy_ms': 11.8, 'encode_ms': 7.1, 'skipped': 18}",
"22:58:32 baseline: post: clean",
"22:58:32 result PASS"
],
"manifest_sha": "70ecd7867c2698d17f2f3c38db772868eda3364f541242c93fb5db4e1d593bcd",
"message": "",
"result": "PASS",
"test": "camera.frame-health",
"ts": "2026-10-18T22:58:32Z"
},
"requires": [],
"satisfied": true,
"source_sha": "d14d6464e7214d9a395560b32712fe0ea82eddf5b06c214fa51a0bc9d85bb635",
"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"
],
[
"forgectrl",
"src/auth.*"
]
],
"fingerprint": "4bafe8e6630c701753586f94decaa0da43b35d5cc7809d0a6cb4d83afee19970",
"hardware": "api",
"id": "camera.lid-privacy",
"inherited": false,
"kind": "operator",
"record": {
"answers": [],
"campaign": "c-20261018224638-4ca0",
"duration_s": 15,
"evidence": {
"actions": [
{
"by": "fixture",
"channel": "lid",
"state": "close",
"took_s": 0.02,
"ts": "2026-10-18T22:58:33Z"
},
{
"by": "fixture",
"channel": "lid",
"state": "open",
"took_s": 0.03,
"ts": "2026-10-18T22:58:34Z"
},
{
"by": "fixture",
"channel": "lid",
"state": "close",
"took_s": 0.28,
"ts": "2026-10-18T22:58:36Z"
}
],
"baseline": {
"post": [],
"pre": []
},
"batch": {
"group": "unattended",
"ts": "2026-10-18T22:46:38Z"
},
"closed_snapshot_bytes": 95677,
"fixture": {
"channels": [
"lid",
"interlock",
"button"
],
"hostname": "<REDACTED-1>",
"ip": "<IP-1>",
"released": []
},
"head_cloud_form_lid_open": [
409,
"lid is open: this capture needs the lid closed"
],
"snapshot_lid_open": [
409,
"lid is open: this capture needs the lid closed"
],
"status_lid_open": {
"buffers": "uncached",
"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": 778,
"corrupt": 0,
"restarts": 0,
"withheld": 0
},
"hw_fps_skip": false,
"running": false,
"sensor": "OV5648",
"snapshot": {
"height": 1944,
"width": 2592
},
"stopped_by_lid": true,
"stream": {
"height": 972,
"width": 1296
},
"timing": {
"convert_ms": 0.0,
"copy_ms": 0.0,
"encode_ms": 0.0,
"latency_ms": 0.0,
"skipped": 20
}
},
"stream_bytes_after_lid_open": 356877
},
"fingerprint": "4bafe8e6630c701753586f94decaa0da43b35d5cc7809d0a6cb4d83afee19970",
"image": "20261018222431 (dev)",
"log": [
"22:58:32 start camera.lid-privacy (operator, api) in campaign c-20261018224638-4ca0",
"22:58:33 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
"22:58:33 fixture: <REDACTED-1> at <IP-1> covers lid, interlock, button",
"22:58:33 fixture: running unattended (no prompt can be answered)",
"22:58:33 queued by the unattended queue opened 2026-10-18T22:46:38Z",
"22:58:33 baseline: pre: clean",
"22:58:33 ACT lid close (fixture)",
"22:58:33 ACT lid close: done after 0.0 s",
"22:58:34 lid closed: snapshot 95677 bytes",
"22:58:34 ACT lid open (fixture)",
"22:58:34 ACT lid open: done after 0.0 s",
"22:58:34 stream ended after 356877 further buffered bytes",
"22:58:34 lid open: snapshot -> 409 b'lid is open: this capture needs the lid closed'",
"22:58:35 lid open: the panel's head snapshot -> 200",
"22:58:36 lid open: the extension host's head snapshot -> 200",
"22:58:36 lid open: head snapshot without a token or the header -> 409 b'lid is open: this capture needs the lid closed'",
"22:58:36 lid open: head stream for no local viewer -> 409",
"22:58:36 lid open: stream -> 409",
"22:58:36 ACT lid close (fixture)",
"22:58:36 ACT lid close: done after 0.3 s",
"22:58:37 lid closed again: snapshot 95485 bytes",
"22:58:48 baseline: post: clean",
"22:58:48 result PASS"
],
"manifest_sha": "70ecd7867c2698d17f2f3c38db772868eda3364f541242c93fb5db4e1d593bcd",
"message": "",
"result": "PASS",
"test": "camera.lid-privacy",
"ts": "2026-10-18T22:58:48Z"
},
"requires": [],
"satisfied": true,
"source_sha": "6bc85a083096f3e2828d2162ef730b78eb3783a88617941cecc0bea550b89c46",
"subsystem": "camera",
"title": "Cameras see the room only with the lid closed"
},
{
"always": false,
"covers": [
[
"forgectrl",
"src/update.c"
],
[
"forgectrl",
"src/update.h"
],
[
"forgectrl",
"src/relcheck.c"
],
[
"forgectrl",
"src/relcheck.h"
],
[
"ffboot",
"**"
]
],
"fingerprint": "0aab6ce9ab2c03cce8edb40a3a3d31bd5d71acc52baa2b5326d1ab4036fc8428",
"hardware": "api",
"id": "update.slots-and-signature",
"inherited": false,
"kind": "auto",
"record": {
"answers": [],
"campaign": "c-20261018224638-4ca0",
"duration_s": 1,
"evidence": {
"apply": {
"body": {
"started": true
},
"status": 202
},
"apply_log": [
"2026-10-18T22:58:49.617053+00:00 forgectrl[1809] NOTICE update: writing the uploaded archive into slot b",
"2026-10-18T22:58:49.860800+00:00 forgectrl[1809] WARNING update: the apply failed: archive is not signed with the ForgeFIRM release key (confirm_unsigned=1 to apply anyway)"
],
"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-10-18T22:46:38Z"
},
"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": "forgefirm",
"version": "v0.0.6"
},
"b": {
"booted": false,
"device": "/dev/mmcblk2p2",
"kernel": "yes",
"next": false,
"present": "yes",
"state": "ok",
"type": "forgefirm",
"version": "v0.0.7"
},
"sd": {
"booted": true,
"device": "/dev/mmcblk1p1",
"kernel": "yes",
"next": true,
"present": "yes",
"state": "ok",
"type": "forgefirm",
"version": "20261018222431 (dev)"
}
},
"staged": {
"download": {
"bytes": 38488287,
"present": true,
"version": "v0.0.7"
},
"upload": {
"bytes": 0,
"present": false,
"version": ""
}
}
}
},
"fingerprint": "0aab6ce9ab2c03cce8edb40a3a3d31bd5d71acc52baa2b5326d1ab4036fc8428",
"image": "20261018222431 (dev)",
"log": [
"22:58:48 start update.slots-and-signature (auto, api) in campaign c-20261018224638-4ca0",
"22:58:49 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
"22:58:49 fixture: <REDACTED-1> at <IP-1> covers lid, interlock, button",
"22:58:49 queued by the unattended queue opened 2026-10-18T22:46:38Z",
"22:58:49 baseline: pre: clean",
"22:58:49 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': '20261018222431 (dev)', 'kernel': 'yes', 'booted': True, 'next': True}, 'a': {'device': '/dev/mmcblk2p1', 'present': 'yes', 'state': 'ok', 'type': 'forgefirm', 'version': 'v0.0.6', 'kernel': 'yes', 'booted': False, 'next': False}, 'b': {'device': '/dev/mmcblk2p2', 'present': 'yes', 'state': 'ok', 'type': 'forgefirm', 'version': 'v0.0.7', 'kernel': 'yes', 'booted': False, 'next': False}}, 'archives': [], 'staged': {'download': {'present': True, 'bytes': 38488287, 'version': 'v0.0.7'}, 'upload': {'present': False, 'bytes': 0, 'version': ''}}}",
"22:58:49 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=20261018222431 (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=forgefirm\nslot.a.version=v0.0.6\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.7\nslot.b.kernel=yes\nslot.legacy.device=/dev/mmcblk2p4\nslot.legacy.present=no",
"22:58:49 GET /update/status -> 200 {'running': False, 'kind': '', 'phase': '', 'elapsed': 0, 'progress_bytes': -1, 'result': None}",
"22:58:49 fwup -V garbage -> rc 1: fwup: Unrecognized archive format",
"22:58:49 fwup -V signed: own key rc 0, shipped key rc 1",
"22:58:49 POST /update/apply slot=b file=upload (no confirm_unsigned) -> 202 {'started': True}",
"22:58:50 apply result: {'ok': False, 'error': 'archive is not signed with the ForgeFIRM release key (confirm_unsigned=1 to apply anyway)'}",
"22:58:50 baseline: post: clean",
"22:58:50 result PASS"
],
"manifest_sha": "70ecd7867c2698d17f2f3c38db772868eda3364f541242c93fb5db4e1d593bcd",
"message": "",
"result": "PASS",
"test": "update.slots-and-signature",
"ts": "2026-10-18T22:58:50Z"
},
"requires": [
"forgectrl.auth"
],
"satisfied": true,
"source_sha": "7e276c113518419469f10f8ff23408d3047d7f0863ce99b0f0178320f0795573",
"subsystem": "update",
"title": "Boot slots readable, unsigned and foreign-signed archives refused"
},
{
"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": "57d696cefbd3cf910340f2e2a081767d659081c72d829e6de2b1f9bad8c25df3",
"hardware": "api",
"id": "cloud.mode-switch",
"inherited": false,
"kind": "operator",
"record": {
"answers": [],
"campaign": "c-20261018224638-4ca0",
"duration_s": 128,
"evidence": {
"actions": [
{
"by": "fixture",
"channel": "lid",
"state": "open",
"took_s": 0.02,
"ts": "2026-10-18T22:58:55Z"
},
{
"by": "fixture",
"channel": "lid",
"state": "close",
"took_s": 0.29,
"ts": "2026-10-18T22:59:05Z"
}
],
"baseline": {
"post": [],
"pre": []
},
"batch": {
"group": "unattended",
"ts": "2026-10-18T22:46:38Z"
},
"cam_after": {
"buffers": "uncached",
"cam": "lid",
"capture_allowed": true,
"clients": 0,
"convert": "gpu",
"encoder": "vpu",
"fps": 0.0,
"fps_cap": 0.0,
"frames": 0,
"h264": {
"active": false,
"clients": 0
},
"health": {
"captured": 1398,
"corrupt": 0,
"restarts": 0,
"withheld": 0
},
"hw_fps_skip": false,
"running": false,
"sensor": "OV5648",
"snapshot": {
"height": 1944,
"width": 2592
},
"stopped_by_lid": false,
"stream": {
"height": 972,
"width": 1296
},
"timing": {
"convert_ms": 0.0,
"copy_ms": 0.0,
"encode_ms": 0.0,
"latency_ms": 0.0,
"skipped": 32
}
},
"cam_before": {
"buffers": "uncached",
"cam": "lid",
"capture_allowed": true,
"clients": 0,
"convert": "gpu",
"encoder": "vpu",
"fps": 0.0,
"fps_cap": 0.0,
"frames": 0,
"h264": {
"active": false,
"clients": 0
},
"health": {
"captured": 949,
"corrupt": 0,
"restarts": 0,
"withheld": 0
},
"hw_fps_skip": false,
"running": false,
"sensor": "OV5648",
"snapshot": {
"height": 1944,
"width": 2592
},
"stopped_by_lid": false,
"stream": {
"height": 972,
"width": 1296
},
"timing": {
"convert_ms": 0.0,
"copy_ms": 0.0,
"encode_ms": 0.0,
"latency_ms": 0.0,
"skipped": 24
}
},
"cam_during_cloud": {
"buffers": "uncached",
"cam": "lid",
"capture_allowed": false,
"clients": 0,
"convert": "gpu",
"encoder": "vpu",
"fps": 0.0,
"fps_cap": 0.0,
"frames": 0,
"h264": {
"active": false,
"clients": 0
},
"health": {
"captured": 949,
"corrupt": 0,
"restarts": 0,
"withheld": 0
},
"hw_fps_skip": false,
"running": false,
"sensor": "OV5648",
"snapshot": {
"height": 1944,
"width": 2592
},
"stopped_by_lid": false,
"stream": {
"height": 972,
"width": 1296
},
"timing": {
"convert_ms": 0.0,
"copy_ms": 0.0,
"encode_ms": 0.0,
"latency_ms": 0.0,
"skipped": 24
}
},
"cloud_return": {
"counters_across_jog": [
[
0,
0,
0
],
[
4972,
-2760,
0
]
],
"counters_since_start": [
0,
0,
0
],
"mm": [
-23.306,
12.938
],
"session_travel_steps": [
-1243,
690
]
},
"fixture": {
"channels": [
"lid",
"interlock",
"button"
],
"hostname": "<REDACTED-1>",
"ip": "<IP-1>",
"released": []
},
"gf_probe": {
"checked_at": 1792364334,
"latest_gf_version": "2.6.0-2228",
"tested_against_gf": "2.6.0-2228"
},
"gfhome_complete": "2026-10-18T23:00:46.816658+00:00 gfhome[3218] INFO gfhome:home homing complete (service quiet 10s, 9 motion windows)",
"grbl_state": "Idle",
"homed": true,
"homing_mode": "manual",
"homing_s": 45.7,
"hunt": "2026-10-18T22:59:04.829476+00:00 gfcloud[2914] INFO basemachine:_finish_action hunt [1596426040]: finished with event \":completed\"",
"hunt_before_lid_open": false,
"hunt_gates": [
{
"accel_watch": "watch",
"armed": false,
"down_c": 22.3,
"fan_gates": {
"air_assist": {
"floor": 6093,
"reading": 2534,
"state": "idle"
},
"exhaust": {
"floor": 6416,
"reading": 0,
"state": "idle"
},
"intake_1": {
"floor": 2277,
"reading": 730,
"state": "idle"
},
"intake_2": {
"floor": 2277,
"reading": 731,
"state": "idle"
},
"purge": {
"floor": 345,
"reading": 631,
"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": "HEAD CRASH SIGNAL (axes y) - motion stopped, laser locked",
"report_age_s": 0.3,
"resume_ok": true,
"up_c": 22.23,
"verdict": "OK"
},
{
"accel_watch": "watch",
"armed": false,
"down_c": 22.3,
"fan_gates": {
"air_assist": {
"floor": 6093,
"reading": 2534,
"state": "idle"
},
"exhaust": {
"floor": 6416,
"reading": 0,
"state": "idle"
},
"intake_1": {
"floor": 2277,
"reading": 730,
"state": "idle"
},
"intake_2": {
"floor": 2277,
"reading": 731,
"state": "idle"
},
"purge": {
"floor": 345,
"reading": 631,
"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": "HEAD CRASH SIGNAL (axes y) - motion stopped, laser locked",
"report_age_s": 0.8,
"resume_ok": true,
"up_c": 22.23,
"verdict": "OK"
},
{
"accel_watch": "watch",
"armed": false,
"down_c": 22.23,
"fan_gates": {
"air_assist": {
"floor": 6093,
"reading": 2671,
"state": "idle"
},
"exhaust": {
"floor": 6416,
"reading": 0,
"state": "idle"
},
"intake_1": {
"floor": 2277,
"reading": 729,
"state": "idle"
},
"intake_2": {
"floor": 2277,
"reading": 726,
"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": "HEAD CRASH SIGNAL (axes y) - motion stopped, laser locked",
"report_age_s": 0.3,
"resume_ok": true,
"up_c": 22.23,
"verdict": "OK"
},
{
"accel_watch": "watch",
"armed": false,
"down_c": 22.23,
"fan_gates": {
"air_assist": {
"floor": 6093,
"reading": 2671,
"state": "idle"
},
"exhaust": {
"floor": 6416,
"reading": 0,
"state": "idle"
},
"intake_1": {
"floor": 2277,
"reading": 729,
"state": "idle"
},
"intake_2": {
"floor": 2277,
"reading": 726,
"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": "HEAD CRASH SIGNAL (axes y) - motion stopped, laser locked",
"report_age_s": 0.8,
"resume_ok": true,
"up_c": 22.23,
"verdict": "OK"
},
{
"accel_watch": "watch",
"armed": false,
"down_c": 22.23,
"fan_gates": {
"air_assist": {
"floor": 6093,
"reading": 2727,
"state": "idle"
},
"exhaust": {
"floor": 6416,
"reading": 0,
"state": "idle"
},
"intake_1": {
"floor": 2277,
"reading": 733,
"state": "idle"
},
"intake_2": {
"floor": 2277,
"reading": 726,
"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": "HEAD CRASH SIGNAL (axes y) - motion stopped, laser locked",
"report_age_s": 0.3,
"resume_ok": true,
"up_c": 21.91,
"verdict": "OK"
},
{
"accel_watch": "watch",
"armed": false,
"down_c": 22.23,
"fan_gates": {
"air_assist": {
"floor": 6093,
"reading": 2727,
"state": "idle"
},
"exhaust": {
"floor": 6416,
"reading": 0,
"state": "idle"
},
"intake_1": {
"floor": 2277,
"reading": 733,
"state": "idle"
},
"intake_2": {
"floor": 2277,
"reading": 726,
"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": "HEAD CRASH SIGNAL (axes y) - motion stopped, laser locked",
"report_age_s": 0.8,
"resume_ok": true,
"up_c": 21.91,
"verdict": "OK"
},
{
"accel_watch": "watch",
"armed": false,
"down_c": 22.23,
"fan_gates": {
"air_assist": {
"floor": 6093,
"reading": 2751,
"state": "idle"
},
"exhaust": {
"floor": 6416,
"reading": 0,
"state": "idle"
},
"intake_1": {
"floor": 2277,
"reading": 732,
"state": "idle"
},
"intake_2": {
"floor": 2277,
"reading": 731,
"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": "HEAD CRASH SIGNAL (axes y) - motion stopped, laser locked",
"report_age_s": 0.3,
"resume_ok": true,
"up_c": 22.3,
"verdict": "OK"
},
{
"accel_watch": "watch",
"armed": false,
"down_c": 22.23,
"fan_gates": {
"air_assist": {
"floor": 6093,
"reading": 2751,
"state": "idle"
},
"exhaust": {
"floor": 6416,
"reading": 0,
"state": "idle"
},
"intake_1": {
"floor": 2277,
"reading": 732,
"state": "idle"
},
"intake_2": {
"floor": 2277,
"reading": 731,
"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": "HEAD CRASH SIGNAL (axes y) - motion stopped, laser locked",
"report_age_s": 0.8,
"resume_ok": true,
"up_c": 22.3,
"verdict": "OK"
},
{
"accel_watch": "watch",
"armed": false,
"down_c": 22.07,
"fan_gates": {
"air_assist": {
"floor": 6093,
"reading": 2756,
"state": "idle"
},
"exhaust": {
"floor": 6416,
"reading": 0,
"state": "idle"
},
"intake_1": {
"floor": 2277,
"reading": 733,
"state": "idle"
},
"intake_2": {
"floor": 2277,
"reading": 732,
"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": "HEAD CRASH SIGNAL (axes y) - motion stopped, laser locked",
"report_age_s": 0.3,
"resume_ok": true,
"up_c": 21.99,
"verdict": "OK"
},
{
"accel_watch": "watch",
"armed": false,
"down_c": 22.07,
"fan_gates": {
"air_assist": {
"floor": 6093,
"reading": 2756,
"state": "idle"
},
"exhaust": {
"floor": 6416,
"reading": 0,
"state": "idle"
},
"intake_1": {
"floor": 2277,
"reading": 733,
"state": "idle"
},
"intake_2": {
"floor": 2277,
"reading": 732,
"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": "HEAD CRASH SIGNAL (axes y) - motion stopped, laser locked",
"report_age_s": 0.8,
"resume_ok": true,
"up_c": 21.99,
"verdict": "OK"
},
{
"accel_watch": "watch",
"armed": false,
"down_c": 22.23,
"fan_gates": {
"air_assist": {
"floor": 6093,
"reading": 2756,
"state": "idle"
},
"exhaust": {
"floor": 6416,
"reading": 0,
"state": "idle"
},
"intake_1": {
"floor": 2277,
"reading": 730,
"state": "idle"
},
"intake_2": {
"floor": 2277,
"reading": 732,
"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": "HEAD CRASH SIGNAL (axes y) - motion stopped, laser locked",
"report_age_s": 0.3,
"resume_ok": true,
"up_c": 22.15,
"verdict": "OK"
},
{
"accel_watch": "watch",
"armed": false,
"down_c": 22.23,
"fan_gates": {
"air_assist": {
"floor": 6093,
"reading": 2756,
"state": "idle"
},
"exhaust": {
"floor": 6416,
"reading": 0,
"state": "idle"
},
"intake_1": {
"floor": 2277,
"reading": 730,
"state": "idle"
},
"intake_2": {
"floor": 2277,
"reading": 732,
"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": "HEAD CRASH SIGNAL (axes y) - motion stopped, laser locked",
"report_age_s": 0.2,
"resume_ok": true,
"up_c": 22.15,
"verdict": "OK"
},
{
"accel_watch": "watch",
"armed": false,
"down_c": 22.23,
"fan_gates": {
"air_assist": {
"floor": 6093,
"reading": 2757,
"state": "unjudged"
},
"exhaust": {
"floor": 6416,
"reading": 0,
"state": "unjudged"
},
"intake_1": {
"floor": 2277,
"reading": 729,
"state": "unjudged"
},
"intake_2": {
"floor": 2277,
"reading": 731,
"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.3,
"resume_ok": true,
"up_c": 22.23,
"verdict": "OK"
},
{
"accel_watch": "watch",
"armed": false,
"down_c": 22.23,
"fan_gates": {
"air_assist": {
"floor": 6093,
"reading": 2757,
"state": "unjudged"
},
"exhaust": {
"floor": 6416,
"reading": 0,
"state": "unjudged"
},
"intake_1": {
"floor": 2277,
"reading": 729,
"state": "unjudged"
},
"intake_2": {
"floor": 2277,
"reading": 731,
"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.8,
"resume_ok": true,
"up_c": 22.23,
"verdict": "OK"
},
{
"accel_watch": "watch",
"armed": false,
"down_c": 22.07,
"fan_gates": {
"air_assist": {
"floor": 6093,
"reading": 2772,
"state": "unjudged"
},
"exhaust": {
"floor": 6416,
"reading": 0,
"state": "unjudged"
},
"intake_1": {
"floor": 2277,
"reading": 729,
"state": "unjudged"
},
"intake_2": {
"floor": 2277,
"reading": 726,
"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.0,
"resume_ok": true,
"up_c": 22.15,
"verdict": "OK"
},
{
"accel_watch": "watch",
"armed": false,
"down_c": 22.07,
"fan_gates": {
"air_assist": {
"floor": 6093,
"reading": 2772,
"state": "unjudged"
},
"exhaust": {
"floor": 6416,
"reading": 0,
"state": "unjudged"
},
"intake_1": {
"floor": 2277,
"reading": 729,
"state": "unjudged"
},
"intake_2": {
"floor": 2277,
"reading": 726,
"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.5,
"resume_ok": true,
"up_c": 22.15,
"verdict": "OK"
},
{
"accel_watch": "watch",
"armed": false,
"down_c": 23.08,
"fan_gates": {
"air_assist": {
"floor": 6093,
"reading": 2456,
"state": "idle"
},
"exhaust": {
"floor": 6416,
"reading": 0,
"state": "idle"
},
"intake_1": {
"floor": 2277,
"reading": 733,
"state": "idle"
},
"intake_2": {
"floor": 2277,
"reading": 727,
"state": "idle"
},
"purge": {
"floor": 345,
"reading": 631,
"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.24,
"verdict": "OK"
}
],
"hunt_line": "INFO basemachine:_finish_action hunt [1596426040]: 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": 3187,
"why": ""
},
"mode_before": {
"controller": "running",
"gated": false,
"local": false,
"mode": "grbl",
"motion": "verified",
"pid": 2296,
"why": ""
},
"mode_cloud": {
"controller": "running",
"gated": false,
"local": false,
"mode": "cloud",
"motion": "verified",
"pid": 2914,
"why": ""
},
"motions_after_lid_close": 3,
"refusals_before_hunt_end": 0,
"return": {
"counters_across_jog": [
[
0,
0,
0
],
[
4972,
-2760,
0
]
],
"counters_since_home": [
0,
0,
0
],
"mm": [
-23.306,
12.938
],
"session_travel_steps": [
-1243,
690
]
},
"session": [
"2026-10-18T22:58:54.351478+00:00 gfcloud[2914] INFO authentication:authenticate_machine SUCCESS",
"2026-10-18T22:58:55.458830+00:00 gfcloud[2914] INFO websocket:ws_connect ESTABLISHED"
],
"short_motions": []
},
"fingerprint": "57d696cefbd3cf910340f2e2a081767d659081c72d829e6de2b1f9bad8c25df3",
"image": "20261018222431 (dev)",
"log": [
"22:58:50 start cloud.mode-switch (operator, api) in campaign c-20261018224638-4ca0",
"22:58:51 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
"22:58:51 fixture: <REDACTED-1> at <IP-1> covers lid, interlock, button",
"22:58:51 fixture: running unattended (no prompt can be answered)",
"22:58:51 queued by the unattended queue opened 2026-10-18T22:46:38Z",
"22:58:51 baseline: pre: clean",
"22:58:51 mode: test needs grbl - already in grbl mode",
"22:58:51 mode before: {'mode': 'grbl', 'controller': 'running', 'pid': 2296, 'motion': 'verified', 'gated': False, 'local': False, 'why': ''}",
"22:58:55 POST /mode controller=cloud -> 200 {'mode': 'cloud', 'controller': 'running', 'pid': 2914, 'motion': 'verified', 'gated': False, 'local': False, 'why': ''}",
"22:58:55 mode after switch: {'mode': 'cloud', 'controller': 'running', 'pid': 2914, 'motion': 'verified', 'gated': False, 'local': False, 'why': ''}",
"22:58:55 ACT lid open (fixture)",
"22:58:55 ACT lid open: done after 0.0 s",
"22:58:57 gfcloud: gfcloud[2914] INFO authentication:authenticate_machine SUCCESS",
"22:58:57 gfcloud: gfcloud[2914] INFO websocket:ws_connect ESTABLISHED",
"22:58:57 cloud session established: True; firmware probe: {'latest_gf_version': '2.6.0-2228', 'tested_against_gf': '2.6.0-2228', 'checked_at': 1792364334}",
"22:59:05 hunt: 17 status samples, 4 in phase run; verdicts ['OK']",
"22:59:05 hunt with the lid open: INFO basemachine:_finish_action hunt [1596426040]: finished with event \":completed\" (lens homed)",
"22:59:05 ACT lid close (fixture)",
"22:59:06 ACT lid close: done after 0.3 s",
"22:59:21 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
"22:59:52 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
"23:00:01 cloud mode stays up; the machine is quiet",
"23:00:01 3 service motion(s) completed after the lid closed",
"23:00:02 POST /mode controller=grbl -> 200 {'mode': 'grbl', 'controller': 'running', 'pid': 3187, 'motion': 'verified', 'gated': False, 'local': False, 'why': ''}",
"23:00:02 mode after switch back: {'mode': 'grbl', 'controller': 'running', 'pid': 3187, 'motion': 'verified', 'gated': False, 'local': False, 'why': ''}",
"23:00:05 grbl state after: Idle",
"23:00:05 the head is -23.306/12.938 mm from where the test found it",
"23:00:06 connect: Idle",
"23:00:08 position counters re-zeroed at the starting position; the baseline expects (0,0,0) at the end",
"23:00:08 head returned to where the test found it (23.306/-12.938 mm)",
"23:00:08 homing_mode=gfcloud for the homing -> 200 ",
"23:00:23 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
"23:00:53 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
"23:00:54 homing: homed=True after 45.7 s (kernel idle, grbl Idle)",
"23:00:54 gfhome: 2026-10-18T23:00:46.816658+00:00 gfhome[3218] INFO gfhome:home homing complete (service quiet 10s, 9 motion windows)",
"23:00:54 position counters re-zeroed at the starting position; the baseline expects (0,0,0) at the end",
"23:00:55 $H acknowledged: [MSG:] | ok",
"23:00:55 restore homing_mode='manual' -> 200",
"23:00:56 the head is -23.306/12.938 mm from where the test found it",
"23:00:56 connect: Idle",
"23:00:59 position counters re-zeroed at the starting position; the baseline expects (0,0,0) at the end",
"23:00:59 head returned to where the test found it (23.306/-12.938 mm)",
"23:00:59 PASS: grbl -> cloud (session, hunt with the lid open, lens homed, airflow unjudged) -> grbl (port open, Idle), then $H homed in 45.7 s",
"23:00:59 baseline: post: clean",
"23:00:59 result PASS"
],
"manifest_sha": "70ecd7867c2698d17f2f3c38db772868eda3364f541242c93fb5db4e1d593bcd",
"message": "",
"result": "PASS",
"test": "cloud.mode-switch",
"ts": "2026-10-18T23:00:59Z"
},
"requires": [
"forgectrl.auth",
"motion.pacing"
],
"satisfied": true,
"source_sha": "e50ce19c9ca31acb3606b76442ad939634b42ae85e1a7bbbf9979465934affef",
"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": "8dcf22e87ec0464d7855eb9564c9258cabc8da11c3e58e51729d58a9c3fd8dd9",
"hardware": "api",
"id": "cloud.service-protocol",
"inherited": false,
"kind": "operator",
"record": {
"answers": [
{
"answer": "Yes",
"question": "Does the app show the print complete?",
"ts": "2026-10-18T23:14:54Z"
}
],
"campaign": "c-20261018224638-4ca0",
"duration_s": 72,
"evidence": {
"baseline": {
"post": [],
"pre": []
},
"batch": {
"group": "attended",
"ts": "2026-10-18T23:07:24Z"
},
"downloads": [
"2026-10-18_231423_hunt.info",
"2026-10-18_231428_motion.info",
"2026-10-18_231438_motion.info",
"2026-10-18_231442_motion.info",
"2026-10-18_231445_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 [1596430472]: finished with event \":completed\"",
"images_uploaded": 3,
"print": "INFO basemachine:_finish_action print [1596430581]: finished with event \":completed\"",
"pulse": "INFO websocket:fetch_motion pulse data is gzip-compressed, 405 byte body"
},
"fingerprint": "8dcf22e87ec0464d7855eb9564c9258cabc8da11c3e58e51729d58a9c3fd8dd9",
"image": "20261018222431 (dev)",
"log": [
"23:14:18 start cloud.service-protocol (operator, api) in campaign c-20261018224638-4ca0",
"23:14:18 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
"23:14:18 fixture: <REDACTED-1> at <IP-1> covers lid, interlock, button",
"23:14:18 queued by the attended queue opened 2026-10-18T23:07:24Z",
"23:14:18 baseline: pre: clean",
"23:14:18 grbl mode: switching to cloud as the emulator",
"23:14:21 controller mode changed to cloud for the operator; the baseline keeps it",
"23:14:24 emulator session established: gfcloud[6818] INFO authentication:authenticate_machine SUCCESS; gfcloud[6818] INFO websocket:ws_connect ESTABLISHED",
"23:14:26 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.",
"23:14:46 print: INFO basemachine:_finish_action print [1596430581]: finished with event \":completed\"; 3 images uploaded; INFO websocket:fetch_motion pulse data is gzip-compressed, 405 byte body",
"23:14:46 the job's header: 134 tags, STfr 10000",
"23:14:46 PROMPT: Does the app show the print complete?",
"23:14:49 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
"23:14:54 ANSWER: Yes",
"23:14:54 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",
"23:14:54 cloud mode: restarting the client with the machine, no hunt (was pid 6818)",
"23:15:20 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
"23:15:30 the machine is back under the real client, no hunt",
"23:15:30 baseline: post: clean",
"23:15:30 result PASS"
],
"manifest_sha": "70ecd7867c2698d17f2f3c38db772868eda3364f541242c93fb5db4e1d593bcd",
"message": "",
"result": "PASS",
"test": "cloud.service-protocol",
"ts": "2026-10-18T23:15:30Z"
},
"requires": [
"forgectrl.auth"
],
"satisfied": true,
"source_sha": "4eb22732bab44127c93af962265ba7a6b1dfe1fb196a001edd89c45590b1f291",
"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": "bfbed8e9460c45df9870d1433d1467ff54980dc79d383eeb68178fc2d0f65fd3",
"hardware": "api",
"id": "cloud.lid-interlock-abort",
"inherited": false,
"kind": "live",
"record": {
"answers": [],
"campaign": "c-20261018224638-4ca0",
"duration_s": 136,
"evidence": {
"actions": [
{
"by": "fixture",
"channel": "button",
"state": "press",
"took_s": 6.76,
"ts": "2026-10-18T23:16:06Z"
},
{
"by": "fixture",
"channel": "lid",
"state": "open",
"took_s": 0.02,
"ts": "2026-10-18T23:16:13Z"
},
{
"by": "fixture",
"channel": "lid",
"state": "close",
"took_s": 0.28,
"ts": "2026-10-18T23:16:25Z"
},
{
"by": "fixture",
"channel": "button",
"state": "press",
"took_s": 6.01,
"ts": "2026-10-18T23:16:57Z"
},
{
"by": "fixture",
"channel": "interlock",
"state": "open",
"took_s": 0.02,
"ts": "2026-10-18T23:17:03Z"
},
{
"by": "fixture",
"channel": "lid",
"state": "open",
"took_s": 0.02,
"ts": "2026-10-18T23:17:04Z"
},
{
"by": "fixture",
"channel": "lid",
"state": "close",
"took_s": 0.28,
"ts": "2026-10-18T23:17:15Z"
},
{
"by": "fixture",
"channel": "interlock",
"state": "close",
"took_s": 0.28,
"ts": "2026-10-18T23:17:16Z"
}
],
"baseline": {
"post": [],
"pre": []
},
"batch": {
"group": "attended",
"ts": "2026-10-18T23:07:24Z"
},
"edge_to_stop_ms": 3.9,
"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-10-18T23:15:31Z"
},
"restored": {
"interlock_ok": true,
"lid": true
},
"switches_at_return": {
"interlock_ok": false,
"lid": false
}
},
"fingerprint": "bfbed8e9460c45df9870d1433d1467ff54980dc79d383eeb68178fc2d0f65fd3",
"image": "20261018222431 (dev)",
"log": [
"23:15:30 start cloud.lid-interlock-abort (live, api) in campaign c-20261018224638-4ca0",
"23:15:31 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
"23:15:31 fixture: <REDACTED-1> at <IP-1> covers lid, interlock, button",
"23:15:31 queued by the attended queue opened 2026-10-18T23:07:24Z",
"23:15:31 baseline: pre: clean",
"23:15:31 cloud mode: restarting the client offline (was pid 6878)",
"23:15:35 offline service up: INFO offline:open OFFLINE service: no web session; listening on /run/gfcloud-offline.sock",
"23:16:02 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
"23:16:05 job abort.puls: 486344 payload bytes, 49 s at STfr 10000",
"23:16:06 ACT button press (fixture)",
"23:16:13 ACT button press: done after 6.8 s",
"23:16:13 ACT lid open (fixture)",
"23:16:13 ACT lid open: done after 0.0 s",
"23:16:25 [lid] lid opened: seen",
"23:16:25 [lid] lid opened mid-run; stopping motion: seen",
"23:16:25 [lid] start return home: seen",
"23:16:25 [lid] return home complete: seen",
"23:16:25 [lid] print finished: seen",
"23:16:25 lid edge -> stop: 3.9 ms",
"23:16:25 [lid] kernel counters after the park: [0, 0, 0]",
"23:16:25 ACT lid close (fixture)",
"23:16:25 ACT lid close: done after 0.3 s",
"23:16:32 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
"23:16:55 cloud mode stays up; the machine is quiet",
"23:16:57 ACT button press (fixture)",
"23:17:03 ACT button press: done after 6.0 s",
"23:17:03 ACT interlock open (fixture)",
"23:17:03 ACT interlock open: done after 0.0 s",
"23:17:03 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
"23:17:04 ACT lid open (fixture)",
"23:17:04 ACT lid open: done after 0.0 s",
"23:17:15 [interlock] interlock opened mid-run; stopping motion: seen",
"23:17:15 [interlock] start return home: seen",
"23:17:15 [interlock] return home complete: seen",
"23:17:15 [interlock] print finished: seen",
"23:17:15 [interlock] kernel counters after the park: [0, 0, 0]",
"23:17:15 ACT lid close (fixture)",
"23:17:16 ACT lid close: done after 0.3 s",
"23:17:16 ACT interlock close (fixture)",
"23:17:16 ACT interlock close: done after 0.3 s",
"23:17:34 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
"23:17:46 cloud mode stays up; the machine is quiet",
"23:17:46 PASS: lid open -> stop in 3.9 ms and park with the lid open; interlock open -> the same tail with the park running through a lid edge; both prints ':cancelled'",
"23:17:46 offline jobs removed from /tmp/forgetest",
"23:17:46 baseline: post: clean",
"23:17:46 result PASS"
],
"manifest_sha": "70ecd7867c2698d17f2f3c38db772868eda3364f541242c93fb5db4e1d593bcd",
"message": "",
"result": "PASS",
"test": "cloud.lid-interlock-abort",
"ts": "2026-10-18T23:17:46Z"
},
"requires": [
"laser.emission-witness"
],
"satisfied": true,
"source_sha": "2f3c281371954a1ee27f2bd685eb0ae60e3624504b39a5144187bad09e040577",
"subsystem": "cloud",
"title": "Lid and interlock each abort a cloud print; the park ignores an open lid"
},
{
"always": false,
"covers": [
[
"forgefirm-app",
"**"
],
[
"python3-gfhardware",
"**"
],
[
"python3-gfutilities",
"**"
],
[
"forgectrl",
"src/super.c"
],
[
"forgectrl",
"src/main.c"
]
],
"fingerprint": "95d0ec7cf1b53894034e37c235da36d4e8ab2871b72314e0326eeee1fb2a914f",
"hardware": "api",
"id": "cloud.pause-resume",
"inherited": false,
"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-10-18T23:20:00Z"
},
{
"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-10-18T23:20:52Z"
}
],
"campaign": "c-20261018224638-4ca0",
"duration_s": 220,
"evidence": {
"actions": [
{
"by": "fixture",
"channel": "button",
"state": "press",
"took_s": 1.26,
"ts": "2026-10-18T23:20:26Z"
},
{
"by": "fixture",
"channel": "button",
"state": "press",
"took_s": 1.01,
"ts": "2026-10-18T23:20:27Z"
}
],
"armed_after_resume": true,
"baseline": {
"post": [],
"pre": []
},
"batch": {
"group": "attended",
"ts": "2026-10-18T23:07:24Z"
},
"effective_limits": [
"2026-10-18T23:20:10.759816+00:00 forgectrl[4205] 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, intak",
"2026-10-18T23:20:11.759797+00:00 forgectrl[4205] 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-10-18T23:20:33.910586+00:00 gfcloud[7385] INFO machine:_dwell cool down: holding 10.0 s",
"warm up": "2026-10-18T23:20:22.060266+00:00 gfcloud[7385] 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 [1596432120]: finished with event \":completed\"",
"return home complete": true
},
"operator": {
"ack_live": true,
"ts": "2026-10-18T23:17:47Z"
},
"progress_total": 41240,
"relock_or_cancel_lines": 0
},
"fingerprint": "95d0ec7cf1b53894034e37c235da36d4e8ab2871b72314e0326eeee1fb2a914f",
"image": "20261018222431 (dev)",
"log": [
"23:17:46 start cloud.pause-resume (live, api) in campaign c-20261018224638-4ca0",
"23:17:47 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
"23:17:47 fixture: <REDACTED-1> at <IP-1> covers lid, interlock, button",
"23:17:47 queued by the attended queue opened 2026-10-18T23:07:24Z",
"23:17:47 baseline: pre: clean",
"23:17:47 the running client is the offline service: restarting it with the service",
"23:17:47 cloud mode: restarting the cloud client for a fresh connect (was pid 7004)",
"23:17:53 cloud session established (pid 7385)",
"23:18:04 connect-time hunt: INFO basemachine:_finish_action hunt [1596431443]: finished with event \":completed\"",
"23:18:17 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
"23:18:49 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
"23:19:21 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
"23:19:51 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
"23:19:53 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.",
"23:20:00 ANSWER: Done",
"23:20:22 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
"23:20:26 ACT button press (fixture)",
"23:20:27 ACT button press: done after 1.3 s",
"23:20:27 ACT button press (fixture)",
"23:20:28 ACT button press: done after 1.0 s",
"23:20:28 armed after the resume: True",
"23:20:45 warm-up: 2026-10-18T23:20:22.060266+00:00 gfcloud[7385] INFO machine:_dwell warm up: holding 3.0 s",
"23:20:45 rest: 2026-10-18T23:20:33.910586+00:00 gfcloud[7385] INFO machine:_dwell cool down: holding 10.0 s",
"23:20:45 progress reported against 41240 bytes",
"23:20:45 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?",
"23:20:52 ANSWER: Yes",
"23:20:52 job limits from the header (the print's): air_assist_min_rpm=116 coolant_max_c=33.0 coolant_min_c=5.0",
"23:20:52 engine effective limits: 2026-10-18T23:20:10.759816+00:00 forgectrl[4205] 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, intak",
"23:20:53 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
"23:21:25 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
"23:21:26 cloud mode stays up; the machine is quiet",
"23:21:26 PASS: button pause/resume mid-print, warm-up and rest observed, progress reported, the job's limits passed through, job completed and parked",
"23:21:27 baseline: post: clean",
"23:21:27 result PASS"
],
"manifest_sha": "70ecd7867c2698d17f2f3c38db772868eda3364f541242c93fb5db4e1d593bcd",
"message": "",
"result": "PASS",
"test": "cloud.pause-resume",
"ts": "2026-10-18T23:21:27Z"
},
"requires": [
"laser.emission-witness"
],
"satisfied": true,
"source_sha": "575e176f9dcc353fa31dd950129d19de07a9af3e8db3d2a42600802f05f5edd0",
"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": "05ea8ebf09927b7f81ae201e21ad5f24de1fc37f21c973285361b92d2e526c07",
"hardware": "api",
"id": "cloud.oversize-stream",
"inherited": false,
"kind": "live",
"record": {
"answers": [],
"campaign": "c-20261018224638-4ca0",
"duration_s": 211,
"evidence": {
"actions": [
{
"by": "fixture",
"channel": "button",
"state": "press",
"took_s": 6.03,
"ts": "2026-10-18T23:22:06Z"
},
{
"by": "fixture",
"channel": "button",
"state": "press",
"took_s": 1.26,
"ts": "2026-10-18T23:24:13Z"
},
{
"by": "fixture",
"channel": "button",
"state": "press",
"took_s": 1.26,
"ts": "2026-10-18T23:24:14Z"
}
],
"app_armed_after": false,
"app_counters_after_park": [
0,
0,
0
],
"app_latch_locked": true,
"backtrack_refused_lines": [],
"baseline": {
"post": [],
"pre": []
},
"batch": {
"group": "attended",
"ts": "2026-10-18T23:07:24Z"
},
"button_dark": false,
"events": [
"print:starting",
"print:download:completed",
"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": 168023,
"operator": {
"ack_live": true,
"ts": "2026-10-18T23:21:27Z"
},
"pause_log": {
"button pressed mid-run; pausing": true,
"button pressed while paused": true,
"paused at": true,
"resuming (laser lead": true
},
"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": 2,
"underruns_during": 2
},
"fingerprint": "05ea8ebf09927b7f81ae201e21ad5f24de1fc37f21c973285361b92d2e526c07",
"image": "20261018222431 (dev)",
"log": [
"23:21:27 start cloud.oversize-stream (live, api) in campaign c-20261018224638-4ca0",
"23:21:27 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
"23:21:27 fixture: <REDACTED-1> at <IP-1> covers lid, interlock, button",
"23:21:27 queued by the attended queue opened 2026-10-18T23:07:24Z",
"23:21:27 baseline: pre: clean",
"23:21:27 cloud mode: restarting the client offline (was pid 7385)",
"23:21:32 offline service up: INFO offline:open OFFLINE service: no web session; listening on /run/gfcloud-offline.sock",
"23:21:58 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
"23:22:04 job long.puls: 35015348 payload bytes, 3502 s at STfr 10000 (gzip)",
"23:22:06 ACT button press (fixture)",
"23:22:13 ACT button press: done after 6.0 s",
"23:22:13 program total at the start of the run: 33292288 bytes",
"23:22:13 NOTICE: Cutting: the test watches the ring being topped up for two minutes. Do nothing yet.",
"23:22:29 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
"23:23:00 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
"23:23:31 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
"23:24:02 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
"23:24:13 program total two minutes in: 34603008 bytes (+1310720)",
"23:24:13 progress reported against 35015348 bytes, kernel program total 34603008",
"23:24:13 max_backtrack while the feed runs: 168023 steps",
"23:24:13 ACT button press (fixture)",
"23:24:14 ACT button press: done after 1.3 s",
"23:24:14 ACT button press (fixture)",
"23:24:15 ACT button press: done after 1.3 s",
"23:24:15 canceled the print as the app would",
"23:24:28 [cancel] action canceled mid-run; stopping motion: seen",
"23:24:28 [cancel] start return home: seen",
"23:24:28 [cancel] return home complete: seen",
"23:24:28 [app] kernel counters after the park: [0, 0, 0]",
"23:24:32 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
"23:24:58 cloud mode stays up; the machine is quiet",
"23:24:58 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'",
"23:24:58 offline jobs removed from /tmp/forgetest",
"23:24:58 baseline: post: clean",
"23:24:58 result PASS"
],
"manifest_sha": "70ecd7867c2698d17f2f3c38db772868eda3364f541242c93fb5db4e1d593bcd",
"message": "",
"result": "PASS",
"test": "cloud.oversize-stream",
"ts": "2026-10-18T23:24:58Z"
},
"requires": [
"cloud.lid-interlock-abort",
"cloud.pause-resume"
],
"satisfied": true,
"source_sha": "25856148e06569b9101ac94b8a8040ccdc0c1f2de47c7331911dad96257136b0",
"subsystem": "cloud",
"title": "A print longer than the ring is fed while it plays"
},
{
"always": false,
"covers": [
[
"linux-fslc",
"**"
]
],
"fingerprint": "f5e27183c3b5da698a6b01f699458378cbc9b36919e96069c390d60d6a3f9fd7",
"hardware": "api",
"id": "exthost.platform",
"inherited": false,
"kind": "auto",
"record": {
"answers": [],
"campaign": "c-20261018224638-4ca0",
"duration_s": 22,
"evidence": {
"allowlisted_self": [
[
[
4,
"127.0.0.1",
443,
false
],
[
"refused",
0.0
]
],
[
[
4,
"<IP-1>",
443,
false
],
[
"refused",
0.0
]
]
],
"as_pool_uid": {
"800": [
[
[
4,
"127.0.0.1",
443,
false
],
[
"refused",
0.0
]
],
[
[
4,
"127.0.0.1",
80,
false
],
[
"refused",
0.0
]
],
[
[
6,
"::1",
443,
false
],
[
"refused",
0.0
]
],
[
[
6,
"::1",
23,
false
],
[
"refused",
0.0
]
],
[
[
4,
"<IP-1>",
443,
false
],
[
"refused",
0.0
]
],
[
[
4,
"<IP-1>",
23,
false
],
[
"refused",
0.0
]
],
[
[
4,
"127.0.0.1",
9,
true
],
[
"eperm",
0.0
]
],
[
[
4,
"<IP-1>",
9,
true
],
[
"eperm",
0.0
]
]
],
"831": [
[
[
4,
"127.0.0.1",
443,
false
],
[
"refused",
0.0
]
],
[
[
4,
"127.0.0.1",
80,
false
],
[
"refused",
0.0
]
],
[
[
6,
"::1",
443,
false
],
[
"refused",
0.0
]
],
[
[
6,
"::1",
23,
false
],
[
"refused",
0.0
]
],
[
[
4,
"<IP-1>",
443,
false
],
[
"refused",
0.0
]
],
[
[
4,
"<IP-1>",
23,
false
],
[
"refused",
0.0
]
],
[
[
4,
"127.0.0.1",
9,
true
],
[
"eperm",
0.0
]
],
[
[
4,
"<IP-1>",
9,
true
],
[
"eperm",
0.0
]
]
]
},
"as_root": [
[
[
4,
"127.0.0.1",
443,
false
],
[
"ok",
0.0
]
],
[
[
4,
"<IP-1>",
443,
false
],
[
"ok",
0.0
]
],
[
[
4,
"127.0.0.1",
9,
true
],
[
"ok",
0.0
]
]
],
"baseline": {
"post": [],
"pre": []
},
"batch": {
"group": "unattended",
"ts": "2026-10-18T22:46:38Z"
},
"cgroup_tree": {
"controllers": [
"cpu",
"memory",
"pids"
],
"ffx_cpu_idle": "1",
"ffx_subtree": [
"cpu",
"memory",
"pids"
],
"root_subtree": [
"cpu",
"memory",
"pids"
]
},
"counters": [
[
0,
0
],
[
12,
4
]
],
"cpu": {
"frozen_us": 0,
"share": 0.0508,
"thawed_us": 83975,
"throttled": 40
},
"firmware_groups": {
"forgectrl/1809": "0::/",
"grblHAL_glowfor/3380": "0::/"
},
"fixture": {
"channels": [
"lid",
"interlock",
"button"
],
"hostname": "<REDACTED-1>",
"ip": "<IP-2>",
"released": []
},
"kernel": {
"CONFIG_CFS_BANDWIDTH": "y",
"CONFIG_CGROUPS": "y",
"CONFIG_CGROUP_PIDS": "y",
"CONFIG_CGROUP_SCHED": "y",
"CONFIG_FAIR_GROUP_SCHED": "y",
"CONFIG_MEMCG": "y",
"CONFIG_NFT_LIMIT": "y",
"CONFIG_NFT_REJECT_INET": "y",
"CONFIG_NF_CONNTRACK": "n",
"CONFIG_NF_TABLES": "y",
"CONFIG_NF_TABLES_INET": "y",
"CONFIG_RT_GROUP_SCHED": "n",
"CONFIG_SECCOMP_FILTER": "y",
"CONFIG_SECURITY_LANDLOCK": "y"
},
"landlock": {
"abi": 6,
"after": {
"added": 0,
"applied": 0,
"etc": "eacces",
"ruleset": true,
"tcp": "eacces",
"usr": "ok"
},
"before": {
"etc": "ok",
"tcp": "ok",
"usr": "ok"
}
},
"memory": {
"lines": [
{
"started": true
}
],
"oom_kill": 1,
"peak": "25165824",
"rc": -9
},
"pids": {
"events_max": 1,
"result": {
"forked": 5,
"stopped_by": "EAGAIN"
}
},
"pool": {
"accounts": 32,
"others": [],
"problems": []
},
"rules": "table inet ffx {\n\tmap allow {\n\t\ttype uid : verdict\n\t}\n\n\tchain output {\n\t\ttype filter hook output priority filter; policy accept;\n\t\tmeta skuid 800-831 jump pool\n\t}\n\n\tchain pool {\n\t\toifname \"lo\" jump refuse\n\t\tmeta skuid vmap @allow\n\t\tjump refuse\n\t}\n\n\tchain refuse {\n\t\tmeta l4proto tcp counter packets 0 bytes 0 reject with tcp reset\n\t\tcounter packets 0 bytes 0 drop\n\t}\n}\n",
"seccomp": {
"after": "eperm",
"before": "Linux",
"installed": 0,
"status": [
"2"
]
}
},
"fingerprint": "f5e27183c3b5da698a6b01f699458378cbc9b36919e96069c390d60d6a3f9fd7",
"image": "20261018222431 (dev)",
"log": [
"23:00:59 start exthost.platform (auto, api) in campaign c-20261018224638-4ca0",
"23:00:59 fixture up: <REDACTED-1> at <IP-2>, v1.0.0, covers lid, interlock, button",
"23:00:59 fixture: <REDACTED-1> at <IP-2> covers lid, interlock, button",
"23:00:59 queued by the unattended queue opened 2026-10-18T22:46:38Z",
"23:00:59 baseline: pre: clean",
"23:01:00 cgroup tree: {'controllers': ['cpu', 'memory', 'pids'], 'root_subtree': ['cpu', 'memory', 'pids'], 'ffx_subtree': ['cpu', 'memory', 'pids'], 'ffx_cpu_idle': '1'}",
"23:01:04 a spinning probe under cpu.max 5%: 5.1% of the core, throttled 40 times",
"23:01:08 frozen for 1.5 s the probe ran 0 us; thawed for 1.5 s it ran 83975 us",
"23:01:09 pids.max 6: the fork loop made 5 of 12, stopped by EAGAIN; pids.events max 1",
"23:01:18 memory.max 24 MiB against a 96 MiB appetite: rc -9, oom_kill 1, peak 25165824",
"23:01:20 two pool uids: 6 TCP connects each refused at once, 2 UDP sends each EPERM; the rules counted [0, 0] -> [12, 4]",
"23:01:20 uid 831 with the machine's own addresses on its allowlist: [[[4, '127.0.0.1', 443, False], ['refused', 0.0]], [[4, '<IP-1>', 443, False], ['refused', 0.0]]]",
"23:01:21 landlock ABI 6: before {'etc': 'ok', 'usr': 'ok', 'tcp': 'ok'}, after {'ruleset': True, 'added': 0, 'applied': 0, 'tcp': 'eacces', 'etc': 'eacces', 'usr': 'ok'}",
"23:01:21 seccomp: {'installed': 0, 'before': 'Linux', 'after': 'eperm', 'status': ['2']}",
"23:01:21 PASS: the kernel, the cgroup tree, the account pool, and the deny rules are in place, and each held a probe process the way it will hold a package",
"23:01:21 baseline: post: clean",
"23:01:21 result PASS"
],
"manifest_sha": "70ecd7867c2698d17f2f3c38db772868eda3364f541242c93fb5db4e1d593bcd",
"message": "",
"result": "PASS",
"test": "exthost.platform",
"ts": "2026-10-18T23:01:21Z"
},
"requires": [],
"satisfied": true,
"source_sha": "5780699f9a9c712ac520f3301e379107ed037aceabc1eb365c4a3f46f2451713",
"subsystem": "exthost",
"title": "The extension sandbox platform holds a process"
},
{
"always": false,
"covers": [
[
"forgeext",
"src/super.*"
],
[
"forgeext",
"src/run.*"
],
[
"forgeext",
"src/machine.*"
],
[
"forgeext",
"src/cgroup.*"
],
[
"forgectrl",
"src/cool.*"
],
[
"forgectrl",
"src/cam.*"
],
[
"forgectrl",
"src/main.c"
]
],
"fingerprint": "c01584bb2409f0f4c0cc4eaf356740e6bee2f77b9e7ce13f3ab69548af74f17c",
"hardware": "takeover",
"id": "exthost.armed-freeze",
"inherited": false,
"kind": "operator",
"record": {
"answers": [],
"campaign": "c-20261018224638-4ca0",
"duration_s": 108,
"evidence": {
"actions": [
{
"by": "fixture",
"channel": "button",
"state": "press",
"took_s": 6.02,
"ts": "2026-10-18T23:02:02Z"
}
],
"armed_after": false,
"baseline": {
"post": [],
"pre": []
},
"batch": {
"group": "unattended",
"ts": "2026-10-18T22:46:38Z"
},
"camera_after_window": {
"bytes": 298956,
"status": 200
},
"camera_in_window": {
"said": "a job is armed: a background capture waits until the window closes",
"status": 409
},
"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": []
},
"freeze_lag_s": 0.42,
"freeze_led_the_run_s": 5.4,
"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\"",
"samples": {
"all": 271,
"inside": 174,
"not_frozen_inside": 0
},
"thaw_lag_s": 0.21,
"window_s": 38.1
},
"fingerprint": "c01584bb2409f0f4c0cc4eaf356740e6bee2f77b9e7ce13f3ab69548af74f17c",
"image": "20261018222431 (dev)",
"log": [
"23:01:21 start exthost.armed-freeze (operator, takeover) in campaign c-20261018224638-4ca0",
"23:01:22 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
"23:01:22 fixture: <REDACTED-1> at <IP-1> covers lid, interlock, button",
"23:01:22 fixture: running unattended (no prompt can be answered)",
"23:01:22 queued by the unattended queue opened 2026-10-18T22:46:38Z",
"23:01:22 baseline: pre: clean",
"23:01:27 grbl mode: switching to cloud offline",
"23:01:29 controller mode changed to cloud for the operator; the baseline keeps it",
"23:01:30 offline service up: INFO offline:open OFFLINE service: no web session; listening on /run/gfcloud-offline.sock",
"23:01:53 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
"23:02:00 job dark.puls: 324236 payload bytes, 32 s at STfr 10000",
"23:02:02 ACT button press (fixture)",
"23:02:08 ACT button press: done after 6.0 s",
"23:02:23 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
"23:02:51 PASS: locked at the button, unlocked for the run, locked after it; the print completed",
"23:02:54 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
"23:02:57 offline jobs removed from /tmp/forgetest",
"23:02:58 a background capture inside the window -> 409 (a job is armed: a background capture waits until the window closes); after it -> 200, 298956 bytes",
"23:02:58 the armed window was open 38.1 s; frozen 0.42 s after it opened and 5.40 s before the latch unlocked for the run, in every one of 174 samples from 2 s in to the close, the heartbeat still; thawed 0.21 s after the close",
"23:02:58 remove org.forgetest.reference -> ok",
"23:02:58 restore ext_enabled='0' -> 200",
"23:02:58 takeover: waiting for forgectrl to be settled",
"23:02:58 baseline: /mode controller=running motion=verified",
"23:02:58 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",
"23:02:58 takeover: the cloud client is the offline service (pid 3535); forgectrl's start brings it back offline",
"23:02:58 takeover: stopping the controller through forgectrl",
"23:02:59 takeover: POST /controller/stop -> 200",
"23:02:59 takeover: forgectrl stop -> rc 0",
"23:03:01 takeover: pulse device free",
"23:03:01 takeover: forgectrl start -> rc 0",
"23:03:03 baseline: /mode controller=stopped motion=unverified",
"23:03:07 baseline: /mode controller=running motion=verified",
"23:03:09 takeover: the cloud client is back as the offline service (pid 4232)",
"23:03:09 the previous record is back under a restart",
"23:03:09 baseline: post: clean",
"23:03:09 result PASS"
],
"manifest_sha": "70ecd7867c2698d17f2f3c38db772868eda3364f541242c93fb5db4e1d593bcd",
"message": "",
"result": "PASS",
"test": "exthost.armed-freeze",
"ts": "2026-10-18T23:03:09Z"
},
"requires": [
"exthost.platform"
],
"satisfied": true,
"source_sha": "7cb2ac9b31d03ebcb894a3c167caba73f497d18b563c4688bf62dcefe00bd017",
"subsystem": "exthost",
"title": "A package's service is frozen for the armed window"
},
{
"always": false,
"covers": [
[
"forgectrl",
"src/tls.*"
],
[
"forgectrl",
"src/main.c"
]
],
"fingerprint": "8a4b069ca0cabd9b75e9d936c4ca23e0b307e5ebd9b0bf50e658ae30a17f2716",
"hardware": "api",
"id": "forgectrl.tls-records",
"inherited": false,
"kind": "auto",
"record": {
"answers": [],
"campaign": "c-20261018224638-4ca0",
"duration_s": 5,
"evidence": {
"baseline": {
"post": [],
"pre": []
},
"batch": {
"group": "unattended",
"ts": "2026-10-18T22:46:38Z"
},
"drivers": {
"gcm(aes)": "gcm_base(ctr-aes-caam,cryptd(ghash-ce-sync))",
"rfc7539(chacha20,poly1305)": "rfc7539(chacha20-neon,poly1305-neon)"
},
"fixture": {
"channels": [
"lid",
"interlock",
"button"
],
"hostname": "<REDACTED-1>",
"ip": "<IP-1>",
"released": []
},
"page_bytes": 565725,
"runs": {
"aes-1.2#1": {
"attempts": 2,
"bytes": 565725,
"engine_irqs": 38,
"offer": "ECDHE-ECDSA-AES128-GCM-SHA256",
"same_as_http": true,
"status": "HTTP/1.1 200 OK",
"suite": "ECDHE-ECDSA-AES128-GCM-SHA256",
"tls_stat": {
"TlsDecryptError": 0,
"TlsRxSw": 1,
"TlsTxSw": 1
}
},
"aes-1.2#2": {
"attempts": 2,
"bytes": 565725,
"engine_irqs": 38,
"offer": "ECDHE-ECDSA-AES128-GCM-SHA256",
"same_as_http": true,
"status": "HTTP/1.1 200 OK",
"suite": "ECDHE-ECDSA-AES128-GCM-SHA256",
"tls_stat": {
"TlsDecryptError": 0,
"TlsRxSw": 1,
"TlsTxSw": 1
}
},
"aes-1.2#3": {
"attempts": 1,
"bytes": 565725,
"engine_irqs": 38,
"offer": "ECDHE-ECDSA-AES128-GCM-SHA256",
"same_as_http": true,
"status": "HTTP/1.1 200 OK",
"suite": "ECDHE-ECDSA-AES128-GCM-SHA256",
"tls_stat": {
"TlsDecryptError": 0,
"TlsRxSw": 1,
"TlsTxSw": 1
}
},
"aes-1.3#1": {
"attempts": 3,
"bytes": 565725,
"engine_irqs": 38,
"offer": "TLS_AES_128_GCM_SHA256",
"same_as_http": true,
"status": "HTTP/1.1 200 OK",
"suite": "TLS_AES_128_GCM_SHA256",
"tls_stat": {
"TlsDecryptError": 0,
"TlsRxSw": 1,
"TlsTxSw": 1
}
},
"aes-1.3#2": {
"attempts": 1,
"bytes": 565725,
"engine_irqs": 38,
"offer": "TLS_AES_128_GCM_SHA256",
"same_as_http": true,
"status": "HTTP/1.1 200 OK",
"suite": "TLS_AES_128_GCM_SHA256",
"tls_stat": {
"TlsDecryptError": 0,
"TlsRxSw": 1,
"TlsTxSw": 1
}
},
"aes-1.3#3": {
"attempts": 2,
"bytes": 565725,
"engine_irqs": 38,
"offer": "TLS_AES_128_GCM_SHA256",
"same_as_http": true,
"status": "HTTP/1.1 200 OK",
"suite": "TLS_AES_128_GCM_SHA256",
"tls_stat": {
"TlsDecryptError": 0,
"TlsRxSw": 1,
"TlsTxSw": 1
}
},
"cbc-1.2": {
"attempts": 1,
"bytes": 565725,
"engine_irqs": 0,
"offer": "ECDHE-ECDSA-AES128-SHA",
"same_as_http": true,
"status": "HTTP/1.1 200 OK",
"suite": "ECDHE-ECDSA-AES128-SHA",
"tls_stat": {
"TlsDecryptError": 0,
"TlsRxSw": 0,
"TlsTxSw": 0
}
},
"desktop-1.2": {
"attempts": 1,
"bytes": 565725,
"engine_irqs": 0,
"offer": "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305",
"same_as_http": true,
"status": "HTTP/1.1 200 OK",
"suite": "ECDHE-ECDSA-CHACHA20-POLY1305",
"tls_stat": {
"TlsDecryptError": 0,
"TlsRxSw": 1,
"TlsTxSw": 1
}
},
"desktop-1.3": {
"attempts": 1,
"bytes": 565725,
"engine_irqs": 0,
"offer": "TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256",
"same_as_http": true,
"status": "HTTP/1.1 200 OK",
"suite": "TLS_CHACHA20_POLY1305_SHA256",
"tls_stat": {
"TlsDecryptError": 0,
"TlsRxSw": 1,
"TlsTxSw": 1
}
}
},
"tcp_available_ulp": [
"tls"
]
},
"fingerprint": "8a4b069ca0cabd9b75e9d936c4ca23e0b307e5ebd9b0bf50e658ae30a17f2716",
"image": "20261018222431 (dev)",
"log": [
"23:03:09 start forgectrl.tls-records (auto, api) in campaign c-20261018224638-4ca0",
"23:03:10 fixture up: <REDACTED-1> at <IP-1>, v1.0.0, covers lid, interlock, button",
"23:03:10 fixture: <REDACTED-1> at <IP-1> covers lid, interlock, button",
"23:03:10 queued by the unattended queue opened 2026-10-18T22:46:38Z",
"23:03:10 baseline: pre: clean",
"23:03:10 desktop-1.3: offer TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256 -> TLS_CHACHA20_POLY1305_SHA256, HTTP/1.1 200 OK, 565725 bytes, same True, tls_stat {'TlsTxSw': 1, 'TlsRxSw': 1, 'TlsDecryptError': 0}, 2101000.jr +0",
"23:03:10 desktop-1.2: offer ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305 -> ECDHE-ECDSA-CHACHA20-POLY1305, HTTP/1.1 200 OK, 565725 bytes, same True, tls_stat {'TlsTxSw': 1, 'TlsRxSw': 1, 'TlsDecryptError': 0}, 2101000.jr +0",
"23:03:10 aes-1.3#1: 1 other connection(s) during the window; measured again",
"23:03:11 aes-1.3#1: 1 other connection(s) during the window; measured again",
"23:03:12 aes-1.3#1: offer TLS_AES_128_GCM_SHA256 -> TLS_AES_128_GCM_SHA256, HTTP/1.1 200 OK, 565725 bytes, same True, tls_stat {'TlsTxSw': 1, 'TlsRxSw': 1, 'TlsDecryptError': 0}, 2101000.jr +38",
"23:03:12 aes-1.2#1: 1 other connection(s) during the window; measured again",
"23:03:13 aes-1.2#1: offer ECDHE-ECDSA-AES128-GCM-SHA256 -> ECDHE-ECDSA-AES128-GCM-SHA256, HTTP/1.1 200 OK, 565725 bytes, same True, tls_stat {'TlsTxSw': 1, 'TlsRxSw': 1, 'TlsDecryptError': 0}, 2101000.jr +38",
"23:03:13 aes-1.3#2: offer TLS_AES_128_GCM_SHA256 -> TLS_AES_128_GCM_SHA256, HTTP/1.1 200 OK, 565725 bytes, same True, tls_stat {'TlsTxSw': 1, 'TlsRxSw': 1, 'TlsDecryptError': 0}, 2101000.jr +38",
"23:03:13 aes-1.2#2: 1 other connection(s) during the window; measured again",
"23:03:14 aes-1.2#2: offer ECDHE-ECDSA-AES128-GCM-SHA256 -> ECDHE-ECDSA-AES128-GCM-SHA256, HTTP/1.1 200 OK, 565725 bytes, same True, tls_stat {'TlsTxSw': 1, 'TlsRxSw': 1, 'TlsDecryptError': 0}, 2101000.jr +38",
"23:03:14 aes-1.3#3: 1 other connection(s) during the window; measured again",
"23:03:15 aes-1.3#3: offer TLS_AES_128_GCM_SHA256 -> TLS_AES_128_GCM_SHA256, HTTP/1.1 200 OK, 565725 bytes, same True, tls_stat {'TlsTxSw': 1, 'TlsRxSw': 1, 'TlsDecryptError': 0}, 2101000.jr +38",
"23:03:15 aes-1.2#3: offer ECDHE-ECDSA-AES128-GCM-SHA256 -> ECDHE-ECDSA-AES128-GCM-SHA256, HTTP/1.1 200 OK, 565725 bytes, same True, tls_stat {'TlsTxSw': 1, 'TlsRxSw': 1, 'TlsDecryptError': 0}, 2101000.jr +38",
"23:03:15 cbc-1.2: offer ECDHE-ECDSA-AES128-SHA -> ECDHE-ECDSA-AES128-SHA, HTTP/1.1 200 OK, 565725 bytes, same True, tls_stat {'TlsTxSw': 0, 'TlsRxSw': 0, 'TlsDecryptError': 0}, 2101000.jr +0",
"23:03:15 rfc7539(chacha20,poly1305) is rfc7539(chacha20-neon,poly1305-neon); gcm(aes) is gcm_base(ctr-aes-caam,cryptd(ghash-ce-sync))",
"23:03:15 baseline: post: clean",
"23:03:15 result PASS"
],
"manifest_sha": "70ecd7867c2698d17f2f3c38db772868eda3364f541242c93fb5db4e1d593bcd",
"message": "",
"result": "PASS",
"test": "forgectrl.tls-records",
"ts": "2026-10-18T23:03:15Z"
},
"requires": [],
"satisfied": true,
"source_sha": "89b2b38c8657c63eccb39f517a8b6f69da70c6eaea00779c641ac050375b70c9",
"subsystem": "forgectrl",
"title": "HTTPS: ChaCha20 chosen, records sealed in the kernel"
}
],
"tool_version": "0.1.0"
}