107 lines
5.8 KiB
Markdown
107 lines
5.8 KiB
Markdown
# 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 `<style>` block (toggle styles) — tokens updated
|
||
in place; consolidation into style.css is a candidate for a later pass.
|
||
3. `memoryColor`/`accuracyClass` (mem-ok/warn/danger) already returned classes; their CSS is now
|
||
v2 but the class names keep their legacy spelling (grep-safe rename candidate).
|
||
4. Session store is in-memory — every deploy logs the operator out; fine for a single-operator
|
||
tool, noted for the future.
|