The Terminal-UI interactive install ran to completion from the release image and gave 3 of 4
required observables:
1 package installed PASS ii felhom-bootstrap 1.26.0
2 unit enabled PASS wants-symlink present; postinst enabled it from the chroot
3 unit FIRED first boot PASS journal shows PAIRING mode, registering unclaimed appliance
4 box wants a claim code FAIL
/etc/felhom/ does not exist on the installed system, so felhom-bootstrap.sh cannot write the
appliance token (:431) or the pairing code (:435), and the hub poll then 401s forever. The box can
never finish pairing and the customer never sees a claim code.
ROOT CAUSE, mine: stub-first-boot.sh opened with 'install -d -m 0755 /etc/felhom /usr/local/sbin'.
This task correctly dropped the env FILE from the package and dropped the DIRECTORY with it.
felhom-bootstrap.sh uses /etc/felhom for its runtime state (token, pairing code, .bootstrap-done).
WHY THE GATE MISSED IT: G9 proves the packaged script is byte-identical to HEAD, and it is. I
verified the payload files and never the directory the payload writes into — a check that proves
the thing present and not the thing it depends on. Added as G13.
The fix is one line and is deliberately NOT applied: a failing Part 5 stops the task, and proving a
fix needs both installs re-run.
Also recorded: 'qm set --scsi0 ... --boot order=scsi0;ide2' silently yields boot: order=net0;ide2,
so a COMPLETED install looked like a machine sitting in the installer. Set --boot separately.
Nothing uploaded; R2 credentials never read. Teardown complete: VMs purged, spike5 storage removed,
demo-hp back to 6.6G, drill-r50 and 9201 untouched. Hub-side: no appliance object was created
(searched /, /hosts, /configs for the hostname — zero hits), so R-131 gains no row.
Publication is gated on Part 5 (two interactive installs proving delivery end-to-end). Neither was
carried to completion, so nothing was uploaded. Per the task: stopping is the good outcome.
BUILT: felhom-installer-1.26.0-pve9.2-1.iso
sha256 24977bafd24d73262745fc1b3040939469c9b23b87ead927a8af86de73044a90, 1705322496 bytes.
GATE (Part 6) against that exact file: G1-G10 PASS, G11/G12 not run (nothing published).
G5 by ENUMERATION vs the stock PVE ISO: exactly four added paths — three felhomtheme files and
/proxmox/packages/felhom-bootstrap_1.26.0_all.deb. G9: the packaged felhom-bootstrap.sh is
byte-identical to repo HEAD. No .rootpw.txt is emitted at all, which is G2's own evidence.
PROVEN in Part 5 before stopping: the image boots to the branded TWO-ENTRY release menu and the
Terminal-UI entry reaches the stock PVE installer. NOT proven: package installed, unit enabled,
unit fired, box asking for a claim code — on either entry. The Graphical entry was never driven.
Reporting partial observables would be the LastRun-class error this arc has corrected three times.
R2 credentials were never read, never used, never echoed; no rclone/aws config was created.
Teardown complete: VMs purged, scratch storage spike5 removed, demo-hp back to 6.6G, drill-r50 and
9201 untouched, hub-side nothing created (verified by fetching the customer list).