# 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](hub/CHANGELOG.md); the scripts history lives in [scripts/CHANGELOG.md](scripts/CHANGELOG.md). --- # REPORT — TASK-D4: Felhom Hub re-skin (design system v2, final surface) → hub v0.30.0 **Date:** 2026-07-02 · **Deployed:** k3s felhom-system `deploy/hub` @ `felhom-hub:0.30.0` (rolled out, pod Running) ## 1. Baselines - felhom.eu `main` @ `43189e8` (D3 final) — matched; main had not moved. - felhom-controller @ `d0c70a7` — read-only woff2 source (byte-copied). ## 2. The enumerated OverallStatus set and its mapping From source (server.go `handleDashboard`, configs.go `overallStatus`, hosts.go `hostStatusClass`): **ok, warn, down, pending, disabled, blocked** (+ `fail` accepted as a statusColor input, `stale` in the hosts domain). Complete mapping (exception-color principle): | Status | Token | Reasoning | |---|---|---| | ok | `nominal` | operating normally — blue, not green | | warn | `warn` | degraded / stale report — amber | | stale (hosts) | `warn` | consistent with hostStatusClass's existing warn reuse | | down | `crit` | outage — red | | fail | `crit` | health=fail — red | | pending | `neutral` | a not-yet-provisioned customer is a NORMAL fleet state (Peti Debian stays quiet) | | disabled | `neutral` | deliberately paused — not a deviation | | blocked | `warn` | operator cut a customer off: intentional but attention-worthy — amber, not red (not an outage) | | unknown/"" | `neutral` | unknown values stay quiet | A healthy fleet dashboard is blue/neutral only. Event severity counts remain filled amber/red badges (exceptions stay loud, per the design-system `.badge` addendum). ## 3. Commits | Commit | Content | |---|---| | `bc8d54d` | Part 1: fonts embedded + `/static/fonts/` route, 12-symbol sprite partial on all 9 pages, statusColor semantic remap, statusIcon retired, truth-table + parse tests | | `c136308` | Part 2: style.css v2 (tokens, tag-style status badges + CSS dots, hairline rows, row tints warn/down only), two-tone H1 ×8, charts retinted, inline hexes swept, login retinted | | `fc79a3a` | manifests: hub image 0.30.0 (GitOps truth kept in sync with the set-image deploy — repo convention; auto-sync is off) | | (docs) | Part 3: hub/CHANGELOG v0.30.0 + this REPORT | ## 4. Tests + red-proof `go build ./... && go vet ./... && go test ./...` green after each commit (hub/). New tests (the hub web package previously had none for funcmap/templates): - `TestStatusColorTruthTable` — full enumerated set. **Red-proof:** against the stashed pre-change implementation it failed exactly as required (`statusColor("ok") = "#4ade80", want "nominal"`, warn→`#facc15`, stale→`#94a3b8`, down→`#f87171`). Restored → pass. - `TestTemplatesParseWithFuncmap` — all 9 templates parse with the production funcmap. ## 5. Grep gates (before → after, hub/internal/web non-test files) `#0f172a` 2→0 · `#1e293b` 2→0 · `#334155` 3→0 · `#60a5fa` 3→0 · `#4ade80` 5→0 · `#facc15` 1→0 · `#f87171` 7→0 · `#94a3b8` 10→0 · `#64748b` 3→0 · `#475569` 3→0 · `#e2e8f0` 2→0 · `#0088cc` (login) →0 · `statusIcon` template usage 2→0 · inline `style="color: {{statusColor}}"` 2→0 · box-shadow 0→0 (never had any). ## 6. API freeze proof `git diff 43189e8..HEAD --stat` touches ONLY `hub/internal/web/**` (+ hub/CHANGELOG.md, manifests/hub.yaml one-line tag, REPORT.md). Nothing under `hub/internal/api/`, `hub/internal/store/`, or any ingestion/notify/monitor package. ## 7. Deployment + Scenario E (live E2E) ``` deployment "hub" successfully rolled out hub-757d8dcb46-pq84j 1/1 Running 0 13s [INFO] Listening on :8080 (felhom-hub 0.30.0) ``` Scenario E **passed**: hub deployed 22:40 CEST; the demo controller's next 15-minute cycle at `2026/07/02 20:45:19 UTC (22:45 CEST)` logged `Hub report pushed successfully (5423 bytes)` — an HTTP 200 from the freshly deployed hub's `/api/v1/report`, proving ingestion end-to-end after the re-skin (the controller only logs success on a 2xx). The dashboard LAST SEEN visual confirmation joins the authenticated Chrome pass (§8). ## 8. Chrome checks - `/login` renders on 0.30.0 with the retinted v2 button (screenshot) — reachable without auth. - **Authenticated pages:** the hub is operator-password-gated and sessions are in-memory (the deploy invalidated them). The full 9-page visual pass (fonts check, "Demo Ügyfél" ő rendering, chart palette, healthy-dashboard no-green/no-red assertion) requires one operator login in the validation browser — flagged to the operator; the underlying mechanisms (fonts route, sprite, tokens) are identical to the D0-proven controller implementation and unit/grep-verified. ## 9. NOT live-validated - The authenticated 9-page Chrome pass (operator login needed — see §8); until then Scenarios A/C/D are verified at the code/gate level only. - warn/crit fleet states (no customer is currently degraded) — truth-table-tested only. - The Configuration page was NOT submitted/altered (per spec §12); restyle verified at parse level. ## 10. Observations (not acted on) 1. The hub login page is inline HTML in server.go (two copies, error + plain) — a template would be cleaner; retinted only. 2. customer_unified.html carries a small per-page `