docs+manifest: hub v0.49.0 — Edit tab merge train (CHANGELOG, REUSE rows, CONTEXT, GitOps bump)

Version note: the task spec targeted 0.48.0 but that tag had already shipped
(app_start_failed); published tags are never re-pointed → this train is 0.49.0.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TZc5w5jDhFLv6qDC32KN5v
This commit is contained in:
2026-07-12 17:39:09 +02:00
parent 1d94b1a9e9
commit b1ab0ea0e5
4 changed files with 58 additions and 1 deletions
+40
View File
@@ -1,5 +1,45 @@
# Felhom Hub — Changelog
## v0.49.0 — Edit tab merge (edit-a), scoped auto-refresh, style.css cache-bust (2026-07-12)
> The task spec targeted "v0.48.0", but v0.48.0 (app_start_failed, below) had already shipped +
> deployed by the time this train ran — a published tag is never re-pointed, so this is v0.49.0.
> Baseline `3e949bc`; commits `e740147` → `2e03de1` → `1d94b1a` → docs/manifest.
- **Edit tab merge (edit-a)** (`templates/customer_unified.html`, `templates/config_form.html`,
new `templates/config_form_body.html`, `web/configs.go`, `web/pbsdr.go`): the standalone
customer edit page merged into the customer page's Settings tab, renamed **Edit**. The form
body is a shared `{{define "config_form_body"}}` sub-template (the `host_detail_body`
pattern) built by the one `configFormData` view-model builder; the standalone chrome keeps
rendering it for the create flow (`/configs/new`) and the validation-error re-render. The
Edit tab renders: config form, Controller Update card, Geo card, and a **Danger zone** card
holding the Block/Unblock/Delete forms relocated verbatim from the Customer Info header
(endpoints + `confirm()` unchanged) — all SIBLINGS after `</form>` (nested forms are invalid
HTML and would break the offsite/PBS `formaction` sub-buttons). The header keeps only the
config-less Create Config action. `GET /configs/{id}/edit` → 302 `/customers/{id}#tab=edit`;
tabs JS gains the `settings``edit` legacy-hash alias.
- **Server-side required fields on update** (`web/configs.go` `handleConfigUpdate`): the twin
of the form's `required` attributes (Display Name + Domain), checked BEFORE provisioning; the
error path re-renders the standalone page with the SUBMITTED overrides so typed values are
never lost (red-proofed: nil overrides → values reset → test fails).
- **Redirect anchors**: update/block/unblock/offsite-reissue/offsite-freeze/pbsdr-reissue →
`?flash=…#tab=edit`; regen-password → `#tab=setup` (its card lives there); delete unchanged
(`/configs?flash=deleted`).
- **Scoped auto-refresh** (`templates/customer_unified.html`): the 60s reload fires only while
a live tab (`data-live-tabs="overview,applications,events,host"` on the nav) is active AND no
form is dirty (delegated document-level input/change listener, never reset — a reload clears
it). Skipped ticks reschedule; a muted `(paused)` hint shows next to the toggle on non-live
tabs / dirty forms. Toggle, `hub_auto_refresh` localStorage key, cadence, default-on: unchanged.
- **style.css cache-bust** (all `templates/*.html`): every stylesheet link is now
`/style.css?v={{hubVersion}}` — closes the v0.47.0 gotcha (`max-age=3600` served stale
styling for up to an hour after each deploy). Red-proofed (bare link fails the render test).
- **Repo staging rule** (`CLAUDE.md`): never `git add -A` in this repo (the v0.47.0 `146d165`
sweep incident) — explicit paths, pull-rebase, one writing session per clone.
- Tests: +11 (Group A panel surface / sibling-form / header-count, Group B redirect + create +
typed-values-preservation table, Group C refresh structural pins, Group D cache-bust sweep).
Amended pins: `customer_tabs_test.go` (settings→edit), `pbsdr_test.go` (postUpdate supplies
the now-required fields; FormRendersState asserts the embedded Edit-tab render).
## v0.48.0 — accept the app_start_failed event (controller fix-3, CAMPAIGN-3) (2026-07-12)
- `app_start_failed` added to `allowedEventTypes` (`internal/api/handler.go`) + `customerMessages`