diff --git a/CONTEXT.md b/CONTEXT.md index ec41cfc..0fb215a 100644 --- a/CONTEXT.md +++ b/CONTEXT.md @@ -3,6 +3,21 @@ > Created with the REUSE.md rollout (2026-07-03). Authoritative history: `hub/CHANGELOG.md` (hub), > `website/CHANGELOG.md`, `scripts/CHANGELOG.md`; end-of-task detail in `REPORT.md`. +- **2026-07-12 — HUB v0.49.0 SHIPPED: Edit tab merge (edit-a) + scoped auto-refresh + riders** + (CHANGELOG v0.49.0; commits `e740147` → `2e03de1` → `1d94b1a` + docs/manifest). The standalone + customer edit page merged into the customer page's **Edit** tab (renamed from Settings): shared + `config_form_body` sub-template + `configFormData` builder (REUSE.md rows added), Block/Delete + relocated to a danger-zone card, header cleaned, `GET /configs/{id}/edit` → 302 `#tab=edit`, + post-action redirects anchored to their tab, `settings→edit` legacy-hash alias. Update handler + gained server-side required-field validation (error path preserves SUBMITTED values — + red-proofed). The 60s auto-refresh is now scoped: fires only on live tabs + (`data-live-tabs="overview,applications,events,host"`) and never while a form is dirty; muted + `(paused)` hint. Riders: `/style.css?v={{hubVersion}}` cache-bust on every template (closes the + v0.47.0 max-age=3600 gotcha) + the CLAUDE.md `git add -A` ban codified. **NOTE: the task spec + said v0.48.0, but v0.48.0 (app_start_failed) had already shipped — published tags are never + re-pointed, so this train is v0.49.0.** Out of scope (observed, not done): type-to-confirm for + customer delete (still `confirm()`, relocated as-is); the workspace-root `E:\git\CLAUDE.md` and + other repos' CLAUDE.md files still carry `git add -A` snippets — flag for their own sessions. - **2026-07-12 — Day-0 VM DRILL COMPLETE (auto-confirm FIRST LIVE FIRING): full arc proven on a fresh nested-PVE box** — appliance Day-0 → floor-at-first-report → ceremony → **auto-confirm pending→escrowed in ~7.5 min, zero clicks** → offsite backup + restore round-trip. Two HIGH gaps: diff --git a/REUSE.md b/REUSE.md index 2a7f461..220fc6d 100644 --- a/REUSE.md +++ b/REUSE.md @@ -62,6 +62,8 @@ | `(*Server).hostDetailData` | hub/internal/web/hosts.go (~L282) | `(host *store.Host, r) map[string]interface{}` | The ONE view-model builder for the shared `host_detail_body` sub-template (standalone `/hosts/{id}` + customer Host tab) | Booleans/counts only for DR/escrow; carries `Deletable` (= status != "ok") which gates the danger-zone card. Never add a secret field. | | `host_detail_body` sub-template | hub/internal/web/templates/host_detail_body.html | `{{template "host_detail_body" .}}` | Rendering a host's detail sections on ANY surface | One namespace across ParseFS (icons.html pattern). Renders per-host — id-suffix any new element ids with `{{.HostID}}` (the customer page renders N instances). | | `(*Store).ListHostsByCustomer` | hub/internal/store/store.go (~L1620) | `(customerID) ([]Host, error)` | A customer's hosts, host_id order | A LIST by design (HA-cluster roadmap) — don't collapse to GetHostByCustomer. | +| `(*Server).configFormData` (v0.49.0) | hub/internal/web/configs.go (~L430) | `(r, isNew, cfg, overrides, errMsg) configFormView` | The ONE view-model builder for the customer config form (standalone chrome + the customer page Edit tab) | `overrides=nil` → parses the STORED cfg.ConfigJSON; pass the SUBMITTED map on the update validation-error re-render or typed values reset (red-proofed). | +| `config_form_body` sub-template (v0.49.0) | hub/internal/web/templates/config_form_body.html | `{{template "config_form_body" }}` | Rendering the config form on ANY surface (config_form.html chrome + customer Edit tab) | The floor/geo/danger cards on the Edit tab are SIBLINGS after `` — never nest a form inside it (breaks the offsite/PBS formaction sub-buttons). Includes the F5 in-flight `