# REPORT — ISO train v1.25.0 + hub v0.73.0 (2026-07-23) **Task:** the four-ruling ISO train (F9 belt-everywhere, apt no-subscription, R-63 console ő/ű, R-71 golden-lift mitigation) + Part 6 root-vault rider + Part 7 hub `offsite_stale` fix. scripts: host-install **1.17.0→1.18.0**, build-felhom-iso **1.24.0→1.25.0**, felhom-bootstrap R-63; hub **v0.72.0→v0.73.0**. Commits: `b620435` (scripts code), hub `0.73.0` train, docs follow. ## Status by part | Part | State | |---|---| | **7 — hub `offsite_stale` newborn anchor** | ✅ SHIPPED + deployed (hub v0.73.0, Synced/Healthy); red-proofed; live: demo-hp/demo-felhom silent | | **1 — OOB belt (F9)** | ✅ code (default appliance leg) + **LIVE on BOTH boxes** + **login PROVEN on felhom-pve** | | **2 — apt no-subscription** | ✅ code + **LIVE aligned on both boxes** (`apt-get update` clean) | | **3 — R-63 console font** | ✅ code (Lat2 font, verified font names) — nested-render proof pending the drill | | **4 — R-71 build-gate + rule** | ✅ code + red-proofed + **LIVE-demonstrated blocking the real gap**; standing rule 5 added | | **4 — golden republish** | ⏳ **REQUIRED NEXT** — see the critical finding below (blocks a valid v1.25.0 ISO) | | **5 — ISO rebuild + nested drill** | ⏳ gate-blocked until golden lifted; drill pending | | **6 — felhom-pve root vault** | ✅ rotated + vaulted + **verified authenticating over :22** | ## CRITICAL FINDING — the R-71 gap is LIVE in production right now The hub's current artifacts are **golden 0.153.0 < managed floor 0.156.0**. Every fresh install today boots a controller BELOW the floor, so the day-0 managed update fires within minutes — the exact update-vs-bridge race that burned demo-hp's offsite credential (DIAG-f10 / R-71). The new build-gate **correctly refuses** to build a v1.25.0 ISO in this state (demonstrated live: `R-71 BUILD GATE FAILED: golden 0.153.0 < managed floor 0.156.0`). **The fix is Part 4's golden republish at controller 0.161.0 + vouch** — until then no valid pairing ISO can be built, by design. The vouch (`handleSetArtifacts`) is operator-password-gated (no admin API), so it needs the operator. ## Part detail **Part 1 (belt).** host-install: appliance mode installs the H1 belt by default (`--no-oob` opts out; byo still refuses `--enable-oob` — deliberate exclusion, flagged not changed), and the config writer now sets `oob.enabled=true` so the agent activates the belt instead of leaving the units inert (the pre-v1.25.0 state that left it unusable — F9). Lockout-safe with no operator peer (empty sets + no key, `:22` untouched). **Live:** belt installed on felhom-pve + demo-hp (both 8822, sets filled `{10.77.0.250}`/`{8822}`, felhom-op key installed, `:22` pid unchanged). **Login PROVEN on felhom-pve** end-to-end (`felhom-op@demo-felhom`) — see the operator-identity note below. **Operator identity re-established (latent gap fixed).** The registered `oob_operator_ssh_pubkey` was ORPHANED — it matched no key the operator held (an OOB credential the operator can't reproduce is no better than the lockout it prevents). Re-anchored to the operator's real machine: registered its WireGuard pubkey as the operator peer `10.77.0.250` + its `felhom-op-1` SSH key, built the operator wg-felhom tunnel config (`ep0.felhom.eu:443`), added + persisted ep0's `forward` rules (`10.77.0.250 → 10.77.0.2/.3` in `/etc/nftables.conf`). Along the way: a corp-network UDP/443 block was diagnosed (ep0 tcpdump — packets arriving on 51820 but not 443) and the login completed from a home network on 443. All secrets file→file, shredded. **Part 2 (apt).** `align_apt_repos` (appliance-only, idempotent, pre-apt): disable enterprise deb822 `.sources` (`Enabled: no`) / legacy `.list`, add `pve-no-subscription.sources` (suite+keyring derived), `apt-get update` clean. **Live:** both boxes were on enterprise (401 on update); aligned → enterprise+ceph disabled, no-subscription added, `apt-get update` exit 0 on both. **Part 3 (R-63).** felhom-bootstrap loads a Latin-2 console font (`Lat2-Terminus16` → `Lat2-Fixed16` → `Lat2-Terminus14`) once before the first paint (idempotent, best-effort, never blocks boot). Font names verified present in the trixie console-setup package. Renders ő/ű in the R-59 network screen (élő/telepítő/ellenőrizze) + pairing banner (képernyő/teendő). Nested-console capture pending drill. **Part 4 (build-gate + rule).** `assert_golden_ge_floor` + `ver_ge` in build-felhom-iso; runs before workspace/mint; `die`s with both versions on `golden < floor`; `FELHOM_ASSERT_GOLDEN/FLOOR` inputs; unset warns loudly. Red-proofed both directions (floor>golden → exit 1; golden≥floor → OK; equal → OK; unset → WARN). Standing rule 5 in `publish-train-rules.md`. Live-demonstrated against the real production gap (see above). **Part 6 (root vault).** On felhom-pve, generated a fresh strong root password (never printed), `chpasswd`, vaulted via `PUT /api/v1/hosts/demo-felhom-8363b5/recovery-credential` (HTTP 200, the same day-0 `step_break_glass` mechanism, host api_key). Verified: retrieved via the operator endpoint (global key) and it AUTHENTICATED root over `:22` (`VAULT-AUTH-OK: demo-felhom`); copy shredded. felhom-pve now has G1 vault parity with demo-hp. (Note: the vault's `set_at` reflects the original day-0 stamp — not bumped on rotation; cosmetic, the SECRET is the rotated one, proven by the auth test.) ## Remaining (the two heaviest legs, now enforced-sequenced) 1. **Golden republish** (Part 4): `build-golden.sh 9100 … gitea.dooplex.hu/admin/felhom-controller:0.161.0` on a Proxmox host → publish to Gitea → **operator vouches** `artifact_golden_version=0.161.0` + sha in the manifest UI (password-gated). This closes the LIVE golden