hub v0.45.0: floor-UI separation + effective-floor source + per-box MinAgent conditional floor

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PSK5g6qYLknKj8u3QAFEr6
This commit is contained in:
2026-07-11 15:33:14 +02:00
parent 37e60b46d2
commit bbecf0592e
15 changed files with 730 additions and 44 deletions
+27
View File
@@ -1,5 +1,32 @@
# Felhom Hub — Changelog
## v0.45.0 — floor-UI separation + effective-floor source + per-box MinAgent conditional floor (2026-07-11)
Two parts of the NAS/coupling backlog, both addressing the publish-train 0.81/0.113 floor footguns.
- **Floor-UI separation + confirm (Part C):** the global controller-version floor is its own card with
a **type-to-confirm** dialog that first states the live blast radius —
`GET /configuration/global-floor/impact?v=X.Y.Z` (`countBoxesBelowFloor`, honoring per-customer
overrides) — so "the floor acts immediately" is impossible to miss. An **effective-floor + source
line** (`store.ResolveGlobalFloor``GlobalFloorResolution`) shows the resolved value and WHICH
source won (**DB `hub_settings`** vs **env `DEFAULT_MIN_CONTROLLER_VERSION`**, both raw values when
they differ) — the 9-minute-skew incident's root cause, now permanently visible. The Day-0 artifact
manifest save is unchanged and provably does NOT touch the floor (regression-tested).
- **Per-box MinAgent conditional floor (Part D):** the artifact manifest gains **`MinAgent`** (the
golden's controller `MinAgent:` header; blank = uncoupled, no gating). At report-ACK time
`store.ResolveManagedFloor(customerID)` compares the box's `hosts.agent_version` against it: agent ≥
MinAgent → the controller floor is served; below **or unknown** → the floor is **HELD** (ACK omits
the directive) and the box is flagged on the Hosts dashboard (`floor held: agent <v> < MinAgent
<w>`). Mechanises the "agent BEFORE controller floor" rule per box — the manual fleet check is
retired (publish-train-rules.md rule 3 updated).
- **THE one comparator:** `web.compareVersions`'s body moves to a leaf `internal/semver` package
(`Compare`/`Valid`); web delegates, store's MinAgent gate reuses it (no import cycle, no second
comparator; gitea's documented local copy is out of scope).
- Tests + red-proofs: floor source precedence (DB-wins), manifest-save-doesn't-touch-floor,
impact-count with override exclusion, source-line render; managed-floor hold/serve/uncoupled/
unknown-agent + a fleet discriminator + the report-ACK wire test (held box omits the floor, served
once the agent qualifies). Every red-proof run → predicted failure → reverted.
## v0.44.0 — PBS DR tier SLICE 1: ep0 tenantsync surface + hub provisioning (2026-07-10)
Builds on SPIKE-pbs-tier-provisioning (00afadc). The operator ticks "PBS DR tier (ep0)" on a