# REPORT — v0.94.0: serialize per-disk SMART into /disks (2026-07-24) Part of the **disk-health** cross-repo train (agent v0.94.0 + controller v0.169.0/.1 + hub v0.73.1). Appended above the previous report (kept below). **Baseline:** felhom-agent `c230258` (v0.93.0) → committed `21fee69` (v0.94.0). Re-verified clean at start. **Change (additive, backward-compatible; MinAgent floor unchanged):** `localapi.DiskInfo` gains `Smart *hub.SmartSummary \`json:"smart,omitempty"\``, copied from the target's already-computed Observe-time enrichment **only when `t.Smart.Health != ""`** — a zero-value summary (SMART never read) stays omitted so the controller sees "absent" and renders "Nincs adat". No new smartctl load, endpoint, or sudoers change. Files: `internal/localapi/disks.go`, `internal/localapi/disks_smart_test.go` (new), `CHANGELOG.md`, `CONTEXT.md`. **Tests:** `TestDisks_SmartSerialized` (fixture target's SATA counters + temperature present; an absent-SMART target omits the field). Red-proof: drop the `di.Smart = &sm` copy → "smart not serialized" FAIL (confirmed). Full agent suite: 29 packages pass, 0 fail; build + vet clean. **Deploy + live validation (demo host `demo-felhom`):** the vacation note was stale — the agent is **up and reachable** (binds `192.168.0.162:8443`). Built `felhom-agent-0.94.0` (ldflags), scp'd, backed up `.bak-0.93.0`, `install`-ed, restarted → **active**, `--version` 0.94.0, capabilities 68/68 degraded=0, local-api listening. **§13(1) live:** the authed `/disks` payload now carries the `smart` object — dir-backed targets show `smart.health` (UNKNOWN on this virtualized demo hardware), the USB (union-path) target omits it. The field is live end-to-end; the controller consumes it (see the controller REPORT). Binary published: image tag on the registry via the publish flow is a follow-up if a fleet-wide agent republish is wanted — the code + live-deployed binary on demo-felhom prove the field. --- # REPORT — v0.93.0 publish train executed: built, published, vouched, deployed fleet-wide (2026-07-22) **The previous report's "NOT built or deployed" line dies here.** v0.93.0 (hyphen-free escrow wordlist, `a452dc33`, red-proofed 2026-07-21) is now the fleet agent. No code changed this train — this was the build/publish/deploy leg. Full operational record: `felhom.eu/documentation/pilot/RUNBOOK-publish-agent-0.93-2026-07-22.md`. ## Confirmed baselines (re-verified at live source before acting) - `main` = `eba040d0` = origin/main, clean tree; v0.93.0 delta vs 0.92.1 = escrow code + tests + docs only, **no `configs/` change** → binary-only deploy (sudoers/wrapper untouched). - Both boxes 0.92.1 + active (hub `hosts` table AND direct `--version`); Day-0 manifest agent 0.92.1/`7424bc1c…`; floor 0.156.0; hub 0.70.0; package `felhom-agent/0.93.0` = 404 pre-publish. ## Artifact ``` AGENT_VERSION=0.93.0 AGENT_SHA256=a68b2ff73200622ea9e23aed71a0a8ff885808626cab9e9d554a5a5df5ced28f (13 817 690 bytes) ``` Built on DooPlex from `eba040d0` (`CGO_ENABLED=0`, ldflags version); published via `scripts/publish-agent.sh` (pre-delete 404 → PUT 201 → round-trip sha match); **sha-chain identical at three independent points** incl. an anonymous GET of the package URL. ## Tests Green gate on the exact built HEAD: `go build ./... && go vet ./... && go test ./...` — green. **The formerly-flaky escrow package: `-count=10` fresh → 10/10 pass (135.2 s).** The ~1/5 flake WAS the hyphenated-word defect (see the 2026-07-21 report), so a clean 10× run is direct evidence the fix is in the built artifact. ## Manifest vouch (rule 1 — before any box moved) Viktor saved Day-0 artifacts (password-gated UI, the train's one STOP); CC verified in the live hub DB before deploying: agent **0.93.0 / a68b2ff7…**. Golden, floor and wrapper sha **byte-identical before/after** (0.153.0 / 0.156.0 / `104db0a4…`). **Deviation, ruled:** MinAgent moved 0.92.1→0.93.0 at the save (spec said do-not-touch); flagged before deploy, ruled leave-as-is — transient held-floor window only, both boxes already ran controller ≥ floor. ## Deploys — felhom-pve first, then demo-hp Channel per the 0.90 train: scp one hop → on-box sha256 verify (= `a68b2ff7…` both) → `.bak-0.92.1` → `install -m0755` → restart. demo-hp reached over the hub-vaulted G1 break-glass (no key baked; secret handled file→file via `SSH_ASKPASS`, shredded after, never printed). Per-box clean-restart verification — **5/5 green on both** (journal times host-local CEST): | Check | felhom-pve (restart 06:56:49Z) | demo-hp (restart 06:57:48Z) | |---|---|---| | active / no restart loop | ✅ active, NRestarts=0, clean startup `version=0.93.0` | ✅ same | | capabilities | ✅ 68/68 ok, degraded=0, inactive=0 | ✅ 68/68 ok, degraded=0, inactive=0 | | ReassertGuestBinds | ✅ only enrolled `uuid:47a3361a…` (`/mnt/hdd_1`→9201) | ✅ only enrolled `uuid:91d2dc2d…` (`/mnt/nvme-1tb`→9201) | | guestnet sweep | ✅ watchdog up; sweeps quiet, 0 ERROR/WARN since restart | ✅ same | | hub `agent_version` | ✅ 0.93.0 (report at startup, 06:56:52Z) | ✅ 0.93.0 (06:57:52Z) | Escape hatch not needed; `.bak-0.92.1` retained on both boxes. `peti-felhom` deliberately not deployed to (down; gets 0.93.0 via Friday's reinstall + the vouched manifest — by design). ## Explicit statements (per the train spec) - Controller floor and MinAgent handling: floor **byte-identical** before/after (0.156.0); golden entry byte-identical; MinAgent's 0.93.0 value is the one ruled deviation above. - No escrow ceremony was run as "verification" — the proof is the generation-path tests + version reporting, per the spec. - This train discharges `RUNBOOK-onboarding-draft-v4.md` §A item 5 (agent ≥ 0.93.0 box-side before the first real tester's escrow ceremony) — annotated there. ## Observations (recorded, not acted on) - The spec's "ROADMAP wordlist row" does not exist in `felhom.eu/documentation/backlog/ROADMAP.md`; the gate discharge was annotated at its real home (onboarding runbook §A5) instead. - demo-hp's 1TB NVMe is now **enrolled** (reasserted into 9201) — TASK-H's "unenrolled/NTFS, do not touch" note is outdated. - demo-hp remains key-less; break-glass deploy worked cleanly. Tailnet key-expiry toggle still open. - CONTEXT.md's stale "agent DOWN at remote site / deployed 0.90.0" bullet superseded this train.