BRINGUP: image 20260815105250 flashed; carry the two deferred daemon items in Next work

The forgefirm-app recipe states why its packages are MIT-only.
This commit is contained in:
ScottW514
2026-08-15 07:21:17 -04:00
parent 76bf87939f
commit 21488f74fd
2 changed files with 25 additions and 5 deletions
+22 -5
View File
@@ -23,10 +23,12 @@ on the Phase 11 pins** — the first image whose license manifest declares
(root locked, no watchdog daemon, K80/K90 order, `glowforge.ko` and both (root locked, no watchdog daemon, K80/K90 order, `glowforge.ko` and both
controller binaries present) and the buildpaths QA warning gone (the shipped controller binaries present) and the buildpaths QA warning gone (the shipped
grblHAL `--version` flags string carries no host paths). Its only build grblHAL `--version` flags string carries no host paths). Its only build
warning is a stamp-taint note from an earlier forced `do_compile`. Not yet warning is a stamp-taint note from an earlier forced `do_compile`. **Flashed
flashed: the bench runs `20260814223300` plus the hot-installed Phase 11 on the bench by the operator 2026-08-15** — the board now runs the pinned
binaries, which is functionally the same userspace; flash this one when the Phase 11 userspace from the image rather than hot-installed binaries. With
next kernel/BSP change lands or before publishing. that, the audit's working files (the findings list, the remediation plan)
are retired: every finding is fixed, every deliberate leftover lives in
"Next work" below, and this runbook is the record.
**Bench campaign — opened 2026-08-14; image `20260814223300` flashed and **Bench campaign — opened 2026-08-14; image `20260814223300` flashed and
booted.** Post-flash health check passes on the board: it reports booted.** Post-flash health check passes on the board: it reports
@@ -2098,7 +2100,7 @@ accordingly ("Automatic — AP country, else World").
definition for both), so what remains is folding the tools into definition for both), so what remains is folding the tools into
the engine as modes and retiring the suspend/resume dance. the engine as modes and retiring the suspend/resume dance.
- **Rail policy** (SERVICES.md "Pulse-device ownership", the one - **Rail policy** (SERVICES.md "Pulse-device ownership", the one
`[contract, pending]` item left). `cnc/enable` / `cnc/disable` `[contract]` item left there). `cnc/enable` / `cnc/disable`
are not forgectrl-only writes yet: under the broker no client are not forgectrl-only writes yet: under the broker no client
drops the rail any more, but the GRBL driver still writes drops the rail any more, but the GRBL driver still writes
`cnc/enable` at init and at homing resume — idempotent, since the `cnc/enable` at init and at homing resume — idempotent, since the
@@ -2106,6 +2108,21 @@ accordingly ("Automatic — AP country, else World").
bounce source. (An idle-rail-off policy is not part of this: the bounce source. (An idle-rail-off policy is not part of this: the
rail stays up while the machine is on, per the wedge model in the rail stays up while the machine is on, per the wedge model in the
facts bank.) facts bank.)
- **Busy-state arbitration under one lock.** forgectrl's idle/busy
gates (`POST /settings`, `/mode`, diagnostics start, upload/apply)
each cross-check `machine_is_idle()` and `update_job_running()` at
their own call sites. They fail closed and are drilled, but a
single arbiter (one lock, one "who owns the machine right now"
answer) would replace N targeted checks with one and close the
remaining request-interleaving windows by construction.
- **HTTP surface caps.** The daemon relies on MHD's default connection
ceiling (a 500-connection flood plateaued at 379 fds under the raised
4096 `RLIMIT_NOFILE`, no crash, `cnc/state` readable throughout).
An explicit `MHD_OPTION_CONNECTION_LIMIT` plus a per-IP cap is the
right hardening, and the camera `ensure_engine` `popen()`s should
move out of the HTTP callback so a slow media-ctl can never stall the
request thread. Changing the MHD start flags touches the streaming
model, so this waits for a bench slot of its own.
- **Cloud per-job fan profile.** The cloud client passes the pulse - **Cloud per-job fan profile.** The cloud client passes the pulse
header's `AArd`/`EFrd`/`IFrd` duties to the engine as the per-job header's `AArd`/`EFrd`/`IFrd` duties to the engine as the per-job
run profile. Homing headers are verified end to end (they carry run profile. Homing headers are verified end to end (they carry
@@ -3,6 +3,9 @@
# python3-gfhardware repository. # python3-gfhardware repository.
HOMEPAGE = "https://github.com/ScottW514/python3-gfhardware" HOMEPAGE = "https://github.com/ScottW514/python3-gfhardware"
# These packages ship only the Python apps under forgefirm-app/, all MIT. The
# repository's LGPL component (the Bayer decoder compiled into
# gfhardware._cam) is not part of them; python3-gfhardware declares it.
LICENSE = "MIT" LICENSE = "MIT"
LIC_FILES_CHKSUM = "file://LICENSE;md5=62f8bb455fcc4bf177ecab380f71cd5d" LIC_FILES_CHKSUM = "file://LICENSE;md5=62f8bb455fcc4bf177ecab380f71cd5d"