4ba1b144d6
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01PSK5g6qYLknKj8u3QAFEr6
5.0 KiB
5.0 KiB
REPORT — build-golden.sh v2.0.0: golden 0.98.3 rebuild (drill B5 + B1)
Date: 2026-07-03 · Class: implementation + clean-room drill (script-only — no Go code, no
binary, no agent version bump; docs-only precedent) · Source findings:
felhom.eu/documentation/audits/DRILL-day0-cleanroom-2026-07-03.md B5/B1 + the stale backlog note
FOLLOWUP-golden-default-controller-tag.md (now resolved). Full drill evidence:
felhom.eu/documentation/audits/DRILL-golden-098-2026-07-03.md.
Baselines & commits
| What | Value |
|---|---|
| Base | c9f963d |
| Script commit | ceca355 — configs/build-golden.sh v2.0.0 + CHANGELOG |
| Docs commit | (this one — REPORT/CONTEXT) |
| felhom.eu | guide/ledger/backlog/evidence-doc push (see that repo's REPORT) |
| Controller tag baked | 0.98.3 (reconfirmed current: CHANGELOG top + manifest HTTP 200 pre-bake) |
What changed (configs/build-golden.sh only)
- B5 — CONTROLLER_IMAGE (arg 6) MANDATORY: no default; missing → die with usage naming the
convention. Rationale in-file: the hand-bumped default rotted twice (0.43.0 → 0.85.1 → stale
again); a required arg cannot rot; auto-"latest" could bake an unvouched tag. Red-proof: the
no-arg invocation exits 1 with the usage BEFORE any
pctop (run locally + in the drill VM). - B1 — baked
felhom-controller-bootstrap.path(PathExists=/etc/felhom-bootstrap/bootstrap.json, enabled,WantedBy=multi-user.target): starts the Condition-gated oneshot service when the agent back-half hot-plugs the bootstrap mount into the RUNNING guest. Service unchanged (RemainAfterExit=yesprevents re-trigger loops; the enabled service still covers the plain boot case). The mp0/mp1 vzdump-inclusion guards untouched. GOLDEN_SCRIPT_VERSION=2.0.0+[golden]provenance line (script version + baked tag) opening every bake transcript. Gates:bash -nclean; usage renders.
Clean-room validation (drill VM on 192.168.0.180, virgin-restored per scenario)
| Scenario | Result |
|---|---|
| A — bake integrity | PASS: provenance line; controller 0.98.3 + infra images baked; docker logout + config.json removal before archive (line present, ran); vzdump including mp0 AND mp1; archive 583 MB, sha256 b9a02ef1b6f02b9b58babc4c6aad9cf6c053ebdfba116c78c8e7830de757fd01; guest 9100 destroyed |
| B — isolated hot-plug (STOP gate) | PASS: fresh restore w/o mount → service inactive (dead) condition-unmet, path active (waiting); back-half-identical pct set -mp9 …,mp=/etc/felhom-bootstrap,ro=1 on the RUNNING guest → service SUCCESS ~1 s later, controller Up (healthy) 0.98.3, uptime -s unchanged (no reboot) |
| C — local-golden Day-0 (publish gate) | PASS: served installer v1.9.1, canonical command w/o --force-gitea-golden → [SKIP] using local golden (resolution order); first boot controller 0.98.3, NO D.1b; selfupdate/check → update_available:false (self-manages); selftest all-OK incl. pool read; bentopdf deployed via the dashboard endpoint → 200 via traefik; hub rows: agent 0.63.0 / controller 0.98.3 |
| Publish | PUT …/felhom-golden/0.98.3/golden.tar.zst → 201; round-trip GET sha matches (publish-agent.sh pattern mirrored) |
| Vouch | operator vouched golden 0.98.3 in the Day-0 manifest (agent 0.63.0 already vouched — the v0.63.0 follow-up is DONE); confirmed via /api/v1/artifacts |
| D — published-artifact Day-0 | PASS: virgin box, no local golden → fetching golden v0.98.3 from Gitea → verified sha256 b9a02ef1… matches the hub manifest → SUCCESS; first boot 0.98.3; up-to-date. The exact fresh-customer path |
Cleanup: all drill-1 hub rows deleted (8 tables, counts 0; demo-felhom/peti-felhom intact); drill VM
reverted to virgin and kept; bake credential env (0600) removed. Registry read-cred handled via
env only — never logged/committed.
Deviations & observations
- Premature publish (caught + corrected): the script's opt-in publish block triggers on the same
REGISTRY_*vars the pull needs — the Scenario A bake published immediately, before the Scenario C gate. Package DELETEd (204, anon 404 verified) and re-published only after C passed. Candidate cleanup (not done — no-"while-here" rule): a separateGOLDEN_PUBLISH=1opt-in. - SECURITY (operator follow-up): the pull credential — the demo customer's
git.token, i.e. what every customer box holds — turned out to be a Gitea admin token with package-WRITE (the premature publish proved it). Scope down to read-only + rotate. - Installer v1.9.1's post-provision reboot is now a redundant belt (the path unit deploys first) — removal recorded as a candidate installer cleanup, kept for now.
- Drill-env:
dhcpstart=10.0.2.30+ explicithostfwd…-10.0.2.15:22on the QEMU command removes the prior drill's slirp IP-collision quirk entirely. - Guide follow-through (felhom.eu): D.1b retired to a one-line version check; troubleshooting row covers pre-0.86.0 goldens; ledger B1/B5 FIXED; backlog note resolved.