4.6 KiB
felhom.eu — task reports
Overwrite this file with a summary of the most recent task only (uniform with the other repos; not cumulative). The cumulative hub history lives in hub/CHANGELOG.md; the scripts history lives in scripts/CHANGELOG.md.
Reinstall-of-existing-customer arc — F2/F3/F4/2.3 (hub v0.57.0) — 2026-07-16
Closes the N100 physical-run findings (documentation/tests/VALIDATION-n100-baremetal-2026-07-16.md).
Only the hub shipped — controller + scripts unchanged (both spec premises contradicted by source,
below). Baseline: felhom.eu @ dd961a6, hub v0.56.0 → v0.57.0.
Fork verdicts (source-verified)
- 2.1 = FORK B.
hub/internal/claim/engine.go+handler.go:413-429(MarkClaimed, set-only): the hub stores the claim code + a claimed boolean, never the password hash (controller-owned by the arc's design). Fork A (hub delivers the hash) would violate the design → B (bump generation + email). - 3.1 = no controller change (spec premise contradicted).
controller/internal/agentapi/escrow.goEscrowPreflightfetches the prereq checklist live from the agent (GET /escrow/preflight); it never sourcespbs_storage_idfrom hub config. The agent seeds it on PBS-DR convergence. The fresh box "lacked" it only because F4's 403 blocked convergence — Part 0 + the demo grant restore it. No controller v0.138.0.
Part 0 — live unblock (done, reversible)
Granted FelhomAgentStore on /storage/felhom-offsite (user + token) on felhom-pve. The agent's next
tick converged: created the storage, ran felhom-pbs-apply grant, seeded escrow.pbs_storage_id,
pbsdr: converged state=applied; pvesm shows felhom-offsite pbs active. The 403s stopped.
Part 2 — hub v0.57.0 (shipped)
- F2 claim continuity —
claim.ReissueForReenroll(claimed → bump generation once + reset email; no-op unclaimed), hooked at the host-enroll mint path (single-bump-per-re-enroll). Eventclaim_reissued_reenroll. - F3 offsite continuity — the re-enroll path calls
web.ReissueOffsiteForCustomer(same machinery as the manual button; wired viaSetOffsiteReissuer). Eventoffsite_reissued. - 2.3 escrow honesty —
offsite.ReissueCredentialsmarks the escrow stale (store.MarkEscrowStale; cleared by the next ceremony); the ACK withholds the mismatchedrestic_pw_sha256; the DR checklist shows stale not "done." Eventescrow_stale.
Scenarios / red-proofs
- A (claim):
TestReissueForReenroll— claimed rotates + reset email; unclaimed no-op. PASS. - C (escrow, red-proof):
TestReissue_InvalidatesEscrow— after a re-issue the escrow is STALE and the hash is withheld. Red-proof run-fail-revert: withMarkEscrowStalegutted → FAIL ("escrow must be STALE… advertising ceremony-done against a key the repo no longer accepts"); restored → PASS. - Green gate:
go build ./... && go vet ./... && go test ./...all clean. - Deployed:
felhom-hub:0.57.0(manifestdd563a0, ArgoCD Synced/Healthy, rolled out, clean startup incl. thestale_atmigration). Controller/scripts/agent unchanged. - Scenario E (live demo): the agent's
/escrow/preflightis all 6 green —pbs_storage_id(felhom-offsite),dr_tierapplied,age_binary,hub_upload,staged_secret,sudo_grant; overallok. The wizard's start is offered. CC STOPPED — the ceremony is Viktor's step.
Observation (agent-side, recorded not acted on)
The agent seeds escrow.pbs_storage_id into agent.json on PBS-DR convergence, but the running
agent's escrow-preflight kept reporting "not configured" until a systemctl restart felhom-agent
(config reload). The seed writes the file but doesn't propagate to the live preflight path — a small
agent-reload gap to fold into the R-22 agent train.
F4 — NOT an installer fix (reported)
The DR storage id lives in the agent-domain pbs_dr descriptor (web/pbsdr.go), provisioned post-WG
— not in the installer-fetched config — so step_agent_config() can't derive it. The block is a
bootstrap circularity: the agent's token-auth pre-check GET /storage/<id> 403s and aborts before its
own root-run felhom-pbs-apply grant. Root fix is agent-side → ROADMAP R-22 (agent train); the demo
was unblocked live (Part 0). Default-storage-id customers (all new/Peti installs) already work — F4 only
bites non-default ids. Per Viktor: do NOT flip the demo's descriptor id.
NOT done
The escrow ceremony itself — Viktor's S10 step (CC's boundary is prereqs-green; CC never runs the ceremony, touches R, or mints a recovery code).