v0.171.0: REPORT (overwrite) — device-model card labels live on 9201
This commit is contained in:
@@ -1,88 +1,34 @@
|
||||
# REPORT — v0.170.0: root→Indítópult; gofmt normalization; stale-note; gate-denial check; SMART spike
|
||||
# REPORT — v0.171.0: disk-health card device-model label (2026-07-25)
|
||||
|
||||
**Date:** 2026-07-25 · **REPORT overwritten** (the standing rule; the prior append was a sanctioned one-off).
|
||||
**Overwritten** per the standing rule. Pairs with agent v0.95.0 (SMART coverage); the R-50
|
||||
island-bridge spike lives in felhom.eu.
|
||||
|
||||
## 1. Baselines
|
||||
| Repo | `main` @ start | version | → |
|
||||
|------|----------------|---------|---|
|
||||
| felhom-controller | `0a582ea` | v0.169.1 | v0.170.0 |
|
||||
| felhom.eu | `e49f20f` | — | docs-only |
|
||||
## Baseline → target
|
||||
felhom-controller `de14eed` (v0.170.0) → committed **`f6a8249`** (v0.171.0). Deployed to guest 9201.
|
||||
|
||||
Re-verified clean at start.
|
||||
## What shipped (additive)
|
||||
- `agentapi.SmartSummary` gains `ModelName` (mirrors agent v0.95.0 `model_name`, omitempty).
|
||||
- `diskDisplayLabel` (disk_health.go) now **prefers the device model** over the raw storage name/UUID,
|
||||
falling back to `Name` (+ speed hint) on an older agent or a modelless disk. Old-agent payloads render
|
||||
exactly as before.
|
||||
- Files: `internal/agentapi/client.go`, `internal/web/disk_health.go`, `+_test.go`, CHANGELOG.
|
||||
|
||||
## 2. Commits (feature commit NOT squashed with the gofmt commit — Scenario B)
|
||||
- **`2487681`** — `style: gofmt normalization — no logic changes` (commit 1, style-only).
|
||||
- **`9cc8424`** — `v0.170.0: root → Indítópult (302); Vezérlőpult at /dashboard; CLAUDE.md stale-note fix` (commit 2, feature).
|
||||
- **felhom.eu `770ee5a`** — the SMART-coverage spike doc (+ nothing else).
|
||||
## Tests + red-proof
|
||||
`go build/vet/test ./...` — **27 packages pass, 0 fail**; template/emoji/mojibake gates OK.
|
||||
`TestDiskDisplayLabel_PrefersModel`: model present → model label; old agent / nil model → Name(+hint)
|
||||
(A4 tolerance). Red-proof: drop the fallback (always return ModelName) → the old-agent/nil cases return
|
||||
"" and the test fails.
|
||||
|
||||
## 3. Part 1 — Root → Indítópult
|
||||
`server.go` route split: `"/"` → `http.Redirect(…"/launcher", 302)`; `"/dashboard"` keeps the handler.
|
||||
`layout.html`: Vezérlőpult `href="/dashboard"` (topbar logo keeps `/` → redirects to launcher).
|
||||
`auth.go` unchanged (post-login default `/` flows through the redirect to the launcher — verified).
|
||||
Two dashboard-card tests repointed `/`→`/dashboard`.
|
||||
- Tests (all pass): `TestRoot_RedirectsToLauncher` (302 + `Location: /launcher` + no launcher body at `/`),
|
||||
`TestDashboard_ServedAtDashboardURL` (200), `TestNav_LauncherAndDashboardHrefsAndActive`.
|
||||
- **Red-proof (recorded):** fold `/` back into the dashboard case → `GET / status = 200, want 302` — FAIL, then restored.
|
||||
## LIVE acceptance (guest 9201, with agent v0.95.0) — the operator's complaint reversed
|
||||
Deployed `0.171.0` → Up (healthy). The "Lemezek állapota" card now shows BOTH physical disks with
|
||||
**real verdicts + human model labels**:
|
||||
- **"AirDisk 512GB SSD" → Rendben, 34 °C** (the system SSD — Fix A resolved the LVM root).
|
||||
- **"TOSHIBA MQ04ABF100" → Rendben, 30 °C** (the USB — Fix B + the model label).
|
||||
|
||||
## 4. Part 2 — gofmt normalization (46 files)
|
||||
`gofmt -w` across the controller tree; `gofmt -l` now **empty**. Pure formatting: whitespace +
|
||||
optional-semicolon removal in reflowed inline closures. **One caveat handled:** this system's Go-1.26
|
||||
`gofmt` doc-comment reformatter rewrites `''`→`”` in doc comments; it hit exactly one comment
|
||||
(`app_export_domain_test.go`, "yields ''") — reworded to "yields the empty string" so the result is
|
||||
gofmt-clean without a garbled quote. Build+vet+test green before and after; separate prior commit.
|
||||
No raw UUIDs, no "Nincs adat". `/disks` carries `smart.health=PASSED` + `model_name` for both (see the
|
||||
agent REPORT). The capability-map row was upgraded to PROVEN-LIVE (healthy path + delivery).
|
||||
|
||||
## 5. Part 3 — CLAUDE.md stale note
|
||||
Corrected the "vacation — agent DOWN at a remote site" block: felhom-pve is back on the home LAN, the
|
||||
agent is **up** (`localapi` binds `192.168.0.162:8443`, `active`, capabilities 68/68), Tailscale alias
|
||||
still available. (Inside the feature commit.)
|
||||
|
||||
## 6. Green gates + build/deploy
|
||||
`go build ./... && go vet ./... && go test ./...` — **27 packages pass, 0 fail**; template/emoji/mojibake
|
||||
gates OK. Built `felhom-controller:0.170.0`, deployed to guest 9201 → **Up (healthy)**,
|
||||
`Controller elindult (0.170.0)`.
|
||||
|
||||
**Live (authed curl to `172.17.0.2:8080`, `Host: felhom.demo-felhom.eu`, login 302):**
|
||||
- `GET /` → **302 → /launcher**.
|
||||
- `GET /dashboard` → **200**, renders `<h2>Vezérlőpult</h2>`, nav `href="/dashboard" class="active"`.
|
||||
- `GET /launcher` → **200**, nav `href="/launcher" class="active"`.
|
||||
|
||||
## 7. Part 4 — Quiesce gate-denial live check (v0.168.0 caveat)
|
||||
**The v0.168.0 blocker (agent down) is GONE** — the agent is up and the gate is **code-live on 0.170.0**;
|
||||
the quiesce loop is polling (`[quiesce] loop started (poll 5m0s…)`). **But the denial line is not
|
||||
capturable right now**, for a *different* reason: the gate is only reached when a backup is **due**, and
|
||||
the demo box is **within its cadence window** — `/backup/due` → `{"due":false,"reason":"within cadence
|
||||
window","age_seconds":38260}` (~10.6 h since the last backup; default cadence `backup_cadence_seconds:0`
|
||||
≈ 24 h). The debug ring (always-on for DEBUG) confirms **zero** quiesce gate lines. Also, "now"
|
||||
(07:46 CEST) is *inside* the window `[04:30, 08:30)`, so even a due poll would ALLOW, not deny.
|
||||
|
||||
Forcing `due=true` would require changing the agent's `backup_cadence_seconds` — an **agent config
|
||||
change, forbidden** by this task (read-only host). So the capture is **timing-gated**: the line will
|
||||
emit on the next **due + outside-window** poll (next due ≈ this evening; any poll after `08:30` while
|
||||
due denies). **The gate itself is fully unit-proven** (v0.168.0 Group D: outside→defer, safety-valve,
|
||||
manual-never-gated). **Nothing was enabled or changed** — logging stays `info`, the window stays default
|
||||
`02:30`; no restoration needed. *This is the one item I could not fully close in-session; it needs a
|
||||
timed capture (operator, or a scheduled check) when the box is next due outside its window.*
|
||||
|
||||
## 8. Part 5 — SMART-coverage spike (findings-only, STOP)
|
||||
Full doc: `felhom.eu/documentation/audits/SPIKE-smart-coverage-2026-07-25.md`. Read-only probes on
|
||||
`demo-felhom` (a **real** N100, not virtualized). **Both physical disks report PASSED** via the exact
|
||||
allowlisted `smartctl -a -j <dev>` (system SSD `sda` "AirDisk 512GB SSD"; USB HDD `sdb` "TOSHIBA
|
||||
MQ04ABF100"). The card shows "Nincs adat" because the **agent never reads** them:
|
||||
1. **`local` (system SSD) → UNKNOWN:** it's a `dir` on **LVM `pve-root`**; `backing_device` is empty and
|
||||
`smartDeviceFor` has **no dm/LVM branch**, so `/`→`pve-root`→`sda3`→`sda` is never resolved.
|
||||
2. **USB `sdb` → ABSENT:** surfaced only via the **non-enriched `driveTargets.Known` union path** (sets
|
||||
`backing=/dev/sdb` but never calls `enrich`).
|
||||
|
||||
`-d sat` is **not needed** (the bridge passes SMART through with `-a -j`) and **not in sudoers** anyway
|
||||
(only `-a -j /dev/sd[a-z]*` etc. are granted). The `by-uuid` symlink hypothesis doesn't apply (backing
|
||||
is already the resolved `/dev/sdb`). **Graded fix directions (do-not-implement):** **B** — enrich the
|
||||
union path (LOW risk, reaches the USB) **first**; **A** — dm/LVM resolution (MEDIUM risk, multi-PV care,
|
||||
reaches the SYSTEM disk) **second**; **C** — `-d sat` + sudoers widening **rejected** (disproven here).
|
||||
**STOP — no fix, no agent/sudoers/manifest change.**
|
||||
|
||||
## 9. Observations (out of scope)
|
||||
- The `catchall.html` "Vezérlőpult" button uses `{{.ControllerURL}}` (the controller base URL) — it now
|
||||
lands on the launcher via the `/` redirect. A pre-existing label/destination nuance on a fallback page;
|
||||
left as-is (out of scope). Reword to "Indítópult" or point it at `/dashboard` in a future polish.
|
||||
- The v0.170.0 image gives the whole disk-health feature a real-hardware home once the SMART-coverage
|
||||
fix (Part-5 directions) ships — the card will flip from "Nincs adat" to real PASSED verdicts.
|
||||
## Observations
|
||||
- A live FAILING/Figyelmeztetés verdict still needs a genuinely degrading disk (both demo disks are
|
||||
healthy) — that arm stays unit + red-proof covered; the notification delivery path is separately
|
||||
live-proven (hub 400→200 + email, 2026-07-24).
|
||||
|
||||
Reference in New Issue
Block a user