diff --git a/LICENSE b/LICENSE index 976aef1..43e90a9 100644 --- a/LICENSE +++ b/LICENSE @@ -5,5 +5,14 @@ the associated recipe (.bb file) unless otherwise stated. See: COPYING.MIT (MIT) +The code in this repository that is not layer metadata is MIT licensed: + + forgetest/ the release acceptance tool (see forgetest/LICENSE) + scripts/ the release, install and bench scripts + fixture/ the bench actuator firmware, excluding + fixture/managed_components/, which carries its own licenses + +Every file in those directories states MIT in its own header. + License information for any other files is either explicitly stated or defaults to GPL version 2. diff --git a/fixture/fixture.sh b/fixture/fixture.sh index adb7764..cc9a6b9 100644 --- a/fixture/fixture.sh +++ b/fixture/fixture.sh @@ -1,4 +1,8 @@ #!/usr/bin/env bash +# Copyright 2026 514 LLC d/b/a OpenGlow +# Written by Scott Wiederhold +# https://community.openglow.org +# SPDX-License-Identifier: MIT # forgefixture: build, flash and watch the bench actuator's firmware. # # ./fixture.sh env fixture.env from the example, with a fresh API key diff --git a/fixture/main/version.h b/fixture/main/version.h index 907d00f..473c5c8 100644 --- a/fixture/main/version.h +++ b/fixture/main/version.h @@ -1,3 +1,8 @@ +/* + * Copyright 2026 514 LLC d/b/a OpenGlow + * Written by Scott Wiederhold + * SPDX-License-Identifier: MIT + */ /* forgefixture firmware version, reported by GET /. */ #pragma once diff --git a/fixture/test/run.sh b/fixture/test/run.sh index 64e8808..ec7030a 100644 --- a/fixture/test/run.sh +++ b/fixture/test/run.sh @@ -1,4 +1,8 @@ #!/bin/sh +# Copyright 2026 514 LLC d/b/a OpenGlow +# Written by Scott Wiederhold +# https://community.openglow.org +# SPDX-License-Identifier: MIT # The host test of the fixture's policy: needs only a C compiler. set -e cd "$(dirname "$0")" diff --git a/forgetest/LICENSE b/forgetest/LICENSE new file mode 100644 index 0000000..d509891 --- /dev/null +++ b/forgetest/LICENSE @@ -0,0 +1,23 @@ +ForgeFIRM release acceptance tool (forgetest/) and the bench scripts it +drives (scripts/bench/). + +Copyright 2026 514 LLC d/b/a OpenGlow +Written by Scott Wiederhold + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished +to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/forgetest/forgetest.init b/forgetest/forgetest.init index ab6ca6a..a582981 100644 --- a/forgetest/forgetest.init +++ b/forgetest/forgetest.init @@ -1,4 +1,8 @@ #!/bin/sh +# Copyright 2026 514 LLC d/b/a OpenGlow +# Written by Scott Wiederhold +# https://community.openglow.org +# SPDX-License-Identifier: MIT ### BEGIN INIT INFO # Provides: forgetest # Required-Start: $network forgectrl diff --git a/forgetest/forgetest/__init__.py b/forgetest/forgetest/__init__.py index 62995fc..b4d2c6e 100644 --- a/forgetest/forgetest/__init__.py +++ b/forgetest/forgetest/__init__.py @@ -1,3 +1,8 @@ +# Copyright 2026 514 LLC d/b/a OpenGlow +# Written by Scott Wiederhold +# https://community.openglow.org +# SPDX-License-Identifier: MIT + """forgetest - the ForgeFIRM release acceptance tool. A daemon on the dev image (HTTP :8090) that runs the acceptance catalog diff --git a/forgetest/forgetest/__main__.py b/forgetest/forgetest/__main__.py index 2e70a23..45688ce 100644 --- a/forgetest/forgetest/__main__.py +++ b/forgetest/forgetest/__main__.py @@ -1,3 +1,8 @@ +# Copyright 2026 514 LLC d/b/a OpenGlow +# Written by Scott Wiederhold +# https://community.openglow.org +# SPDX-License-Identifier: MIT + """forgetest daemon entry point. python3 -m forgetest [--port 8090] [--host ::] [--manifest PATH] diff --git a/forgetest/forgetest/artifact.py b/forgetest/forgetest/artifact.py index ab9518f..c986309 100644 --- a/forgetest/forgetest/artifact.py +++ b/forgetest/forgetest/artifact.py @@ -1,3 +1,8 @@ +# Copyright 2026 514 LLC d/b/a OpenGlow +# Written by Scott Wiederhold +# https://community.openglow.org +# SPDX-License-Identifier: MIT + """The release artifact (acceptance.json / acceptance.md) and its verification. The exporter serializes the campaign state with, for every catalog test, diff --git a/forgetest/forgetest/baseline.py b/forgetest/forgetest/baseline.py index 119277e..1157f35 100644 --- a/forgetest/forgetest/baseline.py +++ b/forgetest/forgetest/baseline.py @@ -1,3 +1,8 @@ +# Copyright 2026 514 LLC d/b/a OpenGlow +# Written by Scott Wiederhold +# https://community.openglow.org +# SPDX-License-Identifier: MIT + """The fresh-boot idle state: what every test starts from and leaves behind. The runner checks the machine against this baseline before a run and diff --git a/forgetest/forgetest/bench.py b/forgetest/forgetest/bench.py index c283f9b..8462d75 100644 --- a/forgetest/forgetest/bench.py +++ b/forgetest/forgetest/bench.py @@ -1,3 +1,8 @@ +# Copyright 2026 514 LLC d/b/a OpenGlow +# Written by Scott Wiederhold +# https://community.openglow.org +# SPDX-License-Identifier: MIT + """The bench diagnostics page: registry of the bench tools and the subprocess runner behind the #bench tab. diff --git a/forgetest/forgetest/campaign.py b/forgetest/forgetest/campaign.py index 94b1fdc..0e937d9 100644 --- a/forgetest/forgetest/campaign.py +++ b/forgetest/forgetest/campaign.py @@ -1,3 +1,8 @@ +# Copyright 2026 514 LLC d/b/a OpenGlow +# Written by Scott Wiederhold +# https://community.openglow.org +# SPDX-License-Identifier: MIT + """Campaign rules: which results apply, what is required, and whether a release is authorized. diff --git a/forgetest/forgetest/catalog.py b/forgetest/forgetest/catalog.py index 27dd283..4fcf183 100644 --- a/forgetest/forgetest/catalog.py +++ b/forgetest/forgetest/catalog.py @@ -1,3 +1,8 @@ +# Copyright 2026 514 LLC d/b/a OpenGlow +# Written by Scott Wiederhold +# https://community.openglow.org +# SPDX-License-Identifier: MIT + """The acceptance catalog: test definitions and the registry. A test is a function decorated with @test(...). The decorator records diff --git a/forgetest/forgetest/coverage.py b/forgetest/forgetest/coverage.py index f51917e..343e336 100644 --- a/forgetest/forgetest/coverage.py +++ b/forgetest/forgetest/coverage.py @@ -1,3 +1,8 @@ +# Copyright 2026 514 LLC d/b/a OpenGlow +# Written by Scott Wiederhold +# https://community.openglow.org +# SPDX-License-Identifier: MIT + """Coverage lint: every source path in the manifest must be selected by some test's coverage globs, except the allowlisted non-behavioral paths, and every coverage glob must select at least one path of its component. diff --git a/forgetest/forgetest/fixture.py b/forgetest/forgetest/fixture.py index 4bfe5ed..e57aa91 100644 --- a/forgetest/forgetest/fixture.py +++ b/forgetest/forgetest/fixture.py @@ -1,3 +1,8 @@ +# Copyright 2026 514 LLC d/b/a OpenGlow +# Written by Scott Wiederhold +# https://community.openglow.org +# SPDX-License-Identifier: MIT + """The bench actuator (forgefixture): the box on the bench network that opens the lid loop, pulls the interlock loop and presses the button on request, so an operator test can run with nobody in the room. diff --git a/forgetest/forgetest/hw.py b/forgetest/forgetest/hw.py index 4710ad1..1259d46 100644 --- a/forgetest/forgetest/hw.py +++ b/forgetest/forgetest/hw.py @@ -1,3 +1,8 @@ +# Copyright 2026 514 LLC d/b/a OpenGlow +# Written by Scott Wiederhold +# https://community.openglow.org +# SPDX-License-Identifier: MIT + """Hardware and service access for the suite: forgectrl's HTTP API, the kernel module's sysfs, the init scripts, and the Grbl TCP port. diff --git a/forgetest/forgetest/log.py b/forgetest/forgetest/log.py index 27e8c27..8df1445 100644 --- a/forgetest/forgetest/log.py +++ b/forgetest/forgetest/log.py @@ -1,3 +1,8 @@ +# Copyright 2026 514 LLC d/b/a OpenGlow +# Written by Scott Wiederhold +# https://community.openglow.org +# SPDX-License-Identifier: MIT + """The append-only result log (JSONL) and the export helpers. One JSON object per line under the data directory (default diff --git a/forgetest/forgetest/manifest.py b/forgetest/forgetest/manifest.py index 6c50ec0..aecb3cf 100644 --- a/forgetest/forgetest/manifest.py +++ b/forgetest/forgetest/manifest.py @@ -1,3 +1,8 @@ +# Copyright 2026 514 LLC d/b/a OpenGlow +# Written by Scott Wiederhold +# https://community.openglow.org +# SPDX-License-Identifier: MIT + """The image manifest and the domain fingerprint. /etc/forgefirm-manifest.json (written by forgefirm-image-manifest.bbclass) diff --git a/forgetest/forgetest/page.py b/forgetest/forgetest/page.py index 82ce538..c6c3579 100644 --- a/forgetest/forgetest/page.py +++ b/forgetest/forgetest/page.py @@ -1,3 +1,8 @@ +# Copyright 2026 514 LLC d/b/a OpenGlow +# Written by Scott Wiederhold +# https://community.openglow.org +# SPDX-License-Identifier: MIT + """The single page: acceptance tab + bench tab, assembled from ui/ into one self-contained response (no external assets). Bootstrap and the OpenGlow theme are inlined; theme.css and the vendor/ files are the same diff --git a/forgetest/forgetest/puls.py b/forgetest/forgetest/puls.py index b15fa78..07bf06d 100644 --- a/forgetest/forgetest/puls.py +++ b/forgetest/forgetest/puls.py @@ -1,3 +1,8 @@ +# Copyright 2026 514 LLC d/b/a OpenGlow +# Written by Scott Wiederhold +# https://community.openglow.org +# SPDX-License-Identifier: MIT + """Pulse files for the offline cloud service: a job the machine will run without the service having cut it. diff --git a/forgetest/forgetest/runner.py b/forgetest/forgetest/runner.py index 7f50b82..85b4f87 100644 --- a/forgetest/forgetest/runner.py +++ b/forgetest/forgetest/runner.py @@ -1,3 +1,8 @@ +# Copyright 2026 514 LLC d/b/a OpenGlow +# Written by Scott Wiederhold +# https://community.openglow.org +# SPDX-License-Identifier: MIT + """The runner: executes one acceptance test or one bench tool at a time. Acceptance tests run in a worker thread with a Context: log lines, an diff --git a/forgetest/forgetest/server.py b/forgetest/forgetest/server.py index dd8eca7..70d3bc5 100644 --- a/forgetest/forgetest/server.py +++ b/forgetest/forgetest/server.py @@ -1,3 +1,8 @@ +# Copyright 2026 514 LLC d/b/a OpenGlow +# Written by Scott Wiederhold +# https://community.openglow.org +# SPDX-License-Identifier: MIT + """HTTP: the page, the JSON API, and the access rules. Access follows forgectrl's panel (auth.c): the Host header must be an diff --git a/forgetest/forgetest/suite/__init__.py b/forgetest/forgetest/suite/__init__.py index 7aaacb4..74c7930 100644 --- a/forgetest/forgetest/suite/__init__.py +++ b/forgetest/forgetest/suite/__init__.py @@ -1,3 +1,8 @@ +# Copyright 2026 514 LLC d/b/a OpenGlow +# Written by Scott Wiederhold +# https://community.openglow.org +# SPDX-License-Identifier: MIT + """The acceptance suite: one module per subsystem, imported in display order. Each module registers its tests with @catalog.test.""" diff --git a/forgetest/forgetest/suite/camera.py b/forgetest/forgetest/suite/camera.py index d2eba7a..997a4b1 100644 --- a/forgetest/forgetest/suite/camera.py +++ b/forgetest/forgetest/suite/camera.py @@ -1,3 +1,8 @@ +# Copyright 2026 514 LLC d/b/a OpenGlow +# Written by Scott Wiederhold +# https://community.openglow.org +# SPDX-License-Identifier: MIT + """camera.* - the lid camera pipeline through forgectrl.""" import json diff --git a/forgetest/forgetest/suite/cloud.py b/forgetest/forgetest/suite/cloud.py index 1c16e6b..3fe7c27 100644 --- a/forgetest/forgetest/suite/cloud.py +++ b/forgetest/forgetest/suite/cloud.py @@ -1,3 +1,8 @@ +# Copyright 2026 514 LLC d/b/a OpenGlow +# Written by Scott Wiederhold +# https://community.openglow.org +# SPDX-License-Identifier: MIT + """cloud.* - the controller mode switch and the optional Glowforge web-service mode (gfcloud daemon, gfhome homing runner). The mode-switch test makes the grbl -> cloud -> grbl round trip with the connect-time hunt run lid-open and diff --git a/forgetest/forgetest/suite/cooling.py b/forgetest/forgetest/suite/cooling.py index 3932c96..d655654 100644 --- a/forgetest/forgetest/suite/cooling.py +++ b/forgetest/forgetest/suite/cooling.py @@ -1,3 +1,8 @@ +# Copyright 2026 514 LLC d/b/a OpenGlow +# Written by Scott Wiederhold +# https://community.openglow.org +# SPDX-License-Identifier: MIT + """cooling.* - the cooling engine: flow verification through forgectrl's diagnostics runner (the same check the fire gate runs), the fan profile returning to idle after motion, the gate settings (a value inside the diff --git a/forgetest/forgetest/suite/forgectrl.py b/forgetest/forgetest/suite/forgectrl.py index f5f84f5..76b22f1 100644 --- a/forgetest/forgetest/suite/forgectrl.py +++ b/forgetest/forgetest/suite/forgectrl.py @@ -1,3 +1,8 @@ +# Copyright 2026 514 LLC d/b/a OpenGlow +# Written by Scott Wiederhold +# https://community.openglow.org +# SPDX-License-Identifier: MIT + """forgectrl.* - the machine-services daemon's API, access control, and panel.""" import json import os diff --git a/forgetest/forgetest/suite/image.py b/forgetest/forgetest/suite/image.py index 9465626..a31318b 100644 --- a/forgetest/forgetest/suite/image.py +++ b/forgetest/forgetest/suite/image.py @@ -1,3 +1,8 @@ +# Copyright 2026 514 LLC d/b/a OpenGlow +# Written by Scott Wiederhold +# https://community.openglow.org +# SPDX-License-Identifier: MIT + """image.* - the post-flash health of the running image (always-required).""" import glob import gzip diff --git a/forgetest/forgetest/suite/kernel.py b/forgetest/forgetest/suite/kernel.py index 2c0ecf2..3df2be1 100644 --- a/forgetest/forgetest/suite/kernel.py +++ b/forgetest/forgetest/suite/kernel.py @@ -1,3 +1,8 @@ +# Copyright 2026 514 LLC d/b/a OpenGlow +# Written by Scott Wiederhold +# https://community.openglow.org +# SPDX-License-Identifier: MIT + """kernel.* - glowforge.ko safety readbacks and the pulse-engine drills. The drills are the bench scripts `scripts/bench/gate_a_kernel_drills.py` diff --git a/forgetest/forgetest/suite/laser.py b/forgetest/forgetest/suite/laser.py index 713021d..783ce75 100644 --- a/forgetest/forgetest/suite/laser.py +++ b/forgetest/forgetest/suite/laser.py @@ -1,3 +1,8 @@ +# Copyright 2026 514 LLC d/b/a OpenGlow +# Written by Scott Wiederhold +# https://community.openglow.org +# SPDX-License-Identifier: MIT + """laser.* - LIVE laser tests, ported from `scripts/bench/live_fire_drills.py`. Every test here can emit, except `laser.power-floor`, which only reads diff --git a/forgetest/forgetest/suite/logs.py b/forgetest/forgetest/suite/logs.py index f7d30c4..f674bf3 100644 --- a/forgetest/forgetest/suite/logs.py +++ b/forgetest/forgetest/suite/logs.py @@ -1,3 +1,8 @@ +# Copyright 2026 514 LLC d/b/a OpenGlow +# Written by Scott Wiederhold +# https://community.openglow.org +# SPDX-License-Identifier: MIT + """logs.* - unified logging: the log tree, tail, and the sanitized export; the routing path (emitters, relays, rendered rules); the level settings.""" import gzip diff --git a/forgetest/forgetest/suite/motion.py b/forgetest/forgetest/suite/motion.py index d569c97..6cfd1d1 100644 --- a/forgetest/forgetest/suite/motion.py +++ b/forgetest/forgetest/suite/motion.py @@ -1,3 +1,8 @@ +# Copyright 2026 514 LLC d/b/a OpenGlow +# Written by Scott Wiederhold +# https://community.openglow.org +# SPDX-License-Identifier: MIT + """motion.* - the motion controller under grblHAL: dry motion, no emission. Ported from `scripts/bench/pacing_test.py` (protocol-loop pacing) and diff --git a/forgetest/forgetest/suite/setup.py b/forgetest/forgetest/suite/setup.py index 507f2f7..a782d8f 100644 --- a/forgetest/forgetest/suite/setup.py +++ b/forgetest/forgetest/suite/setup.py @@ -1,3 +1,8 @@ +# Copyright 2026 514 LLC d/b/a OpenGlow +# Written by Scott Wiederhold +# https://community.openglow.org +# SPDX-License-Identifier: MIT + """setup.* - the first-run setup: the record and the controller gate, the advisories, the account and its login, the HTTPS boundary, SSH, the cloud switch, the machine's name, and the factory diff --git a/forgetest/forgetest/suite/setup_dark.py b/forgetest/forgetest/suite/setup_dark.py index 43d21fd..64f4cf3 100644 --- a/forgetest/forgetest/suite/setup_dark.py +++ b/forgetest/forgetest/suite/setup_dark.py @@ -1,3 +1,8 @@ +# Copyright 2026 514 LLC d/b/a OpenGlow +# Written by Scott Wiederhold +# https://community.openglow.org +# SPDX-License-Identifier: MIT + """setup.check-* - the setup's checks (the dark wizards), driven the way the page drives them: POST /wiz//start, GET /wiz/dark polled, the prompts answered from here (the bench fixture works the lid and the diff --git a/forgetest/forgetest/suite/setup_sheet.py b/forgetest/forgetest/suite/setup_sheet.py index 0f549d7..26e6d1a 100644 --- a/forgetest/forgetest/suite/setup_sheet.py +++ b/forgetest/forgetest/suite/setup_sheet.py @@ -1,3 +1,8 @@ +# Copyright 2026 514 LLC d/b/a OpenGlow +# Written by Scott Wiederhold +# https://community.openglow.org +# SPDX-License-Identifier: MIT + """setup.sheet - the setup's sheet (the live wizards) in one run, driven the way the page drives them: POST /wiz//start, GET /wiz/dark polled, the prompts answered from here, each burn armed by a press, the diff --git a/forgetest/forgetest/suite/update.py b/forgetest/forgetest/suite/update.py index e67e3fd..fc313a1 100644 --- a/forgetest/forgetest/suite/update.py +++ b/forgetest/forgetest/suite/update.py @@ -1,3 +1,8 @@ +# Copyright 2026 514 LLC d/b/a OpenGlow +# Written by Scott Wiederhold +# https://community.openglow.org +# SPDX-License-Identifier: MIT + """update.* - the A/B slot inventory and the firmware verification path.""" import os import re diff --git a/forgetest/tests/helpers.py b/forgetest/tests/helpers.py index 863648c..5c59750 100644 --- a/forgetest/tests/helpers.py +++ b/forgetest/tests/helpers.py @@ -1,3 +1,8 @@ +# Copyright 2026 514 LLC d/b/a OpenGlow +# Written by Scott Wiederhold +# https://community.openglow.org +# SPDX-License-Identifier: MIT + """Shared fixtures for the forgetest unit tests: synthetic manifests and catalog entries that never touch hardware.""" import hashlib diff --git a/forgetest/tests/test_artifact.py b/forgetest/tests/test_artifact.py index 2cd44eb..f889f77 100644 --- a/forgetest/tests/test_artifact.py +++ b/forgetest/tests/test_artifact.py @@ -1,3 +1,8 @@ +# Copyright 2026 514 LLC d/b/a OpenGlow +# Written by Scott Wiederhold +# https://community.openglow.org +# SPDX-License-Identifier: MIT + import copy import json import unittest diff --git a/forgetest/tests/test_baseline.py b/forgetest/tests/test_baseline.py index 025b4ef..3a280a0 100644 --- a/forgetest/tests/test_baseline.py +++ b/forgetest/tests/test_baseline.py @@ -1,3 +1,8 @@ +# Copyright 2026 514 LLC d/b/a OpenGlow +# Written by Scott Wiederhold +# https://community.openglow.org +# SPDX-License-Identifier: MIT + """The baseline: fixed resting values are restored, preserved values are handed back, every deviation is a recorded leftover. Runs against a fake sysfs tree; forgectrl is unreachable (service-side checks skip).""" diff --git a/forgetest/tests/test_bench_registry.py b/forgetest/tests/test_bench_registry.py index bd7eed3..bbb80d1 100644 --- a/forgetest/tests/test_bench_registry.py +++ b/forgetest/tests/test_bench_registry.py @@ -1,3 +1,8 @@ +# Copyright 2026 514 LLC d/b/a OpenGlow +# Written by Scott Wiederhold +# https://community.openglow.org +# SPDX-License-Identifier: MIT + """The bench registry against scripts/bench: every python tool is registered (or named as not-a-tool), every registered script exists, every argument spec builds a command line, every script compiles, and diff --git a/forgetest/tests/test_campaign.py b/forgetest/tests/test_campaign.py index 74b5f71..c9c4f84 100644 --- a/forgetest/tests/test_campaign.py +++ b/forgetest/tests/test_campaign.py @@ -1,3 +1,8 @@ +# Copyright 2026 514 LLC d/b/a OpenGlow +# Written by Scott Wiederhold +# https://community.openglow.org +# SPDX-License-Identifier: MIT + import unittest import helpers diff --git a/forgetest/tests/test_cloud_needles.py b/forgetest/tests/test_cloud_needles.py index e48bf71..175725a 100644 --- a/forgetest/tests/test_cloud_needles.py +++ b/forgetest/tests/test_cloud_needles.py @@ -1,3 +1,8 @@ +# Copyright 2026 514 LLC d/b/a OpenGlow +# Written by Scott Wiederhold +# https://community.openglow.org +# SPDX-License-Identifier: MIT + """Every phrase the cloud suite greps for in the gfcloud log must be a phrase the pinned cloud app can actually log. diff --git a/forgetest/tests/test_cloud_suite.py b/forgetest/tests/test_cloud_suite.py index 7e245e9..92c6ebf 100644 --- a/forgetest/tests/test_cloud_suite.py +++ b/forgetest/tests/test_cloud_suite.py @@ -1,3 +1,8 @@ +# Copyright 2026 514 LLC d/b/a OpenGlow +# Written by Scott Wiederhold +# https://community.openglow.org +# SPDX-License-Identifier: MIT + """The cloud.* job-behavior tests against a fake forgectrl and a replayed gfcloud log: the real test functions run under the real runner Context, the operator prompts answered - and the standing notices of the machine diff --git a/forgetest/tests/test_cooling_order.py b/forgetest/tests/test_cooling_order.py index e0f92ba..21ce89e 100644 --- a/forgetest/tests/test_cooling_order.py +++ b/forgetest/tests/test_cooling_order.py @@ -1,3 +1,8 @@ +# Copyright 2026 514 LLC d/b/a OpenGlow +# Written by Scott Wiederhold +# https://community.openglow.org +# SPDX-License-Identifier: MIT + """cooling.aa-offset-calibrate is registered before the heater tools, so a queue runs it first: a heater trial leaves a warm slug circulating past the coolant sensors for minutes, and the tool's edges read it as diff --git a/forgetest/tests/test_cooling_suite.py b/forgetest/tests/test_cooling_suite.py index 3b83381..e72671a 100644 --- a/forgetest/tests/test_cooling_suite.py +++ b/forgetest/tests/test_cooling_suite.py @@ -1,3 +1,8 @@ +# Copyright 2026 514 LLC d/b/a OpenGlow +# Written by Scott Wiederhold +# https://community.openglow.org +# SPDX-License-Identifier: MIT + """cooling.fans-quiet-after-motion and cooling.gate-off replayed host-side under the real runner Context against a scripted machine: a fake forgectrl (/status fans, /cool/status phase and verdict, /settings with diff --git a/forgetest/tests/test_fixture.py b/forgetest/tests/test_fixture.py index c19685d..d0ce37a 100644 --- a/forgetest/tests/test_fixture.py +++ b/forgetest/tests/test_fixture.py @@ -1,3 +1,8 @@ +# Copyright 2026 514 LLC d/b/a OpenGlow +# Written by Scott Wiederhold +# https://community.openglow.org +# SPDX-License-Identifier: MIT + """The bench actuator as the tool sees it. The fixture is a box on the network that opens the lid loop, pulls the diff --git a/forgetest/tests/test_image.py b/forgetest/tests/test_image.py index 223948f..74b8b16 100644 --- a/forgetest/tests/test_image.py +++ b/forgetest/tests/test_image.py @@ -1,3 +1,8 @@ +# Copyright 2026 514 LLC d/b/a OpenGlow +# Written by Scott Wiederhold +# https://community.openglow.org +# SPDX-License-Identifier: MIT + import unittest from forgetest.suite import image diff --git a/forgetest/tests/test_kernel_suite.py b/forgetest/tests/test_kernel_suite.py index 48805d6..75de351 100644 --- a/forgetest/tests/test_kernel_suite.py +++ b/forgetest/tests/test_kernel_suite.py @@ -1,3 +1,8 @@ +# Copyright 2026 514 LLC d/b/a OpenGlow +# Written by Scott Wiederhold +# https://community.openglow.org +# SPDX-License-Identifier: MIT + """wait_hv_off against a scripted charge-pump readback: a chain that releases inside the window passes, a chain held past it is the refusal, and a chain already off costs no wait.""" diff --git a/forgetest/tests/test_laser_dwell.py b/forgetest/tests/test_laser_dwell.py index 0a3c4b1..40be7e4 100644 --- a/forgetest/tests/test_laser_dwell.py +++ b/forgetest/tests/test_laser_dwell.py @@ -1,3 +1,8 @@ +# Copyright 2026 514 LLC d/b/a OpenGlow +# Written by Scott Wiederhold +# https://community.openglow.org +# SPDX-License-Identifier: MIT + """The dwell-gap verdict of laser.emission-witness over synthetic trails: the button latch judged from the first emission through every sample whose readback word shows the laser latch unlocked, both bits from that diff --git a/forgetest/tests/test_manifest.py b/forgetest/tests/test_manifest.py index 42c4739..87e9c33 100644 --- a/forgetest/tests/test_manifest.py +++ b/forgetest/tests/test_manifest.py @@ -1,3 +1,8 @@ +# Copyright 2026 514 LLC d/b/a OpenGlow +# Written by Scott Wiederhold +# https://community.openglow.org +# SPDX-License-Identifier: MIT + import os import unittest diff --git a/forgetest/tests/test_mode.py b/forgetest/tests/test_mode.py index 40f85da..afe7ecf 100644 --- a/forgetest/tests/test_mode.py +++ b/forgetest/tests/test_mode.py @@ -1,3 +1,8 @@ +# Copyright 2026 514 LLC d/b/a OpenGlow +# Written by Scott Wiederhold +# https://community.openglow.org +# SPDX-License-Identifier: MIT + """The controller mode a test declares: the runner puts the machine there before the test and the baseline keeps it there afterward. diff --git a/forgetest/tests/test_operator.py b/forgetest/tests/test_operator.py index 9dd16a0..24805b5 100644 --- a/forgetest/tests/test_operator.py +++ b/forgetest/tests/test_operator.py @@ -1,3 +1,8 @@ +# Copyright 2026 514 LLC d/b/a OpenGlow +# Written by Scott Wiederhold +# https://community.openglow.org +# SPDX-License-Identifier: MIT + """The operator channel: notices, `ready`, `act`, and the precheck. A test asks for the operator's part in a way the page can show before diff --git a/forgetest/tests/test_page.py b/forgetest/tests/test_page.py index 019d29c..36aaef2 100644 --- a/forgetest/tests/test_page.py +++ b/forgetest/tests/test_page.py @@ -1,3 +1,8 @@ +# Copyright 2026 514 LLC d/b/a OpenGlow +# Written by Scott Wiederhold +# https://community.openglow.org +# SPDX-License-Identifier: MIT + """The page assembly: the ui/ files inlined in order, the gzipped install (what the dev image carries) assembling to the same bytes as a checkout, the token placeholder carried exactly once, and a missing marker refused diff --git a/forgetest/tests/test_queue.py b/forgetest/tests/test_queue.py index 591209f..b524e3d 100644 --- a/forgetest/tests/test_queue.py +++ b/forgetest/tests/test_queue.py @@ -1,3 +1,8 @@ +# Copyright 2026 514 LLC d/b/a OpenGlow +# Written by Scott Wiederhold +# https://community.openglow.org +# SPDX-License-Identifier: MIT + """The two queues: what they select, the order they run in, and where they stop. diff --git a/forgetest/tests/test_responsiveness.py b/forgetest/tests/test_responsiveness.py index eae0239..9dc091b 100644 --- a/forgetest/tests/test_responsiveness.py +++ b/forgetest/tests/test_responsiveness.py @@ -1,3 +1,8 @@ +# Copyright 2026 514 LLC d/b/a OpenGlow +# Written by Scott Wiederhold +# https://community.openglow.org +# SPDX-License-Identifier: MIT + """What keeps the page answering the operator instead of the timer. Two things went wrong on the bench and are pinned here: diff --git a/forgetest/tests/test_server.py b/forgetest/tests/test_server.py index c9e2988..85ea539 100644 --- a/forgetest/tests/test_server.py +++ b/forgetest/tests/test_server.py @@ -1,3 +1,8 @@ +# Copyright 2026 514 LLC d/b/a OpenGlow +# Written by Scott Wiederhold +# https://community.openglow.org +# SPDX-License-Identifier: MIT + """Runner + HTTP API end to end on localhost with a fake catalog and a fake bench tool. No hardware, no forgectrl.""" import json diff --git a/forgetest/tests/test_setup_dark.py b/forgetest/tests/test_setup_dark.py index 13e3053..8bbdad3 100644 --- a/forgetest/tests/test_setup_dark.py +++ b/forgetest/tests/test_setup_dark.py @@ -1,3 +1,8 @@ +# Copyright 2026 514 LLC d/b/a OpenGlow +# Written by Scott Wiederhold +# https://community.openglow.org +# SPDX-License-Identifier: MIT + """The setup's checks in the catalog: registered as automatic tests with no precheck, the takeover ones marked so, every covers map naming the check runner; and the check driver itself against the fake daemon: a diff --git a/forgetest/tests/test_setup_sheet.py b/forgetest/tests/test_setup_sheet.py index 40906d5..45d0f34 100644 --- a/forgetest/tests/test_setup_sheet.py +++ b/forgetest/tests/test_setup_sheet.py @@ -1,3 +1,8 @@ +# Copyright 2026 514 LLC d/b/a OpenGlow +# Written by Scott Wiederhold +# https://community.openglow.org +# SPDX-License-Identifier: MIT + """The setup's sheet in the catalog: one live test on the button with a piece of wood at hand, its covers map naming the live runner, the renderer, the sender, the page, and the driver's laser module; and the diff --git a/forgetest/tests/test_setup_suite.py b/forgetest/tests/test_setup_suite.py index b3fe890..2412b85 100644 --- a/forgetest/tests/test_setup_suite.py +++ b/forgetest/tests/test_setup_suite.py @@ -1,3 +1,8 @@ +# Copyright 2026 514 LLC d/b/a OpenGlow +# Written by Scott Wiederhold +# https://community.openglow.org +# SPDX-License-Identifier: MIT + """The setup.* suite on the host: the registration (ids, kinds, the takeover tests, the operator tests' hands), the record builders, the machine's name, the cookie parsing, the LED cue, the settle rule for a diff --git a/forgetest/tests/test_source_bundle.py b/forgetest/tests/test_source_bundle.py index 8938978..0b50dec 100644 --- a/forgetest/tests/test_source_bundle.py +++ b/forgetest/tests/test_source_bundle.py @@ -1,3 +1,8 @@ +# Copyright 2026 514 LLC d/b/a OpenGlow +# Written by Scott Wiederhold +# https://community.openglow.org +# SPDX-License-Identifier: MIT + """scripts/source-bundle.py - the source that a release publishes. The bundle must hold the source of every recipe of the image whose license diff --git a/forgetest/tests/test_tree_manifest.py b/forgetest/tests/test_tree_manifest.py index 87c5b05..4c67519 100644 --- a/forgetest/tests/test_tree_manifest.py +++ b/forgetest/tests/test_tree_manifest.py @@ -1,3 +1,8 @@ +# Copyright 2026 514 LLC d/b/a OpenGlow +# Written by Scott Wiederhold +# https://community.openglow.org +# SPDX-License-Identifier: MIT + """scripts/manifest-from-tree.py - the workstation/CI mirror of the image manifest: recipe pins are read through their pin files, and a layer's content hash leaves the pin files out (a component bump is not a platform diff --git a/meta-forgefirm/classes/forgefirm-image-manifest.bbclass b/meta-forgefirm/classes/forgefirm-image-manifest.bbclass index 70e4667..138f3bb 100644 --- a/meta-forgefirm/classes/forgefirm-image-manifest.bbclass +++ b/meta-forgefirm/classes/forgefirm-image-manifest.bbclass @@ -1,3 +1,5 @@ +# SPDX-License-Identifier: MIT + # forgefirm-image-manifest.bbclass - assemble /etc/forgefirm-manifest.json # # Inherited by the ForgeFIRM images. At rootfs postprocess it collects the diff --git a/meta-forgefirm/classes/forgefirm-manifest.bbclass b/meta-forgefirm/classes/forgefirm-manifest.bbclass index 3698d2d..f94b53f 100644 --- a/meta-forgefirm/classes/forgefirm-manifest.bbclass +++ b/meta-forgefirm/classes/forgefirm-manifest.bbclass @@ -1,3 +1,5 @@ +# SPDX-License-Identifier: MIT + # forgefirm-manifest.bbclass - source fingerprint of one ForgeFIRM component # # A component recipe that inherits this class records what source it was diff --git a/meta-forgefirm/conf/distro/forgefirm.conf b/meta-forgefirm/conf/distro/forgefirm.conf index 554a70b..e8a3186 100644 --- a/meta-forgefirm/conf/distro/forgefirm.conf +++ b/meta-forgefirm/conf/distro/forgefirm.conf @@ -1,3 +1,5 @@ +# SPDX-License-Identifier: MIT + require conf/distro/include/fslc-base.inc DISTRO = "forgefirm" diff --git a/meta-forgefirm/conf/layer.conf b/meta-forgefirm/conf/layer.conf index b9d7c63..0f25de3 100644 --- a/meta-forgefirm/conf/layer.conf +++ b/meta-forgefirm/conf/layer.conf @@ -1,3 +1,5 @@ +# SPDX-License-Identifier: MIT + # We have a conf and classes directory, add to BBPATH BBPATH .= ":${LAYERDIR}" diff --git a/meta-forgefirm/recipes-bsp/firmware-imx/firmware-imx_%.bbappend b/meta-forgefirm/recipes-bsp/firmware-imx/firmware-imx_%.bbappend index fef16b6..71ee91e 100644 --- a/meta-forgefirm/recipes-bsp/firmware-imx/firmware-imx_%.bbappend +++ b/meta-forgefirm/recipes-bsp/firmware-imx/firmware-imx_%.bbappend @@ -1,3 +1,5 @@ +# SPDX-License-Identifier: MIT + # NXP distributes the i.MX VPU/EPDC firmware blobs under its firmware EULA # (accepted with ACCEPT_FSL_EULA), so an image carrying those blobs has to # carry the license text with them. diff --git a/meta-forgefirm/recipes-connectivity/openssh/openssh_%.bbappend b/meta-forgefirm/recipes-connectivity/openssh/openssh_%.bbappend index d0e8c0b..d9136dc 100644 --- a/meta-forgefirm/recipes-connectivity/openssh/openssh_%.bbappend +++ b/meta-forgefirm/recipes-connectivity/openssh/openssh_%.bbappend @@ -1,3 +1,5 @@ +# SPDX-License-Identifier: MIT + # ForgeFIRM SSH policy, set in the installed files so the release image # carries it as built: # PermitRootLogin no root logs in at the serial console only diff --git a/meta-forgefirm/recipes-devtools/python/python3-gfhardware.bbappend b/meta-forgefirm/recipes-devtools/python/python3-gfhardware.bbappend index f718cca..4c9a257 100644 --- a/meta-forgefirm/recipes-devtools/python/python3-gfhardware.bbappend +++ b/meta-forgefirm/recipes-devtools/python/python3-gfhardware.bbappend @@ -1,3 +1,5 @@ +# SPDX-License-Identifier: MIT + # ForgeFIRM image manifest: source fingerprint of the hardware library # (forgefirm-manifest.bbclass in this layer). inherit forgefirm-manifest diff --git a/meta-forgefirm/recipes-devtools/python/python3-gfutilities_%.bbappend b/meta-forgefirm/recipes-devtools/python/python3-gfutilities_%.bbappend index dc2632a..b0d37a5 100644 --- a/meta-forgefirm/recipes-devtools/python/python3-gfutilities_%.bbappend +++ b/meta-forgefirm/recipes-devtools/python/python3-gfutilities_%.bbappend @@ -1,3 +1,5 @@ +# SPDX-License-Identifier: MIT + # ForgeFIRM image manifest: source fingerprint of the cloud-mode service # layer (forgefirm-manifest.bbclass in this layer). inherit forgefirm-manifest diff --git a/meta-forgefirm/recipes-devtools/python/python3-urllib3_%.bbappend b/meta-forgefirm/recipes-devtools/python/python3-urllib3_%.bbappend index 0da5944..fd9e629 100644 --- a/meta-forgefirm/recipes-devtools/python/python3-urllib3_%.bbappend +++ b/meta-forgefirm/recipes-devtools/python/python3-urllib3_%.bbappend @@ -1,3 +1,5 @@ +# SPDX-License-Identifier: MIT + # urllib3's optional pyOpenSSL/cryptography backend is not used here: the cloud # client and the machine glue talk TLS through the standard library's ssl # module (nothing imports OpenSSL or cryptography). Dropping the two runtime diff --git a/meta-forgefirm/recipes-extended/fwup/fwup_1.16.0.bb b/meta-forgefirm/recipes-extended/fwup/fwup_1.16.0.bb index 987c244..787dc29 100644 --- a/meta-forgefirm/recipes-extended/fwup/fwup_1.16.0.bb +++ b/meta-forgefirm/recipes-extended/fwup/fwup_1.16.0.bb @@ -1,3 +1,5 @@ +# SPDX-License-Identifier: MIT + SUMMARY = "Configurable embedded Linux firmware update creator and runner" DESCRIPTION = "Applies and creates signed .fw firmware archives. ForgeFIRM \ uses the factory's own update format: fwup applies ForgeFIRM upgrades and \ diff --git a/meta-forgefirm/recipes-extended/orcania/orcania_2.3.3.bb b/meta-forgefirm/recipes-extended/orcania/orcania_2.3.3.bb index 36a326c..21000a7 100644 --- a/meta-forgefirm/recipes-extended/orcania/orcania_2.3.3.bb +++ b/meta-forgefirm/recipes-extended/orcania/orcania_2.3.3.bb @@ -1,3 +1,5 @@ +# SPDX-License-Identifier: MIT + DESCRIPTION = "Potluck with different functions for C programs (babelouest base library)" HOMEPAGE = "https://github.com/babelouest/orcania" diff --git a/meta-forgefirm/recipes-extended/rsyslog/rsyslog/rsyslog.conf b/meta-forgefirm/recipes-extended/rsyslog/rsyslog/rsyslog.conf index 92a0d38..136491d 100644 --- a/meta-forgefirm/recipes-extended/rsyslog/rsyslog/rsyslog.conf +++ b/meta-forgefirm/recipes-extended/rsyslog/rsyslog/rsyslog.conf @@ -1,3 +1,5 @@ +# SPDX-License-Identifier: MIT + # /etc/rsyslog.conf - ForgeFIRM # # rsyslog is the only log writer on the machine. Every ForgeFIRM process diff --git a/meta-forgefirm/recipes-extended/rsyslog/rsyslog_%.bbappend b/meta-forgefirm/recipes-extended/rsyslog/rsyslog_%.bbappend index 55f9daf..b9fdcb8 100644 --- a/meta-forgefirm/recipes-extended/rsyslog/rsyslog_%.bbappend +++ b/meta-forgefirm/recipes-extended/rsyslog/rsyslog_%.bbappend @@ -1,3 +1,5 @@ +# SPDX-License-Identifier: MIT + # rsyslog is the ForgeFIRM system logger: the only log writer, one # directory per logger under /data/log/forgefirm. This appends the # ForgeFIRM /etc/rsyslog.conf (inputs, line format, and the include of diff --git a/meta-forgefirm/recipes-extended/ulfius/ulfius_2.7.15.bb b/meta-forgefirm/recipes-extended/ulfius/ulfius_2.7.15.bb index 96bf608..f46c8ca 100644 --- a/meta-forgefirm/recipes-extended/ulfius/ulfius_2.7.15.bb +++ b/meta-forgefirm/recipes-extended/ulfius/ulfius_2.7.15.bb @@ -1,3 +1,5 @@ +# SPDX-License-Identifier: MIT + DESCRIPTION = "Web Framework to build REST APIs, Webservices or any HTTP endpoint in C" HOMEPAGE = "https://github.com/babelouest/ulfius" diff --git a/meta-forgefirm/recipes-extended/yder/yder_1.4.20.bb b/meta-forgefirm/recipes-extended/yder/yder_1.4.20.bb index 99a9f66..436505f 100644 --- a/meta-forgefirm/recipes-extended/yder/yder_1.4.20.bb +++ b/meta-forgefirm/recipes-extended/yder/yder_1.4.20.bb @@ -1,3 +1,5 @@ +# SPDX-License-Identifier: MIT + DESCRIPTION = "Logging library for C applications (babelouest)" HOMEPAGE = "https://github.com/babelouest/yder" diff --git a/meta-forgefirm/recipes-forgefirm/ffboot/ffboot.bb b/meta-forgefirm/recipes-forgefirm/ffboot/ffboot.bb index 14bae61..d993e51 100644 --- a/meta-forgefirm/recipes-forgefirm/ffboot/ffboot.bb +++ b/meta-forgefirm/recipes-forgefirm/ffboot/ffboot.bb @@ -1,3 +1,5 @@ +# SPDX-License-Identifier: MIT + SUMMARY = "Boot-slot selection and inventory for Glowforge factory hardware" DESCRIPTION = "Inventories the bootable partitions (ffboot -l) and switches \ the boot target by rewriting the saved U-Boot environment with read-back \ diff --git a/meta-forgefirm/recipes-forgefirm/forgectrl/forgectrl-pin.inc b/meta-forgefirm/recipes-forgefirm/forgectrl/forgectrl-pin.inc index 4b1b9f9..65d79f4 100644 --- a/meta-forgefirm/recipes-forgefirm/forgectrl/forgectrl-pin.inc +++ b/meta-forgefirm/recipes-forgefirm/forgectrl/forgectrl-pin.inc @@ -1,3 +1,5 @@ +# SPDX-License-Identifier: MIT + # forgectrl pin. Bump deliberately after pushing forgectrl changes; keep # only SRCREV and PV here - the image manifest leaves *-pin.inc out of the # layer content hash because the component entry already identifies the diff --git a/meta-forgefirm/recipes-forgefirm/forgectrl/forgectrl.bb b/meta-forgefirm/recipes-forgefirm/forgectrl/forgectrl.bb index a597126..9ea2a90 100644 --- a/meta-forgefirm/recipes-forgefirm/forgectrl/forgectrl.bb +++ b/meta-forgefirm/recipes-forgefirm/forgectrl/forgectrl.bb @@ -1,3 +1,5 @@ +# SPDX-License-Identifier: MIT + DESCRIPTION = "System Control Daemon for ForgeFIRM powered Glowforge" HOMEPAGE = "https://github.com/openglow-org/forgectrl" diff --git a/meta-forgefirm/recipes-forgefirm/forgefirm-app/forgefirm-app-pin.inc b/meta-forgefirm/recipes-forgefirm/forgefirm-app/forgefirm-app-pin.inc index 9aa2c2c..c8f6fe1 100644 --- a/meta-forgefirm/recipes-forgefirm/forgefirm-app/forgefirm-app-pin.inc +++ b/meta-forgefirm/recipes-forgefirm/forgefirm-app/forgefirm-app-pin.inc @@ -1,3 +1,5 @@ +# SPDX-License-Identifier: MIT + # forgefirm-app pin (python3-gfhardware repository, forgefirm-app/ tree). # Bump deliberately (AUTOREV is not reproducible); keep only SRCREV and PV # here - the image manifest leaves *-pin.inc out of the layer content hash diff --git a/meta-forgefirm/recipes-forgefirm/forgefirm-app/forgefirm-app.inc b/meta-forgefirm/recipes-forgefirm/forgefirm-app/forgefirm-app.inc index a980fe0..281ce05 100644 --- a/meta-forgefirm/recipes-forgefirm/forgefirm-app/forgefirm-app.inc +++ b/meta-forgefirm/recipes-forgefirm/forgefirm-app/forgefirm-app.inc @@ -1,3 +1,5 @@ +# SPDX-License-Identifier: MIT + # Shared fetch for the ForgeFIRM web-service apps (gfhome, python3-ffmachine, # gfcloud). Their sources live in the forgefirm-app/ directory of the # python3-gfhardware repository. diff --git a/meta-forgefirm/recipes-forgefirm/forgefirm-app/gfcloud.bb b/meta-forgefirm/recipes-forgefirm/forgefirm-app/gfcloud.bb index d53ea65..b5ef055 100644 --- a/meta-forgefirm/recipes-forgefirm/forgefirm-app/gfcloud.bb +++ b/meta-forgefirm/recipes-forgefirm/forgefirm-app/gfcloud.bb @@ -1,3 +1,5 @@ +# SPDX-License-Identifier: MIT + DESCRIPTION = "Full Glowforge web-service controller daemon for ForgeFIRM (cloud mode)" require forgefirm-app.inc diff --git a/meta-forgefirm/recipes-forgefirm/forgefirm-app/gfhome.bb b/meta-forgefirm/recipes-forgefirm/forgefirm-app/gfhome.bb index 5529aa2..bdc2f33 100644 --- a/meta-forgefirm/recipes-forgefirm/forgefirm-app/gfhome.bb +++ b/meta-forgefirm/recipes-forgefirm/forgefirm-app/gfhome.bb @@ -1,3 +1,5 @@ +# SPDX-License-Identifier: MIT + DESCRIPTION = "One-shot Glowforge web-service homing for ForgeFIRM" require forgefirm-app.inc diff --git a/meta-forgefirm/recipes-forgefirm/forgefirm-app/python3-ffmachine.bb b/meta-forgefirm/recipes-forgefirm/forgefirm-app/python3-ffmachine.bb index 5d74fdf..23b00ad 100644 --- a/meta-forgefirm/recipes-forgefirm/forgefirm-app/python3-ffmachine.bb +++ b/meta-forgefirm/recipes-forgefirm/forgefirm-app/python3-ffmachine.bb @@ -1,3 +1,5 @@ +# SPDX-License-Identifier: MIT + DESCRIPTION = "Shared ForgeFIRM web-service hardware-machine glue (gfhome + gfcloud)" require forgefirm-app.inc diff --git a/meta-forgefirm/recipes-forgefirm/forgefirm-banner/files/forgefirm-banner.init b/meta-forgefirm/recipes-forgefirm/forgefirm-banner/files/forgefirm-banner.init index 365fe03..62296fb 100644 --- a/meta-forgefirm/recipes-forgefirm/forgefirm-banner/files/forgefirm-banner.init +++ b/meta-forgefirm/recipes-forgefirm/forgefirm-banner/files/forgefirm-banner.init @@ -1,4 +1,8 @@ #!/bin/sh +# Copyright 2026 514 LLC d/b/a OpenGlow +# Written by Scott Wiederhold +# https://community.openglow.org +# SPDX-License-Identifier: MIT ### BEGIN INIT INFO # Provides: forgefirm-banner # Required-Start: $network diff --git a/meta-forgefirm/recipes-forgefirm/forgefirm-banner/forgefirm-banner.bb b/meta-forgefirm/recipes-forgefirm/forgefirm-banner/forgefirm-banner.bb index 74cb5e2..6bc1f70 100644 --- a/meta-forgefirm/recipes-forgefirm/forgefirm-banner/forgefirm-banner.bb +++ b/meta-forgefirm/recipes-forgefirm/forgefirm-banner/forgefirm-banner.bb @@ -1,3 +1,5 @@ +# SPDX-License-Identifier: MIT + SUMMARY = "ForgeFIRM console banner: the control panel addresses in /etc/issue" DESCRIPTION = "Keeps an address block in the serial-console login banner \ (/etc/issue): one control panel URL per global address of wlan0 and eth0. \ diff --git a/meta-forgefirm/recipes-forgefirm/forgefirm-hostname/files/forgefirm-hostname.init b/meta-forgefirm/recipes-forgefirm/forgefirm-hostname/files/forgefirm-hostname.init index da12143..838c8a1 100644 --- a/meta-forgefirm/recipes-forgefirm/forgefirm-hostname/files/forgefirm-hostname.init +++ b/meta-forgefirm/recipes-forgefirm/forgefirm-hostname/files/forgefirm-hostname.init @@ -1,4 +1,8 @@ #!/bin/sh +# Copyright 2026 514 LLC d/b/a OpenGlow +# Written by Scott Wiederhold +# https://community.openglow.org +# SPDX-License-Identifier: MIT ### BEGIN INIT INFO # Provides: forgefirm-hostname # Required-Start: $local_fs diff --git a/meta-forgefirm/recipes-forgefirm/forgefirm-hostname/forgefirm-hostname.bb b/meta-forgefirm/recipes-forgefirm/forgefirm-hostname/forgefirm-hostname.bb index d9910a1..17be9e3 100644 --- a/meta-forgefirm/recipes-forgefirm/forgefirm-hostname/forgefirm-hostname.bb +++ b/meta-forgefirm/recipes-forgefirm/forgefirm-hostname/forgefirm-hostname.bb @@ -1,3 +1,5 @@ +# SPDX-License-Identifier: MIT + SUMMARY = "ForgeFIRM hostname: forgefirm- from the MAC address" DESCRIPTION = "Names the machine forgefirm-, where xxxx is the last \ four hex digits of the wlan0 MAC address (eth0 on a machine with no WiFi). \ diff --git a/meta-forgefirm/recipes-forgefirm/forgefirm-keys/forgefirm-keys.bb b/meta-forgefirm/recipes-forgefirm/forgefirm-keys/forgefirm-keys.bb index 255bfd2..3afbb35 100644 --- a/meta-forgefirm/recipes-forgefirm/forgefirm-keys/forgefirm-keys.bb +++ b/meta-forgefirm/recipes-forgefirm/forgefirm-keys/forgefirm-keys.bb @@ -1,3 +1,5 @@ +# SPDX-License-Identifier: MIT + SUMMARY = "Firmware verification public keys" DESCRIPTION = "Trust anchors for firmware archive verification: the \ ForgeFIRM release-signing public key (verifies release downloads and \ diff --git a/meta-forgefirm/recipes-forgefirm/forgefirm-logging/files/forgefirm-logging.init b/meta-forgefirm/recipes-forgefirm/forgefirm-logging/files/forgefirm-logging.init index baf5abd..68ca4ce 100644 --- a/meta-forgefirm/recipes-forgefirm/forgefirm-logging/files/forgefirm-logging.init +++ b/meta-forgefirm/recipes-forgefirm/forgefirm-logging/files/forgefirm-logging.init @@ -1,4 +1,8 @@ #!/bin/sh +# Copyright 2026 514 LLC d/b/a OpenGlow +# Written by Scott Wiederhold +# https://community.openglow.org +# SPDX-License-Identifier: MIT ### BEGIN INIT INFO # Provides: forgefirm-logging # Required-Start: $local_fs diff --git a/meta-forgefirm/recipes-forgefirm/forgefirm-logging/forgefirm-logging.bb b/meta-forgefirm/recipes-forgefirm/forgefirm-logging/forgefirm-logging.bb index 58f555b..3ca83f5 100644 --- a/meta-forgefirm/recipes-forgefirm/forgefirm-logging/forgefirm-logging.bb +++ b/meta-forgefirm/recipes-forgefirm/forgefirm-logging/forgefirm-logging.bb @@ -1,3 +1,5 @@ +# SPDX-License-Identifier: MIT + SUMMARY = "ForgeFIRM logging tree: rsyslog rules at boot, rotation" DESCRIPTION = "Boot-time glue for the ForgeFIRM logging tree \ (/data/log/forgefirm//): renders the per-logger rsyslog rules \ diff --git a/meta-forgefirm/recipes-forgefirm/forgefirm-persist/forgefirm-persist.bb b/meta-forgefirm/recipes-forgefirm/forgefirm-persist/forgefirm-persist.bb index 38b32ca..71dc5c8 100644 --- a/meta-forgefirm/recipes-forgefirm/forgefirm-persist/forgefirm-persist.bb +++ b/meta-forgefirm/recipes-forgefirm/forgefirm-persist/forgefirm-persist.bb @@ -1,3 +1,5 @@ +# SPDX-License-Identifier: MIT + SUMMARY = "ForgeFIRM boot state on /data: the timestamp and the random seed" DESCRIPTION = "The two files the poky init scripts keep across boots, \ pointed at /data/forgefirm because the rootfs is read-only: the boot \ diff --git a/meta-forgefirm/recipes-forgefirm/forgefirm-users/files/forgefirm-root.sh b/meta-forgefirm/recipes-forgefirm/forgefirm-users/files/forgefirm-root.sh index bc97845..c1741aa 100644 --- a/meta-forgefirm/recipes-forgefirm/forgefirm-users/files/forgefirm-root.sh +++ b/meta-forgefirm/recipes-forgefirm/forgefirm-users/files/forgefirm-root.sh @@ -1,3 +1,8 @@ +# Copyright 2026 514 LLC d/b/a OpenGlow +# Written by Scott Wiederhold +# https://community.openglow.org +# SPDX-License-Identifier: MIT + # ForgeFIRM: an interactive root shell (the serial console, or SSH on # the dev image) starts with a warning. Non-interactive shells (scp, # rsync, ssh with a command) print nothing. diff --git a/meta-forgefirm/recipes-forgefirm/forgefirm-users/files/forgefirm-users.init b/meta-forgefirm/recipes-forgefirm/forgefirm-users/files/forgefirm-users.init index 014031b..79a61c6 100644 --- a/meta-forgefirm/recipes-forgefirm/forgefirm-users/files/forgefirm-users.init +++ b/meta-forgefirm/recipes-forgefirm/forgefirm-users/files/forgefirm-users.init @@ -1,4 +1,8 @@ #!/bin/sh +# Copyright 2026 514 LLC d/b/a OpenGlow +# Written by Scott Wiederhold +# https://community.openglow.org +# SPDX-License-Identifier: MIT ### BEGIN INIT INFO # Provides: forgefirm-users # Required-Start: $local_fs diff --git a/meta-forgefirm/recipes-forgefirm/forgefirm-users/forgefirm-users.bb b/meta-forgefirm/recipes-forgefirm/forgefirm-users/forgefirm-users.bb index 26c4f9e..bf1d310 100644 --- a/meta-forgefirm/recipes-forgefirm/forgefirm-users/forgefirm-users.bb +++ b/meta-forgefirm/recipes-forgefirm/forgefirm-users/forgefirm-users.bb @@ -1,3 +1,5 @@ +# SPDX-License-Identifier: MIT + SUMMARY = "ForgeFIRM operator accounts: record render and the root shell warning" DESCRIPTION = "Renders the account record (/data/forgefirm/users, written \ by forgectrl) into the system account files at boot and on reload. The \ diff --git a/meta-forgefirm/recipes-forgefirm/forgetest/forgetest.bb b/meta-forgefirm/recipes-forgefirm/forgetest/forgetest.bb index 43e6c50..2942673 100644 --- a/meta-forgefirm/recipes-forgefirm/forgetest/forgetest.bb +++ b/meta-forgefirm/recipes-forgefirm/forgetest/forgetest.bb @@ -1,3 +1,5 @@ +# SPDX-License-Identifier: MIT + SUMMARY = "ForgeFIRM release acceptance tool (dev image)" DESCRIPTION = "Runs the release acceptance catalog against the machine from a \ self-contained web page (HTTP :8090), keeps the append-only result log under \ @@ -5,7 +7,7 @@ self-contained web page (HTTP :8090), keeps the append-only result log under \ carries the bench diagnostics page. Installed only on the dev image." HOMEPAGE = "https://github.com/openglow-org/forgefirm" LICENSE = "MIT" -LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302" +LIC_FILES_CHKSUM = "file://forgetest/LICENSE;md5=6657cce322ff8bed163c02ceffb4c60c" # The tool's canonical home is forgetest/ in this repo; the bench scripts # it drives live in scripts/bench/. Both are packaged from the same tree @@ -16,6 +18,7 @@ FILESEXTRAPATHS:prepend := "${THISDIR}/../../../:" # host unit tests and their caches would otherwise enter the fetch checksum # and rebuild the dev image after a workstation test run. SRC_URI = " \ + file://forgetest/LICENSE \ file://forgetest/forgetest/ \ file://forgetest/forgetest.init \ file://scripts/bench/ \ diff --git a/meta-forgefirm/recipes-forgefirm/grblhal-glowforge/grblhal-glowforge-pin.inc b/meta-forgefirm/recipes-forgefirm/grblhal-glowforge/grblhal-glowforge-pin.inc index c77d112..8234aad 100644 --- a/meta-forgefirm/recipes-forgefirm/grblhal-glowforge/grblhal-glowforge-pin.inc +++ b/meta-forgefirm/recipes-forgefirm/grblhal-glowforge/grblhal-glowforge-pin.inc @@ -1,3 +1,5 @@ +# SPDX-License-Identifier: MIT + # grblHAL-glowforge pin. Bump deliberately after pushing grblHAL-glowforge # changes; keep only SRCREV and PV here - the image manifest leaves # *-pin.inc out of the layer content hash because the component entry diff --git a/meta-forgefirm/recipes-forgefirm/grblhal-glowforge/grblhal-glowforge.bb b/meta-forgefirm/recipes-forgefirm/grblhal-glowforge/grblhal-glowforge.bb index a6a04e4..c6f5456 100644 --- a/meta-forgefirm/recipes-forgefirm/grblhal-glowforge/grblhal-glowforge.bb +++ b/meta-forgefirm/recipes-forgefirm/grblhal-glowforge/grblhal-glowforge.bb @@ -1,3 +1,5 @@ +# SPDX-License-Identifier: MIT + DESCRIPTION = "grblHAL motion controller for the Glowforge factory board" HOMEPAGE = "https://github.com/openglow-org/grblHAL-glowforge" diff --git a/meta-forgefirm/recipes-forgefirm/grblhal-glowforge/grblhal-glowforge/grblhal.init b/meta-forgefirm/recipes-forgefirm/grblhal-glowforge/grblhal-glowforge/grblhal.init index 0150315..bc563db 100644 --- a/meta-forgefirm/recipes-forgefirm/grblhal-glowforge/grblhal-glowforge/grblhal.init +++ b/meta-forgefirm/recipes-forgefirm/grblhal-glowforge/grblhal-glowforge/grblhal.init @@ -1,4 +1,8 @@ #!/bin/sh +# Copyright 2026 514 LLC d/b/a OpenGlow +# Written by Scott Wiederhold +# https://community.openglow.org +# SPDX-License-Identifier: MIT ### BEGIN INIT INFO # Provides: grblhal # Required-Start: $local_fs diff --git a/meta-forgefirm/recipes-forgefirm/images/forgefirm-image-dev.bb b/meta-forgefirm/recipes-forgefirm/images/forgefirm-image-dev.bb index dcf0bb2..5599289 100644 --- a/meta-forgefirm/recipes-forgefirm/images/forgefirm-image-dev.bb +++ b/meta-forgefirm/recipes-forgefirm/images/forgefirm-image-dev.bb @@ -1,3 +1,5 @@ +# SPDX-License-Identifier: MIT + require forgefirm-image.bb DESCRIPTION = "OpenGlow/ForgeFIRM development image for Glowforge" diff --git a/meta-forgefirm/recipes-forgefirm/images/forgefirm-image.bb b/meta-forgefirm/recipes-forgefirm/images/forgefirm-image.bb index f1a30ac..69f1965 100644 --- a/meta-forgefirm/recipes-forgefirm/images/forgefirm-image.bb +++ b/meta-forgefirm/recipes-forgefirm/images/forgefirm-image.bb @@ -1,3 +1,5 @@ +# SPDX-License-Identifier: MIT + require recipes-glowforge/images/glowforge-image.bb # /etc/forgefirm-manifest.json: the build-input identity the acceptance tool diff --git a/meta-forgefirm/recipes-forgefirm/images/forgefirm-release.inc b/meta-forgefirm/recipes-forgefirm/images/forgefirm-release.inc index 449bcb7..d898ee7 100644 --- a/meta-forgefirm/recipes-forgefirm/images/forgefirm-release.inc +++ b/meta-forgefirm/recipes-forgefirm/images/forgefirm-release.inc @@ -1,3 +1,5 @@ +# SPDX-License-Identifier: MIT + # The release version, and nothing else. # # This file is metadata, not platform content: the image manifest leaves diff --git a/meta-forgefirm/recipes-forgefirm/slotmigrate/slotmigrate.bb b/meta-forgefirm/recipes-forgefirm/slotmigrate/slotmigrate.bb index cf2d00a..ea60ec6 100644 --- a/meta-forgefirm/recipes-forgefirm/slotmigrate/slotmigrate.bb +++ b/meta-forgefirm/recipes-forgefirm/slotmigrate/slotmigrate.bb @@ -1,3 +1,5 @@ +# SPDX-License-Identifier: MIT + SUMMARY = "Boot-time migration from the legacy ForgeFIRM disk layout" DESCRIPTION = "Reclaims the legacy ForgeFIRM eMMC partition (p4) and grows \ /data back to the factory footprint. Runs before mountall; state-derived \ diff --git a/meta-forgefirm/recipes-kernel/kernel-modules/kernel-module-glowforge.bbappend b/meta-forgefirm/recipes-kernel/kernel-modules/kernel-module-glowforge.bbappend index ad340db..6e61997 100644 --- a/meta-forgefirm/recipes-kernel/kernel-modules/kernel-module-glowforge.bbappend +++ b/meta-forgefirm/recipes-kernel/kernel-modules/kernel-module-glowforge.bbappend @@ -1,3 +1,5 @@ +# SPDX-License-Identifier: MIT + # ForgeFIRM image manifest: source fingerprint of glowforge.ko. # # kernel-module-split packages the .ko into a versioned package that the diff --git a/meta-forgefirm/recipes-kernel/linux/linux-fslc_%.bbappend b/meta-forgefirm/recipes-kernel/linux/linux-fslc_%.bbappend index 0e004ae..f264833 100644 --- a/meta-forgefirm/recipes-kernel/linux/linux-fslc_%.bbappend +++ b/meta-forgefirm/recipes-kernel/linux/linux-fslc_%.bbappend @@ -1,3 +1,5 @@ +# SPDX-License-Identifier: MIT + # ForgeFIRM image manifest: kernel identity (forgefirm-image-manifest.bbclass # collects it from DEPLOY_DIR_IMAGE). The kernel tree is too large to list # per file and every acceptance test depends on it anyway, so the entry diff --git a/meta-forgefirm/recipes-support/libmicrohttpd/libmicrohttpd_%.bbappend b/meta-forgefirm/recipes-support/libmicrohttpd/libmicrohttpd_%.bbappend index 592d3ac..1d539ec 100644 --- a/meta-forgefirm/recipes-support/libmicrohttpd/libmicrohttpd_%.bbappend +++ b/meta-forgefirm/recipes-support/libmicrohttpd/libmicrohttpd_%.bbappend @@ -1,3 +1,5 @@ +# SPDX-License-Identifier: MIT + # forgectrl serves HTTPS on 443 with a self-signed certificate through # this library, so the https option (GnuTLS) is on; curl is the poky # default (it builds the library's own test client). libgcrypt is a diff --git a/scripts/bench/aa_offset_check.py b/scripts/bench/aa_offset_check.py index 8940bf2..fb8f3cc 100644 --- a/scripts/bench/aa_offset_check.py +++ b/scripts/bench/aa_offset_check.py @@ -1,4 +1,8 @@ #!/usr/bin/env python3 +# Copyright 2026 514 LLC d/b/a OpenGlow +# Written by Scott Wiederhold +# https://community.openglow.org +# SPDX-License-Identifier: MIT """Does the coolant reading hold still when the run airflow comes on? With cool_aa_offset_counts at the machine's value the engine takes the diff --git a/scripts/bench/accel_crash_probe.py b/scripts/bench/accel_crash_probe.py index 052d89a..747bcaf 100644 --- a/scripts/bench/accel_crash_probe.py +++ b/scripts/bench/accel_crash_probe.py @@ -1,4 +1,8 @@ #!/usr/bin/env python3 +# Copyright 2026 514 LLC d/b/a OpenGlow +# Written by Scott Wiederhold +# https://community.openglow.org +# SPDX-License-Identifier: MIT """De-risk drill for the head-accelerometer crash detector. The LIS2HH12 on the head bus (i2c-3 @0x1e) carries an on-chip interrupt diff --git a/scripts/bench/accel_fast.py b/scripts/bench/accel_fast.py index ee7846c..7603b76 100644 --- a/scripts/bench/accel_fast.py +++ b/scripts/bench/accel_fast.py @@ -1,4 +1,8 @@ #!/usr/bin/env python3 +# Copyright 2026 514 LLC d/b/a OpenGlow +# Written by Scott Wiederhold +# https://community.openglow.org +# SPDX-License-Identifier: MIT """Fast direct-I2C sampler for the two LIS2HH12s on the head bus (i2c-3). Unbinds st_accel from both for the capture (rebinds after), programs diff --git a/scripts/bench/arc_tolerance_sweep.py b/scripts/bench/arc_tolerance_sweep.py index 1b76a18..3c68708 100644 --- a/scripts/bench/arc_tolerance_sweep.py +++ b/scripts/bench/arc_tolerance_sweep.py @@ -1,4 +1,8 @@ #!/usr/bin/env python3 +# Copyright 2026 514 LLC d/b/a OpenGlow +# Written by Scott Wiederhold +# https://community.openglow.org +# SPDX-License-Identifier: MIT """How fine an arc the one core can plan: a $12 ladder on the 9 in circle (on the board). Usage: arc_tolerance_sweep.py [--mode M] [tolerances...] diff --git a/scripts/bench/bench_m2.py b/scripts/bench/bench_m2.py index 4bcee72..34866e5 100644 --- a/scripts/bench/bench_m2.py +++ b/scripts/bench/bench_m2.py @@ -1,4 +1,8 @@ #!/usr/bin/env python3 +# Copyright 2026 514 LLC d/b/a OpenGlow +# Written by Scott Wiederhold +# https://community.openglow.org +# SPDX-License-Identifier: MIT """Milestone-2 motion-quality bench: factory-true rates/accels over TCP. Runs a bounded, return-to-start jog sequence against grblHAL on the board diff --git a/scripts/bench/bench_phase2.py b/scripts/bench/bench_phase2.py index ef9ba11..e38e22d 100644 --- a/scripts/bench/bench_phase2.py +++ b/scripts/bench/bench_phase2.py @@ -1,4 +1,8 @@ #!/usr/bin/env python3 +# Copyright 2026 514 LLC d/b/a OpenGlow +# Written by Scott Wiederhold +# https://community.openglow.org +# SPDX-License-Identifier: MIT """End-of-data protocol bench. Motion-safe by construction: all four motors are locked via motor_lock (the diff --git a/scripts/bench/build-feeder.sh b/scripts/bench/build-feeder.sh index b7ba285..5145f71 100644 --- a/scripts/bench/build-feeder.sh +++ b/scripts/bench/build-feeder.sh @@ -1,4 +1,8 @@ #!/bin/bash +# Copyright 2026 514 LLC d/b/a OpenGlow +# Written by Scott Wiederhold +# https://community.openglow.org +# SPDX-License-Identifier: MIT # Cross-compiles the bench feeder for the factory board, borrowing the # Yocto cross toolchain from the ulfius recipe work directory. # diff --git a/scripts/bench/build-forgectrl.sh b/scripts/bench/build-forgectrl.sh index bbd897f..63ac323 100644 --- a/scripts/bench/build-forgectrl.sh +++ b/scripts/bench/build-forgectrl.sh @@ -1,4 +1,8 @@ #!/bin/bash +# Copyright 2026 514 LLC d/b/a OpenGlow +# Written by Scott Wiederhold +# https://community.openglow.org +# SPDX-License-Identifier: MIT # Cross-compiles forgectrl (the sibling repo) for the factory board, # borrowing the Yocto cross toolchain + sysroot from the forgectrl # recipe work directory (which carries ulfius, jansson, gnutls, diff --git a/scripts/bench/build-glowforge.sh b/scripts/bench/build-glowforge.sh index f775c80..8672402 100644 --- a/scripts/bench/build-glowforge.sh +++ b/scripts/bench/build-glowforge.sh @@ -1,4 +1,8 @@ #!/bin/bash +# Copyright 2026 514 LLC d/b/a OpenGlow +# Written by Scott Wiederhold +# https://community.openglow.org +# SPDX-License-Identifier: MIT # Cross-compiles grblHAL-glowforge (the sibling driver repo) for the # factory board, borrowing the Yocto cross toolchain from the ulfius # recipe work directory. Regenerate a cleaned toolchain path with: diff --git a/scripts/bench/bump_seek.py b/scripts/bench/bump_seek.py index ba1d99b..8ce164e 100644 --- a/scripts/bench/bump_seek.py +++ b/scripts/bench/bump_seek.py @@ -1,4 +1,8 @@ #!/usr/bin/env python3 +# Copyright 2026 514 LLC d/b/a OpenGlow +# Written by Scott Wiederhold +# https://community.openglow.org +# SPDX-License-Identifier: MIT """Accelerometer bump-seek prototype: creep toward a rail in bounded jog segments, detect the contact jolt on the head LIS2HH12, jog-cancel at once, back off. This is the homing-cycle detection loop, run standalone. diff --git a/scripts/bench/check_pwm.py b/scripts/bench/check_pwm.py index 357e0ac..a8faf03 100644 --- a/scripts/bench/check_pwm.py +++ b/scripts/bench/check_pwm.py @@ -1,4 +1,8 @@ #!/usr/bin/env python3 +# Copyright 2026 514 LLC d/b/a OpenGlow +# Written by Scott Wiederhold +# https://community.openglow.org +# SPDX-License-Identifier: MIT """Software check: laser PWM carrier frequency from PWM2 registers. Expected with the fsl,extra-prescale=<13> fix: PWMCR prescaler divider = 13, diff --git a/scripts/bench/cp_watchdog_timing.py b/scripts/bench/cp_watchdog_timing.py index f15adbb..baa1140 100644 --- a/scripts/bench/cp_watchdog_timing.py +++ b/scripts/bench/cp_watchdog_timing.py @@ -1,4 +1,8 @@ #!/usr/bin/env python3 +# Copyright 2026 514 LLC d/b/a OpenGlow +# Written by Scott Wiederhold +# https://community.openglow.org +# SPDX-License-Identifier: MIT """Charge-pump watchdog timing (runs ON the board, as root). Measures the HV watchdog one-shot (U1-1, SN74AHC123A) directly from the diff --git a/scripts/bench/critical_tier_drill.py b/scripts/bench/critical_tier_drill.py index f7bd1ae..d1ad3ae 100644 --- a/scripts/bench/critical_tier_drill.py +++ b/scripts/bench/critical_tier_drill.py @@ -1,4 +1,8 @@ #!/usr/bin/env python3 +# Copyright 2026 514 LLC d/b/a OpenGlow +# Written by Scott Wiederhold +# https://community.openglow.org +# SPDX-License-Identifier: MIT """Coolant critical-tier drill: the loop warmed through the lines by the engine itself, inside one run session. diff --git a/scripts/bench/debug_kernel_drills.py b/scripts/bench/debug_kernel_drills.py index c6d15db..a67bc3d 100644 --- a/scripts/bench/debug_kernel_drills.py +++ b/scripts/bench/debug_kernel_drills.py @@ -1,4 +1,8 @@ #!/usr/bin/env python3 +# Copyright 2026 514 LLC d/b/a OpenGlow +# Written by Scott Wiederhold +# https://community.openglow.org +# SPDX-License-Identifier: MIT """Debug-kernel drills: lock correctness across glowforge.ko load/unload and a forced -EPROBE_DEFER unwind. diff --git a/scripts/bench/fan_floor_measure.py b/scripts/bench/fan_floor_measure.py index 551a761..d57aa12 100644 --- a/scripts/bench/fan_floor_measure.py +++ b/scripts/bench/fan_floor_measure.py @@ -1,4 +1,8 @@ #!/usr/bin/env python3 +# Copyright 2026 514 LLC d/b/a OpenGlow +# Written by Scott Wiederhold +# https://community.openglow.org +# SPDX-License-Identifier: MIT """Fan floor measurement: the numbers the airflow gates ship with. Two modes, both sampling the four tachometers (/status fans, rpm) and the diff --git a/scripts/bench/fan_test.py b/scripts/bench/fan_test.py index ed9f4f7..c09d927 100644 --- a/scripts/bench/fan_test.py +++ b/scripts/bench/fan_test.py @@ -1,4 +1,8 @@ #!/usr/bin/env python3 +# Copyright 2026 514 LLC d/b/a OpenGlow +# Written by Scott Wiederhold +# https://community.openglow.org +# SPDX-License-Identifier: MIT """Fan/coolant bench: snapshots the fan PWMs, tachs and coolant readings, drives M8 (cut-profile fans), then M9 (cooldown -> idle), and prints each snapshot for the tach readbacks to be judged. Needs the controller diff --git a/scripts/bench/fdscan.sh b/scripts/bench/fdscan.sh index cf564b3..195391c 100644 --- a/scripts/bench/fdscan.sh +++ b/scripts/bench/fdscan.sh @@ -1,4 +1,8 @@ #!/bin/sh +# Copyright 2026 514 LLC d/b/a OpenGlow +# Written by Scott Wiederhold +# https://community.openglow.org +# SPDX-License-Identifier: MIT # Runs ON the board. While forgectrl spawns helper children (the update # check's curl, the snapshot's media-ctl/v4l2-ctl), scan every child for a # descriptor on the pulse device. Expected: none - only the controller diff --git a/scripts/bench/feeder.c b/scripts/bench/feeder.c index 3107d4e..9190a0f 100644 --- a/scripts/bench/feeder.c +++ b/scripts/bench/feeder.c @@ -1,3 +1,8 @@ +/* + * Copyright 2026 514 LLC d/b/a OpenGlow + * Written by Scott Wiederhold + * SPDX-License-Identifier: MIT + */ /* * feeder.c - prove no-underrun continuous live feeding of the glowforge.ko * SDMA pulse ring under load. diff --git a/scripts/bench/fire_test.py b/scripts/bench/fire_test.py index 2dfcd62..213d28b 100644 --- a/scripts/bench/fire_test.py +++ b/scripts/bench/fire_test.py @@ -1,4 +1,8 @@ #!/usr/bin/env python3 +# Copyright 2026 514 LLC d/b/a OpenGlow +# Written by Scott Wiederhold +# https://community.openglow.org +# SPDX-License-Identifier: MIT """FIRE-line drop-timing test - runs ON the board. Usage: fire_test.py A|B|U Stream: power(0) first byte (duty forced to ZERO before any FIRE bit - diff --git a/scripts/bench/flow_characterize.py b/scripts/bench/flow_characterize.py index 500a12e..86f8b99 100644 --- a/scripts/bench/flow_characterize.py +++ b/scripts/bench/flow_characterize.py @@ -1,4 +1,8 @@ #!/usr/bin/env python3 +# Copyright 2026 514 LLC d/b/a OpenGlow +# Written by Scott Wiederhold +# https://community.openglow.org +# SPDX-License-Identifier: MIT """Characterize the coolant flow signature using the FACTORY temperature curve, and recommend flow-fault thresholds. diff --git a/scripts/bench/flow_confirm_drill.py b/scripts/bench/flow_confirm_drill.py index 96de412..fe66019 100644 --- a/scripts/bench/flow_confirm_drill.py +++ b/scripts/bench/flow_confirm_drill.py @@ -1,4 +1,8 @@ #!/usr/bin/env python3 +# Copyright 2026 514 LLC d/b/a OpenGlow +# Written by Scott Wiederhold +# https://community.openglow.org +# SPDX-License-Identifier: MIT """Bench drill for the flow-check suspicion/confirmation state machine. Runs ON THE BOARD (scp it over, then: python3 flow_confirm_drill.py). diff --git a/scripts/bench/flow_escalate_drill.py b/scripts/bench/flow_escalate_drill.py index 20b32e3..e422da0 100644 --- a/scripts/bench/flow_escalate_drill.py +++ b/scripts/bench/flow_escalate_drill.py @@ -1,4 +1,8 @@ #!/usr/bin/env python3 +# Copyright 2026 514 LLC d/b/a OpenGlow +# Written by Scott Wiederhold +# https://community.openglow.org +# SPDX-License-Identifier: MIT """Bench drill for the starved-re-check escalation path. Runs ON THE BOARD with the controller running. The cooling engine's diff --git a/scripts/bench/flow_matrix.py b/scripts/bench/flow_matrix.py index cebeb05..df30662 100644 --- a/scripts/bench/flow_matrix.py +++ b/scripts/bench/flow_matrix.py @@ -1,4 +1,8 @@ #!/usr/bin/env python3 +# Copyright 2026 514 LLC d/b/a OpenGlow +# Written by Scott Wiederhold +# https://community.openglow.org +# SPDX-License-Identifier: MIT """Coolant flow-detection design matrix: heating cost AND detection precision across heater duty cycles and check durations. diff --git a/scripts/bench/flow_recheck_char.py b/scripts/bench/flow_recheck_char.py index edefd5b..0ba2a4a 100644 --- a/scripts/bench/flow_recheck_char.py +++ b/scripts/bench/flow_recheck_char.py @@ -1,4 +1,8 @@ #!/usr/bin/env python3 +# Copyright 2026 514 LLC d/b/a OpenGlow +# Written by Scott Wiederhold +# https://community.openglow.org +# SPDX-License-Identifier: MIT """Characterize a SHORT periodic flow re-check for use DURING a job. Why a separate design from the job-start check: with the laser firing diff --git a/scripts/bench/flow_sampler.py b/scripts/bench/flow_sampler.py index 273a575..ddc765b 100644 --- a/scripts/bench/flow_sampler.py +++ b/scripts/bench/flow_sampler.py @@ -1,4 +1,8 @@ #!/usr/bin/env python3 +# Copyright 2026 514 LLC d/b/a OpenGlow +# Written by Scott Wiederhold +# https://community.openglow.org +# SPDX-License-Identifier: MIT """Board-side coolant sampler: prints 'elapsed,raw_down,raw_up' lines. Usage: flow_sampler.py Kept on the board so sampling cadence is not at the mercy of ssh diff --git a/scripts/bench/flow_sustained.py b/scripts/bench/flow_sustained.py index e901522..f5919f5 100644 --- a/scripts/bench/flow_sustained.py +++ b/scripts/bench/flow_sustained.py @@ -1,4 +1,8 @@ #!/usr/bin/env python3 +# Copyright 2026 514 LLC d/b/a OpenGlow +# Written by Scott Wiederhold +# https://community.openglow.org +# SPDX-License-Identifier: MIT """Sustained-load test for periodic flow re-checks. Question: what does repeated interrogation cost thermally over a long diff --git a/scripts/bench/flow_warm_validate.py b/scripts/bench/flow_warm_validate.py index 8f037f6..2887c80 100644 --- a/scripts/bench/flow_warm_validate.py +++ b/scripts/bench/flow_warm_validate.py @@ -1,4 +1,8 @@ #!/usr/bin/env python3 +# Copyright 2026 514 LLC d/b/a OpenGlow +# Written by Scott Wiederhold +# https://community.openglow.org +# SPDX-License-Identifier: MIT """Validate the flow check at a WARM loop baseline - the condition a real job actually presents. diff --git a/scripts/bench/gate_a_kernel_drills.py b/scripts/bench/gate_a_kernel_drills.py index 15df71c..b58b54e 100644 --- a/scripts/bench/gate_a_kernel_drills.py +++ b/scripts/bench/gate_a_kernel_drills.py @@ -1,4 +1,8 @@ #!/usr/bin/env python3 +# Copyright 2026 514 LLC d/b/a OpenGlow +# Written by Scott Wiederhold +# https://community.openglow.org +# SPDX-License-Identifier: MIT """GATE A kernel drills - runs ON the board. Usage: gate_a_kernel_drills.py K1|K2|K3 The pulse device must be free: stop forgectrl first diff --git a/scripts/bench/gfbench.py b/scripts/bench/gfbench.py index 9e1465e..293599b 100644 --- a/scripts/bench/gfbench.py +++ b/scripts/bench/gfbench.py @@ -1,4 +1,8 @@ #!/usr/bin/env python3 +# Copyright 2026 514 LLC d/b/a OpenGlow +# Written by Scott Wiederhold +# https://community.openglow.org +# SPDX-License-Identifier: MIT """Shared helpers for the bench tools that can run either ON the board or from a LAN host. diff --git a/scripts/bench/laser_lifecycle_test.py b/scripts/bench/laser_lifecycle_test.py index e04d3a3..cc972a3 100644 --- a/scripts/bench/laser_lifecycle_test.py +++ b/scripts/bench/laser_lifecycle_test.py @@ -1,4 +1,8 @@ #!/usr/bin/env python3 +# Copyright 2026 514 LLC d/b/a OpenGlow +# Written by Scott Wiederhold +# https://community.openglow.org +# SPDX-License-Identifier: MIT """Host-side verification of the operator-armed window lifecycle. Runs the native grblHAL_glowforge binary in null-sink mode (no diff --git a/scripts/bench/laser_stream_test.py b/scripts/bench/laser_stream_test.py index 3d4d329..20ba33e 100644 --- a/scripts/bench/laser_stream_test.py +++ b/scripts/bench/laser_stream_test.py @@ -1,4 +1,8 @@ #!/usr/bin/env python3 +# Copyright 2026 514 LLC d/b/a OpenGlow +# Written by Scott Wiederhold +# https://community.openglow.org +# SPDX-License-Identifier: MIT """Host-side verification of the laser pulse-stream emission. Runs the native grblHAL_glowforge binary in null-sink mode with diff --git a/scripts/bench/lens_stop_accel.py b/scripts/bench/lens_stop_accel.py index f722e1e..c01efa9 100644 --- a/scripts/bench/lens_stop_accel.py +++ b/scripts/bench/lens_stop_accel.py @@ -1,4 +1,8 @@ #!/usr/bin/env python3 +# Copyright 2026 514 LLC d/b/a OpenGlow +# Written by Scott Wiederhold +# https://community.openglow.org +# SPDX-License-Identifier: MIT """Lens stop detection by the head accelerometer: a bench drill. Steps the lens one half-step at a time from the hall's rising edge toward diff --git a/scripts/bench/lens_travel.py b/scripts/bench/lens_travel.py index 428a786..1384310 100644 --- a/scripts/bench/lens_travel.py +++ b/scripts/bench/lens_travel.py @@ -1,4 +1,8 @@ #!/usr/bin/env python3 +# Copyright 2026 514 LLC d/b/a OpenGlow +# Written by Scott Wiederhold +# https://community.openglow.org +# SPDX-License-Identifier: MIT """Lens travel drill: where the carriage's stops sit against the hall edge. Runs on the board with the controller stopped (through forgectrl, so the diff --git a/scripts/bench/live_fire_drills.py b/scripts/bench/live_fire_drills.py index 2fa5395..ffb9e2b 100644 --- a/scripts/bench/live_fire_drills.py +++ b/scripts/bench/live_fire_drills.py @@ -1,4 +1,8 @@ #!/usr/bin/env python3 +# Copyright 2026 514 LLC d/b/a OpenGlow +# Written by Scott Wiederhold +# https://community.openglow.org +# SPDX-License-Identifier: MIT """Live-fire bench drills - Phases 4, 5, 6. Runs on the board (the bench page) or from a LAN host, against grblHAL over TCP (port 23) and forgectrl over HTTP (:80, FORGECTRL_PORT overrides); the machine is GF_HOST, default 127.0.0.1. diff --git a/scripts/bench/netblip.sh b/scripts/bench/netblip.sh index 1a4de75..e1e94b4 100644 --- a/scripts/bench/netblip.sh +++ b/scripts/bench/netblip.sh @@ -1,4 +1,8 @@ #!/bin/sh +# Copyright 2026 514 LLC d/b/a OpenGlow +# Written by Scott Wiederhold +# https://community.openglow.org +# SPDX-License-Identifier: MIT # Runs ON the board while a cloud session is live: blackhole every # established :443 peer and break name resolution for N seconds, then # restore both. The cloud client must notice the dead socket, exit toward diff --git a/scripts/bench/offset_probe.py b/scripts/bench/offset_probe.py index e912ef2..1714a86 100644 --- a/scripts/bench/offset_probe.py +++ b/scripts/bench/offset_probe.py @@ -1,4 +1,8 @@ #!/usr/bin/env python3 +# Copyright 2026 514 LLC d/b/a OpenGlow +# Written by Scott Wiederhold +# https://community.openglow.org +# SPDX-License-Identifier: MIT """Coolant-sensor offset probe: which actuator moves both thermistors? The coolant ADC reads about 1 C low on both sensors while the run airflow diff --git a/scripts/bench/pacing_test.py b/scripts/bench/pacing_test.py index 3783662..efbd0ff 100644 --- a/scripts/bench/pacing_test.py +++ b/scripts/bench/pacing_test.py @@ -1,4 +1,8 @@ #!/usr/bin/env python3 +# Copyright 2026 514 LLC d/b/a OpenGlow +# Written by Scott Wiederhold +# https://community.openglow.org +# SPDX-License-Identifier: MIT """Pacing-fix bench check - runs ON the board (localhost). Dry motion, no laser. Verifies: diff --git a/scripts/bench/pgood_probe.py b/scripts/bench/pgood_probe.py index df37875..04afa15 100644 --- a/scripts/bench/pgood_probe.py +++ b/scripts/bench/pgood_probe.py @@ -1,4 +1,8 @@ #!/usr/bin/env python3 +# Copyright 2026 514 LLC d/b/a OpenGlow +# Written by Scott Wiederhold +# https://community.openglow.org +# SPDX-License-Identifier: MIT """LASER_PGOOD (J1_14) against the rest of the laser chain, through the kernel's readbacks. diff --git a/scripts/bench/planner_blocks_test.py b/scripts/bench/planner_blocks_test.py index 2e1de7a..f166938 100644 --- a/scripts/bench/planner_blocks_test.py +++ b/scripts/bench/planner_blocks_test.py @@ -1,4 +1,8 @@ #!/usr/bin/env python3 +# Copyright 2026 514 LLC d/b/a OpenGlow +# Written by Scott Wiederhold +# https://community.openglow.org +# SPDX-License-Identifier: MIT """Host-side verification that a deep planner buffer starts. $398 (planner buffer blocks) is a reboot-required setting with a range of diff --git a/scripts/bench/platform_drills.py b/scripts/bench/platform_drills.py index 947c763..b9712d3 100644 --- a/scripts/bench/platform_drills.py +++ b/scripts/bench/platform_drills.py @@ -1,4 +1,8 @@ #!/usr/bin/env python3 +# Copyright 2026 514 LLC d/b/a OpenGlow +# Written by Scott Wiederhold +# https://community.openglow.org +# SPDX-License-Identifier: MIT """Kernel platform drills - runs ON the board, with forgectrl stopped (/etc/init.d/forgectrl stop) so the pulse device is free. Restart forgectrl afterward. Usage: platform_drills.py deadman|rmmod|decay|led|all diff --git a/scripts/bench/puls_profile.py b/scripts/bench/puls_profile.py index c96ee83..54d82bf 100644 --- a/scripts/bench/puls_profile.py +++ b/scripts/bench/puls_profile.py @@ -1,4 +1,8 @@ #!/usr/bin/env python3 +# Copyright 2026 514 LLC d/b/a OpenGlow +# Written by Scott Wiederhold +# https://community.openglow.org +# SPDX-License-Identifier: MIT """Extract motion profiles from Glowforge pulse files. Decodes a factory .puls byte stream (one byte per machine tick) and reports diff --git a/scripts/bench/pwm_hold.py b/scripts/bench/pwm_hold.py index c8d8741..e34af10 100644 --- a/scripts/bench/pwm_hold.py +++ b/scripts/bench/pwm_hold.py @@ -1,4 +1,8 @@ #!/usr/bin/env python3 +# Copyright 2026 514 LLC d/b/a OpenGlow +# Written by Scott Wiederhold +# https://community.openglow.org +# SPDX-License-Identifier: MIT """Hold LASER_PWM at one duty value for a measurement window, then restore. Usage: pwm_hold.py [sar] [seconds] (defaults: 8, 30) diff --git a/scripts/bench/pwm_stream_test.py b/scripts/bench/pwm_stream_test.py index 62eb89a..6d703df 100644 --- a/scripts/bench/pwm_stream_test.py +++ b/scripts/bench/pwm_stream_test.py @@ -1,4 +1,8 @@ #!/usr/bin/env python3 +# Copyright 2026 514 LLC d/b/a OpenGlow +# Written by Scott Wiederhold +# https://community.openglow.org +# SPDX-License-Identifier: MIT """LASER_PWM stream-path test - runs ON the board. Streams POWER BYTES ONLY (bit 7 set) through /dev/glowforge and lets the diff --git a/scripts/bench/pwm_sweep.py b/scripts/bench/pwm_sweep.py index 76c4e70..0af636d 100644 --- a/scripts/bench/pwm_sweep.py +++ b/scripts/bench/pwm_sweep.py @@ -1,4 +1,8 @@ #!/usr/bin/env python3 +# Copyright 2026 514 LLC d/b/a OpenGlow +# Written by Scott Wiederhold +# https://community.openglow.org +# SPDX-License-Identifier: MIT """LASER_PWM scope test - runs ON the board. check: read-only - safety-chain readbacks + PWM2 register dump. diff --git a/scripts/bench/raster_dry.py b/scripts/bench/raster_dry.py index 298b28e..ce9105c 100644 --- a/scripts/bench/raster_dry.py +++ b/scripts/bench/raster_dry.py @@ -1,4 +1,8 @@ #!/usr/bin/env python3 +# Copyright 2026 514 LLC d/b/a OpenGlow +# Written by Scott Wiederhold +# https://community.openglow.org +# SPDX-License-Identifier: MIT """A dry raster at top speed at each XY microstep mode (on the board). Usage: raster_dry.py [modes...] (default: 8 16 32) diff --git a/scripts/bench/resume_dark_lead.py b/scripts/bench/resume_dark_lead.py index 5203764..e9bda1c 100644 --- a/scripts/bench/resume_dark_lead.py +++ b/scripts/bench/resume_dark_lead.py @@ -1,4 +1,8 @@ #!/usr/bin/env python3 +# Copyright 2026 514 LLC d/b/a OpenGlow +# Written by Scott Wiederhold +# https://community.openglow.org +# SPDX-License-Identifier: MIT """Resume dark-lead characterization (runs ON the board, as root). Measures what the safety chain does across a pause and a resume, at pad diff --git a/scripts/bench/temp_calibrate.py b/scripts/bench/temp_calibrate.py index f0840e1..51dea64 100644 --- a/scripts/bench/temp_calibrate.py +++ b/scripts/bench/temp_calibrate.py @@ -1,4 +1,8 @@ #!/usr/bin/env python3 +# Copyright 2026 514 LLC d/b/a OpenGlow +# Written by Scott Wiederhold +# https://community.openglow.org +# SPDX-License-Identifier: MIT """Coolant temperature spot-check helper (runs on the board or from a host; gfbench: GF_HOST). diff --git a/scripts/bench/xy_mode_test.py b/scripts/bench/xy_mode_test.py index 777dc25..d8956f9 100644 --- a/scripts/bench/xy_mode_test.py +++ b/scripts/bench/xy_mode_test.py @@ -1,4 +1,8 @@ #!/usr/bin/env python3 +# Copyright 2026 514 LLC d/b/a OpenGlow +# Written by Scott Wiederhold +# https://community.openglow.org +# SPDX-License-Identifier: MIT """Host-side verification of the XY microstep mode wiring. The XY microstep mode is one number in the shared config, xy_microsteps diff --git a/scripts/bench/xy_pattern_accel.py b/scripts/bench/xy_pattern_accel.py index 568e9c4..699d517 100644 --- a/scripts/bench/xy_pattern_accel.py +++ b/scripts/bench/xy_pattern_accel.py @@ -1,4 +1,8 @@ #!/usr/bin/env python3 +# Copyright 2026 514 LLC d/b/a OpenGlow +# Written by Scott Wiederhold +# https://community.openglow.org +# SPDX-License-Identifier: MIT """The XY microstep modes by the head accelerometer, the machine silent (on the board). Usage: xy_pattern_accel.py [modes...] (default: 8 16 32) diff --git a/scripts/bench/z_envelope_test.py b/scripts/bench/z_envelope_test.py index 3382af5..cd3647a 100644 --- a/scripts/bench/z_envelope_test.py +++ b/scripts/bench/z_envelope_test.py @@ -1,4 +1,8 @@ #!/usr/bin/env python3 +# Copyright 2026 514 LLC d/b/a OpenGlow +# Written by Scott Wiederhold +# https://community.openglow.org +# SPDX-License-Identifier: MIT """Host-side verification that the Z envelope survives a settings write. The Z soft limit belongs to the driver, not to $20. glowforge_homing.c diff --git a/scripts/check-ui-vendor.py b/scripts/check-ui-vendor.py index f0482a1..d6c7cfe 100644 --- a/scripts/check-ui-vendor.py +++ b/scripts/check-ui-vendor.py @@ -1,4 +1,8 @@ #!/usr/bin/env python3 +# Copyright 2026 514 LLC d/b/a OpenGlow +# Written by Scott Wiederhold +# https://community.openglow.org +# SPDX-License-Identifier: MIT """The files forgetest's page shares with forgectrl's panel, byte for byte. theme.css (the OpenGlow theme on Bootstrap) and the vendored Bootstrap