From 48d867487694bd7e08082275d27a2c73339e9fd1 Mon Sep 17 00:00:00 2001 From: kisfenyo Date: Thu, 15 Oct 2026 20:33:22 +0200 Subject: [PATCH] v0.316.0 CHANGELOG; the push-once fact in this repo's unprompted-work rule Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_0117kRTSgs3rJWUFGxyoWN6Y --- .claude/rules/unprompted-work.md | 6 +++++ CHANGELOG.md | 42 ++++++++++++++++++++++++++++++++ 2 files changed, 48 insertions(+) diff --git a/.claude/rules/unprompted-work.md b/.claude/rules/unprompted-work.md index 7f60064..74fab42 100644 --- a/.claude/rules/unprompted-work.md +++ b/.claude/rules/unprompted-work.md @@ -50,6 +50,12 @@ it **first** in the morning note. A decision you cannot write in that shape is o on Tester 1, demo-hp and demo-felhom through the normal update path and the box walk's checks are green on all three — not at night unless the night brief says so. **Agent releases still stop for the operator's vouch.** The golden is baked weekly and vouched by the operator; CC never vouches. **No `--no-verify`.** + **A version number is pushed once** — `felhom-controller/controller/build.sh` now refuses a second + push of a tag that exists, and a registry it cannot reach is a refusal too. This is a FACT about + what the build does, not a new rule: a fix for something already pushed is the next patch version, + and a box on a bad image is moved by the normal update path, never by re-tagging. Earned on + 2026-10-15, when 0.315.0 was pushed three times from three different commits and a cache kept + serving the first one (`09-update-architecture.md` §0). 7. **An enumerated gap becomes a row in the same session — or, if it is small, is fixed in it** (the size rule). Prose is not a record. 8. **Hungarian text is searched with ASCII fragments**, with a positive and a negative control. diff --git a/CHANGELOG.md b/CHANGELOG.md index b5dfe42..90e1fdd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,45 @@ +## v0.316.0 — the app page as one column; a version number is pushed once (2026-10-15) + +**MinAgent: 0.155.0** (unchanged — no new agent call). No golden (`09` §3 decision 250). Design: +felhom.eu `architecture/02-controller-module-map.md` „The app page" (the layout rules and the asset +tag) and `09-update-architecture.md` (a version is pushed once). Layout: the operator-approved +mockup of 2026-10-15. + +- **Measured first: why the tab bar rendered unstyled through the public address.** Not the box — + exactly one guest runs 0.315.0 and it runs the registry's current digest, and the floor is still + 0.314.0 so nothing else could have taken it. It was a cache, and the mechanism is four facts: the + stylesheet URL was `?v={{.Version}}`, identical across **three different 0.315.0 builds**, the + first of which had no `.app-tabs` rules; the origin sends **no ETag and no Last-Modified**, so a + cached copy can only expire, never be revalidated; Cloudflare caches that URL and rewrites the + browser TTL from 3600 to **14400**; and the session's first request came back `EXPIRED`, which + only happens when the edge holds an aged-out entry. Evidence and the honest caveat (that probe + revalidated the stale object, so it is no longer reproducible): + `felhom.eu/documentation/audits/app-page-2026-10-15b/P0/VERDICT.md`. +- **`build.sh` refuses to push a version that already exists** — before building, for `--push` and + `--multiarch`. A registry it cannot reach is a refusal too: proving the tag is new is the point, + and „I could not ask" is not that proof. Local builds are untouched. + `scripts/test_build_push_once.sh` drives the real script with a fake docker over six cases. +- **Every build addresses its stylesheet differently.** `assetTag()` hashes version + `GitCommit` + + `BuildTime`, and all nine shells use it (seven asked for `?v={{.Version}}`). It stays opaque and 8 + hex because the stranger-facing share pages use the same value. `Cache-Control` is unchanged — + the new address is the fix, not a shorter cache. The parity harness normalises the tag on both + sides, so the fixtures stop depending on which build rendered them. +- **The app page is one column** (the approved mockup): one width, sections separated by hairlines + instead of drawn as cards, tabs underlined rather than filled, a 64px hero with no box, and + label/value rows on one 200px grid. **A box now means something** — blue when the app is waiting + for the household, amber when something is risky, and nothing else is boxed. +- **The after-start callout is the first thing on „Beállítások".** A household opening a Plex that + wants its claim code should meet the code box, not a Restart button. +- **The auto-update SUCCESS banner is gone**, demoted to meta text beside the address. It was a + full-width box level with „the update failed" and „your files are missing". Every banner that + needs a decision is untouched and still above the tabs (R-571). +- Smaller, in the same spirit: „2. mentés beállítása — " and „ — Exportálás" removed (page + titles for pages that no longer exist); a „Cím és kulcsok" section with one address row in place of + the duplicate disabled subdomain field; the „already installed, read-only" banner demoted to the + hint under the fields it describes; the install wizard given the same back link, hero and column. +- `app_row_dedup_gate` convicted `.app-row` for the page's new label/value row, correctly — that + class already means „a row in the app list". It is `.app-field-row`. + ## v0.315.0 — one app page with four tabs; the guide the catalog can carry; no Raspberry Pi badge (2026-10-15) **MinAgent: 0.155.0** (unchanged — no new agent call). No golden (`09` §3 decision 250). Design: felhom.eu