6dab0f6a2c
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01NKSN3gSg4TKVBBqkwW2djR
92 lines
6.4 KiB
Markdown
92 lines
6.4 KiB
Markdown
# 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<floor gap. Managed floor
|
|
stays 0.156.0.
|
|
2. **ISO v1.25.0 rebuild + nested drill** (Part 5): once golden ≥ floor, build the pairing ISO
|
|
(gate now passes) and run the v1.24.0-style nested drill (belt present+active, apt=no-sub,
|
|
R-63 console capture, golden boots 0.161.0 with NO managed-update firing = the R-71 proof,
|
|
`.rootpw.txt` opens the console, build-gate red-proof in the nest).
|
|
|
|
## Observed / not acted on
|
|
|
|
- The live golden(0.153)<floor(0.156) gap predates this train (an old golden bake vs a later floor
|
|
lift) — the new gate surfaces it; the golden republish fixes it.
|
|
- ep0 root is reachable from DooPlex (used for the operator-tunnel + forward-rule work); the forward
|
|
rules are persisted to survive reboot.
|