c37ee6d43a
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
6.2 KiB
6.2 KiB
REPORT — TASK A storage-lifecycle cleanups → controller v0.64.0 (2026-06-14)
Two settings-layer cleanups (A1, A2) + two doc-only changes (A3, A4) from the F9 storage-registration
diagnosis. Trunk-based, all on main, no branches. Each code change has a table-driven test that fails on
the pre-fix code. Built, pushed, and deployed to demo guest 9201; verified :0.64.0 Up (healthy) with a
clean startup (controller_started (0.64.0), no errors).
Verify against pushed source, not this report.
Pre-flight
main is the only branch in felhom-controller; HEAD was 688ba0d v0.63.0 (CHANGELOG top + live container
both :0.63.0). Confirmed before starting.
Per-item results
A1 — AutoDiscoverStoragePaths made ADDITIVE
- File:
controller/internal/settings/settings.go(the function previously at L584). - Change: removed the
if len(s.StoragePaths) > 0 { return }early-return. It now registers only discovered paths NOT already present. Invariants enforced:- Never removes/modifies a manually-added path.
- SKIPS any path already in the registry IN ANY STATE — including a
Decommissionedsoft-marked entry — so it is never re-added or reactivated (if existing[path] { continue }, keyed onfilepath.Clean). - Never flips
IsDefault: a newly-discovered path becomes default ONLY if the registry currently has no default at all (and then only the first such new path) —IsDefault: !hasDefault, withhasDefaultseeded from existing entries and set true after the first new default.
- Tests: new
controller/internal/settings/storage_discovery_test.go(TestAutoDiscoverStoragePaths_Additive, table-driven, +..._DecommissionedNotReactivated):- (a) non-empty registry + a deployed-app path missing from registry → exactly that path registered;
pre-existing entry byte-identical via
reflect.DeepEqual(IsDefault asserted unchanged); new path not promoted to default. - (b) Decommissioned path present + a deployed app still pointing at it → NOT reactivated; entry byte-identical; path count unchanged.
- extra cases: empty registry (first becomes default), registry-with-no-default (first new becomes default), fallback path pickup.
- (a) non-empty registry + a deployed-app path missing from registry → exactly that path registered;
pre-existing entry byte-identical via
- Non-hollow proof: temporarily removing the
if existing[path] { continue }guard makes..._DecommissionedNotReactivatedFAIL (path count changed: got 4 want 2); restored → green. - Commit:
2d4d432(shared with A2). Test result:ok internal/settings.
A2 — internal-SSD label disambiguation
- File:
controller/internal/settings/settings.go(InferStorageLabel). - Change: when
filepath.Base(path) == appbackup.FelhomDataDir(the"felhom-data"namespace dir), the label is nowBelső SSD (rendszer)instead of the collidingTárhely (felhom-data). Importedinternal/appbackupfor the constant (no import cycle — appbackup only depends oninternal/util). Still overridable viaSetStorageLabel. - User-drive safety confirmation: Model-A user drives register their MOUNT ROOT (e.g.
/mnt/felhom-usb) — confirmed live on 9201, where the user drive is registered as/mnt/felhom-usb, never.../felhom-data— so thebase == felhom-datamatch cannot mislabel a user drive. - Untouched: the separate host-metrics label in
web/agent_host_metrics_handler.go:91was left as-is (display-only host-metrics path; A2 is the storage-registry label only). - Tests:
TestInferStorageLabelcovers/mnt/sys_drive/felhom-data→Belső SSD (rendszer), a second felhom-data path, plus the existing hdd/ssd/usb/Tárhelybranches (note:felhom-usbdoes NOT start withusb, so it correctly labelsTárhely (felhom-usb)— pre-existing behavior). - Demo seeded-label update (before/after): the seeded
settings.jsonon 9201 had"/mnt/sys_drive/felhom-data" → "Tárhely (felhom-data)". Updated through the real UI endpoint (POST /settings/storage/label→SetStorageLabel, the same handler the dashboard form posts to) to"Belső SSD (rendszer)"; verified persisted insettings.json. (Note: the public URLhttps://felhom.demo-felhom.eureturned 200 without applying the change — the Cloudflare/Traefik path mangled the POST body; posting to the container's own127.0.0.1:8080returned 302 success and persisted. Same handler either way.) Before:Tárhely (felhom-data). After:Belső SSD (rendszer). - Commit:
2d4d432(shared with A1). Test result:ok internal/settings.
A3 — doc: reject auto-register-on-attach (no deploy)
- File:
felhom.eu/documentation/backlog/DIAGNOSIS-f9-storage-registration-gap-2026-06-14.md(the doc lives inbacklog/, notaudits/as the task said). - Change: recommendation #1 annotated REJECTED (2026-06-14) — contradicts the new→enrolled manual-enrollment model; manual enroll is by design. Noted that the "make discovery additive" sub-point WAS adopted (v0.64.0 A1) but only for paths deployed apps reference, not auto-register of agent-attached drives.
- Commit:
b5a9614(felhom.eu repo).
A4 — doc: live-validation rule (no deploy)
- Files:
felhom-controller/CLAUDE.mdandfelhom-agent/CLAUDE.md— added the verbatim "Live validation" paragraph to both. - Commits:
e850402(felhom-controller),8e6d00a(felhom-agent).
Build / deploy / verify
go build ./... && go vet ./internal/settings/ && go test ./...→ all green locally.- Built + pushed
gitea.dooplex.hu/admin/felhom-controller:0.64.0on 192.168.0.180. - Deployed to guest 9201 via the golden/bootstrap mechanism (
docker pull→ write/etc/felhom-controller-image→ restartfelhom-controller-bootstrap.service). - Verify:
docker ps→gitea.dooplex.hu/admin/felhom-controller:0.64.0 Up (healthy); logs showEvent pushed: controller_started (info) — Controller elindult (0.64.0)and no startup errors. No rollback needed.
Commit hashes (per item)
| Item | Repo | Commit |
|---|---|---|
| A1 + A2 (code + tests + CHANGELOG + README) | felhom-controller | 2d4d432 |
| A4 (CLAUDE.md) | felhom-controller | e850402 |
| A4 (CLAUDE.md) | felhom-agent | 8e6d00a |
| A3 (diagnosis annotation) | felhom.eu | b5a9614 |