v0.315.0: one app page with four tabs; the guide the catalog can carry; no Raspberry Pi badge
gates / gates (push) Failing after 47s

An app was six pages — details, install/settings, logs, export, the per-app backup panel and a
details card for moving data — and every "Vissza" on them went to the app LIST, so there was no way
back to the app you were looking at. It is now ONE page with four tab URLs under /apps/{slug}/,
one shared header and one set of banners.

  settings  Mukodes (Start/Restart/Stop, Stop confirms) + the cards that want something from the
            household + the install-time and optional settings. The default for an installed app,
            RENDERED at the bare URL and never redirected to.
  data      the data folders, move to another drive, the nightly copy, the 2nd-copy setting, export
  guide     tagline, screenshots, use cases, first steps, the catalog's guide, the FAQ, the docs
            link — and the WHOLE page for an app that is not installed
  logs      the log, and the only tab whose poller runs

The tabs are links, not panels: a link in an alert has to land ON a tab, and the log poller must not
run on the other three. Start/Restart/Stop left the page header, where they read as menu buttons.

The old /stacks/{name}/{deploy,logs,export,backup} GETs answer 302 — never 301, which a browser
caches beyond anyone's reach — to the tab that now holds them, query string carried through, with
name->slug resolved through the stack list rather than assumed equal. Every POST on those paths is
untouched: the backup form, the app-email toggle and the reveal endpoints keep their URLs.

A value asked AFTER the app starts is now generic (D2). The catalog marks a field `after_start: true`
and supplies its label; the ACTION is Go, in a registry keyed by slug + env var. The catalog can
never declare what runs — a declared field with no registered action renders nothing, POSTs 404 and
logs one WARN with the env var KEY, never the value. A red-proof found the second half of that guard
unpinned: deleting the "the catalog must have DECLARED this field" check left the suite green, and a
POST for an undeclared field then reached Plex and opened the setup gate.
TestAfterStart_RegistryAloneIsNotAnInvitation pins it.

New catalog block app_info.guide (sections + faq + checked_version), parsed, localised field by
field and rendered with the household's own address filled in. It renders only when checked_version
names the image tag its author clicked through. No template carries one yet.

The Pi and "csak x86" badges are gone; PiCompatible and the catalog key stay this release, or a box
on 0.314.0 would read "csak x86" on every app (R-1067).

template_id_gate.py now follows {{template}} includes, with a scope decoy proving the walk did not
become vacuous.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0117kRTSgs3rJWUFGxyoWN6Y
This commit is contained in:
adminandClaude Opus 5 committed 2026-10-15 18:37:50 +02:00
1 parent 85f65c70d8
commit e66d4669d6
120 files changed
+16239 -9866

No files matched your search

+44
View File
@@ -1,3 +1,47 @@
## 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
`architecture/02-controller-module-map.md` „The app page", `10-localisation.md` §7 (the guide in the copy model).
Operator decisions for this release: D1 — Export lives on the data tab; D2 — after-start fields are rendered generically
from the catalog and their ACTION is Go code; the FAQ is a section of the guide, not a tab; the guide tab replaces the
details page.
- **One app page, four tabs.** An app was six pages (details, install/settings, logs, export, per-app backup, and a
details card for moving data) and every „Vissza" went to the app LIST, so there was no way back to the app. It is now
one page with four tab URLs under `/apps/{slug}/`, one shared header and one set of banners:
`settings` (the default for an installed app), `data`, `guide`, `logs`, plus `/install` for the wizard. The tabs are
LINKS, not panels — an alert's link has to land on a tab, and the log poller must not run on the other three.
- **Start / Restart / Stop left the page header.** They sat beside the navigation and read as menu buttons; they are the
first card („Működés") of the settings tab, where a state change belongs. Stop asks first.
- **The old URLs still work, reads only.** `/stacks/{name}/{deploy,logs,export,backup}` GET answer **302** (never 301 —
a cached 301 cannot be withdrawn) to the tab that now holds them, query string carried through, `name→slug` resolved
through the stack list rather than assumed equal. Every POST on those paths is untouched: the backup form, the
app-email toggle and the reveal endpoints keep their URLs and their handlers.
- **A guide the catalog can carry.** `app_info.guide` — `sections` (title, optional intro, steps) and `faq` (q, a) —
is parsed, localised and rendered on the guide tab, with the household's own address filled into every string
(R-498). It renders ONLY when `checked_version` names the image tag its author clicked through: a guide walking the
household through a screen two releases old is worse than none, and the page says one is still to come. Plain text
through `html/template`; no markdown, no raw HTML. English overlays field by field, sections and FAQ matched by
index (the one list in the copy model that is, because a section's title is the thing being translated); an
oversized translation is dropped past the Hungarian count with one WARN. **No catalog template carries a guide yet**
— the content is the companion task.
- **„Még egy lépés" is now generic.** Plex's claim box was markup behind a Plex-only flag. Any catalog field marked
`after_start: true` gets the card, driven by a Go registry keyed by slug and env var
(`internal/web/after_start.go`). **The catalog declares THAT a value is asked and what to call it; it can never
declare what runs** — a declared field with no registered Go action renders nothing, POSTs 404 and logs one WARN with
the env var KEY (never the value). `POST /apps/{slug}/after-start/{ENV}`; `/apps/plex/plex-claim` stays and runs the
same entry, so a tab open across the update still works.
- **The Raspberry Pi badge is gone**, and with it the „csak x86" tag every other app wore: Pi is no longer supported, so
both were noise. The `PiCompatible` field and the catalog's `pi_compatible:` key stay this release — removing them now
would make every app read „csak x86" on a box still on 0.314.0.
- Tests: seven new groups through the production router (`app_page_test.go`, `guide_render_test.go`,
`internal/stacks/guide_test.go`); 11 red-proofs recorded in REPORT.md. One of them found an unpinned invariant: the
handler's „the catalog must have DECLARED this field" check could be deleted with the suite staying green, and a POST
for an undeclared field then reached Plex and opened the setup gate. `TestAfterStart_RegistryAloneIsNotAnInvitation`
pins it.
- `scripts/template_id_gate.py` now follows `{{template}}` includes, because a page's ids are the RENDERED page's, not
one file's. It ships with a scope decoy proving the walk did not become vacuous.
## v0.314.0 — a restore puts the setup gate back as it was; a test build moves with the floor; Prowlarr links itself; the box claims Plex again (R-1057, R-1053, R-1058, R-1060) (2026-10-15)
**MinAgent: 0.155.0** (unchanged — no new agent call). No golden: the first release under `09` §3 decision 250 (the floor