# CONTEXT.md — Project Memory > This file serves as persistent project memory across Claude Code sessions. > It replaces the auto-generated "Memory" from the claude.ai Project. > **Update this file at the end of each working session** with current state, > recent decisions, and anything the next session needs to know. > > Ask Claude Code: "Please update CONTEXT.md with what we did today" Last updated: 2026-10-16 (v0.323.0 — Debian 13, restic 0.18.1 pinned outside the OS and re-proven, felhom-samba 1.2.0) > **2026-10-16 (evening) — v0.323.0 RELEASED to the three test boxes ONLY (per-box floors); the GLOBAL floor stays > 0.322.0 until each test box has made one real night's off-site backup on 0.323.0** (the brief's rule; the check and > the floor command are in felhom.eu `STATUS.md`). R-1105: runtime `debian:13.7-slim` (digest-pinned), Docker repo > codename from `/etc/os-release`; restic is the official 0.18.1 release binary from a `restic` build stage (signed > `SHA256SUMS` + vendored key in `third_party/restic/`, published sum, pinned per-arch sum). Every restic assumption > re-proven with REAL outputs of 0.14.0 and 0.18.1 (`internal/backup/testdata/restic/`, `TestR1105_*`); the one that > moved is the forget plan — 0.17+ keeps each group's oldest snapshot while monthly slots are unused (only ever keeps > more). Removed packages the binary never runs (postgres/mysql clients, sqlite3, fdisk, e2fsprogs, parted, sshpass). > felhom-samba 1.2.0 (Alpine 3.24.2), and `build-samba-image.sh` refuses a reused tag. Live on demo-hp 9201: both > restore directions byte-identical on the real store; the drill's data came back; the full restore after a reinstall > leaves a DB app unusable (old volume, new password — R-1106, not restic). Open: R-1107 (restic 0.18.1's binary adds > 50 fixable scanner findings; 0.19.1 has 19 — the operator's choice), R-1108 (a share added before the first password > is not exported). **Decision (CC, inside the brief, reversible):** the packages above were removed though the brief > named only the two database clients — none is run by the binary (every exec call read), and the image carries fewer > known holes. Full report: felhom.eu `REPORT-debian13-restic-2026-10-16.md`. > **2026-10-16 — v0.322.0 RELEASED by CC; the global floor 0.322.0 / MinAgent 0.158.1.** R-970: `/api/config`, > `/api/config/apply`, `/api/config/hash` are gone; the self-update and geo routes no longer take the box's hub key > (`selfUpdateAuthMiddleware` removed), and the CSRF Bearer exemption is gone. The route table is `buildMux` in `main.go` > so `TestR970_HubKeyOpensNoDoor` drives the real table. R-972: Go 1.27.2, x/crypto v0.58.0, runtime > `debian:12.13-slim` pinned by digest + `apt-get upgrade`. **Decision (CC, inside the brief, reversible): the runtime > stays on Debian 12** — Debian 13 brings restic 0.18.0 and the off-site code relies on measured 0.14.0 behaviour; the > move is R-1105. Data tab: the export field is `fab_encryption_key`, `autocomplete="new-password"`; the 2nd-copy > status rows are gone. R-1103: the installed-only branches of `app_fields.html` removed; their rules live in the > app-page and settings-tab tests. Full report: felhom.eu `REPORT-burndown2-2026-10-16.md`. > **2026-10-16 — v0.321.0 RELEASED by CC; the global floor 0.321.0 / MinAgent 0.158.1.** R-1101: in `generated` the page asks > FileBrowser whether the stored password still logs in (`stacks.FileBrowserStoredPasswordRefused`, only a 401/403 counts) > and, refused, offers the reset; no „change it" line for FileBrowser; its config switches off its update banner and > „Install app" prompt. The Data tab's backup part is one section in plain words. R-1095: `/apps/{slug}/install` of an > installed app → 302 settings; the installed-only `app_fields.html` branches stay (R-1103). Catalog the same day: RomM's > saves in a named volume (R-1097), `default_creds` off eight apps (D10 = A). Next: R-1103; R-1067 waits on Tester-2 (0.292.0). > **2026-10-16 — v0.320.0 RELEASED by CC; the global floor 0.320.0 / MinAgent 0.158.1.** A protected infra stack is > installed by definition on the app page (`Deployed || Protected`; v0.315.0 had shown FileBrowser „not installed" with > Install and no login); the deploy API and `DeployStack` refuse a protected stack. FileBrowser `operator` state → > „Új jelszó beállítása" (`stacks.ResetFileBrowserAdminPassword`: its CLI with the server stopped, verify, encrypt, > `generated`) — pressed on demo-hp; **the N100 waits for the operator's yes**. Every installed app has ONE login answer > (`web/app_login.go` `loginAnswerFor`; catalog `app_info.login_kind`). „Fájlok ↗" + per-drive media folders; a folder with > no FileBrowser source is text. Decisions inside the brief (felhom.eu `REPORT-logins-folders-2026-10-16.md` §0): no backup > sentence on media rows; no data tab for infra; „none" behind the family gate says the family sign-in. Next: R-1100 > (one sign-in), R-1101 (stale FileBrowser password), R-1102 (eight „known password" lines, decision D10). > **2026-10-16 — v0.319.0 RELEASED by CC; the global floor 0.319.0 / MinAgent 0.158.1.** App page style A (operator > 2026-10-16): the hero, the tab bar and every section are panels on `--bg-1`; the install page's form groups use the same > rule. „Belépés az alkalmazásba" pairs a `type: password` field with its `*_USER/_USERNAME/_EMAIL` name > (`web/app_login.go`); a field the box holds no value for is a sentence, never an eye — page and reveal endpoint share > `storedValuePresent`. Measured cause on demo-hp: Calibre-Web installed 2026-08-21, `ADMIN_PASSWORD` entered its template > 2026-09-29, and `InjectMissingFields` never fills a `type: password` field; its stored user name is real (renamed in the > app on 2026-10-01). The settings tab no longer renders `app_deploy_fields`; `/apps/{slug}/install` for an installed app > still does (R-1095). Evidence: felhom.eu `audits/app-page-tuning-2026-10-16/`. > **2026-10-16 — v0.318.0 RELEASED; the global floor 0.318.0 / MinAgent 0.158.1 (set by the operator).** The internal data > place („Belső tárhely", agent ≥ 0.158.1 reports kind `internal`): bound on one drive-gate tick, registered on the next as > the default drive (web/internal_place.go); eject/decommission/wipe of it refused. Partitions in the format/attach wizards > (agent `formattable`: only while nothing on the disk is mounted); the whole disk under a registered part refused > server-side (`deviceBacksRegistered`). R-1084: the whole-box backup offer asks the same-disk question (`offerRelationFor`). > R-1082: `/mnt/sys_drive` never offered (`withoutSystemVolume`, by device). Live on a fresh one-disk scratch box: felhom.eu > `audits/storage-identity-buildB-2026-10-15/`. Next: R-1094 (the whole-disk refusal sentence), with the next release. > **2026-10-15 (late evening) — v0.316.0/.1/.2 built and on demo-hp; .3 committed, NOT built.** > **Measured before fixing:** the tabs rendered unstyled through the public address because of a > CACHE, not the box — the stylesheet URL was `?v={{.Version}}`, identical across three different > 0.315.0 builds; the origin sends NO ETag and NO Last-Modified, so a copy can only expire; and > Cloudflare caches it while rewriting the browser TTL to four hours. Evidence and its caveat: > `audits/app-page-2026-10-15b/P0/VERDICT.md`. > **Two mechanisms now:** `build.sh` refuses a second push of a version (a registry it cannot reach > is a refusal too), and every shell's stylesheet address is a per-build tag. > **The app page is the approved one-column mockup**: one width, hairline sections, underlined tabs, > and a box only for „the app is waiting for you" (blue) or „this is risky" (amber). The > auto-update SUCCESS banner is now meta text. > **THE LESSON OF THE EVENING, and it cost a bad push:** I put the guard in `controller/build.sh`, > but the release runbook runs `build/felhom-controller/build.sh` — a SEPARATE COPY from > 2026-07-18. Proving the refusal against a real tag therefore re-pushed 0.315.0 a fourth time > (R-1081). The build directory's script is a symlink now. A guard in a script nobody runs is not a > guard. The same shape bit twice more in one evening: the asset tag shipped dead because only one > of TWO render paths set it, and both times a BROWSER found what the suite could not. > Not yet validated: the operator's own look; 0.316.3's two cosmetic fixes. > **2026-10-15 (evening) — v0.315.0, ONE APP PAGE WITH FOUR TABS.** An app was six pages and every „Vissza" went to the > app LIST; it is now `/apps/{slug}/{settings,data,guide,logs}` plus `/apps/{slug}/install`, one shared header and one > set of banners (`internal/web/app_page.go`, `templates/app_shell.html`). Operator decisions recorded for this release: > **D1** — Export lives on „Adatok és mentés", not under Beállítások. **D2** — an after-start field's CARD is rendered > generically from the catalog's `after_start: true`, and its ACTION is Go code in a registry keyed by slug + env var > (`internal/web/after_start.go`), so customer text can never reach a catalog-defined command. **The FAQ is a section of > the guide, not a tab**, and **the guide tab replaces the details page**. **302, never 301**, for every old > `/stacks/{name}/…` GET — a cached 301 cannot be withdrawn; every POST on those paths is untouched. > New catalog block `app_info.guide` (sections + faq + `checked_version`), rendered only when `checked_version` names the > image tag its author checked it against; no template carries one yet (the content is the companion task). 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. > **Found by a red-proof, and worth remembering:** the after-start handler's „the catalog must have DECLARED this field" > check could be deleted with the whole suite green — and a POST for an undeclared field then reached Plex and opened the > setup gate. Two guards that look like one are two tests. > **Two defects the whole test suite could not see, both found in Chrome on the workstation** (this is > the case for CC running on Windows): the tab bar had no CSS at all and the hero logo was unsized, > because the shell invented class names beside ones the design system already had rules for; and the > log tab's `