6.3 KiB
REPORT — v0.170.0: root→Indítópult; gofmt normalization; stale-note; gate-denial check; SMART spike
Date: 2026-07-25 · REPORT overwritten (the standing rule; the prior append was a sanctioned one-off).
1. Baselines
| Repo | main @ start |
version | → |
|---|---|---|---|
| felhom-controller | 0a582ea |
v0.169.1 | v0.170.0 |
| felhom.eu | e49f20f |
— | docs-only |
Re-verified clean at start.
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).
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.
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.
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>, navhref="/dashboard" class="active".GET /launcher→ 200, navhref="/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:
local(system SSD) → UNKNOWN: it's adiron LVMpve-root;backing_deviceis empty andsmartDeviceForhas no dm/LVM branch, so/→pve-root→sda3→sdais never resolved.- USB
sdb→ ABSENT: surfaced only via the non-enricheddriveTargets.Knownunion path (setsbacking=/dev/sdbbut never callsenrich).
-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/dashboardin 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.