From c02c9d833af0dd2fc4e85fb748fbcfaf835d96a7 Mon Sep 17 00:00:00 2001 From: kisfenyo Date: Fri, 16 Oct 2026 15:49:27 +0200 Subject: [PATCH] v0.320.0 released: REPORT, CONTEXT Claude-Session: https://claude.ai/code/session_0159rPz1ZhFKsS53msqPYxtS --- CONTEXT.md | 12 ++++- REPORT.md | 128 +++++++++++++++++------------------------------------ 2 files changed, 52 insertions(+), 88 deletions(-) diff --git a/CONTEXT.md b/CONTEXT.md index 5b96c4b..1907405 100644 --- a/CONTEXT.md +++ b/CONTEXT.md @@ -7,7 +7,17 @@ > > Ask Claude Code: "Please update CONTEXT.md with what we did today" -Last updated: 2026-10-16 (v0.319.0 — app page tuning round 2: panels, the login panel, the empty-value rule) +Last updated: 2026-10-16 (v0.320.0 — logins and folders: FileBrowser part of the box, one login answer per app, „Fájlok ↗") + +> **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 diff --git a/REPORT.md b/REPORT.md index a1db23e..42bef1d 100644 --- a/REPORT.md +++ b/REPORT.md @@ -1,100 +1,54 @@ -# REPORT — v0.319.0: the app page in panels, the login in one place, a password the box never had is said in words (2026-10-16) +# REPORT — v0.320.0: FileBrowser is part of the box again, every app says where its login is, a „Fájlok" button (2026-10-16) -Written in ASD-STE100 Simplified Technical English. Task: „app page tuning, round 2" (operator brief, section style **A**). -Design read first: felhom.eu `architecture/02-controller-module-map.md` „The app page" (now updated, `[DESIGN]`, -operator-approved 2026-10-16). Evidence: felhom.eu `documentation/audits/app-page-tuning-2026-10-16/`. +Written in ASD-STE100 Simplified Technical English. Task: „logins and folders" (operator brief). The full report, with +the decisions taken, the browser check and the rows: felhom.eu `REPORT-logins-folders-2026-10-16.md`. Design read +first: felhom.eu `architecture/02-controller-module-map.md` „The app page" (now with „Logins and folders"). +Evidence: felhom.eu `documentation/audits/logins-folders-2026-10-16/`. ## 1. Plain words first -- **Why the Calibre-Web password was empty (Part 0, measured on demo-hp).** Calibre-Web was installed on 2026-08-21. Its - template got the password field on 2026-09-29. The box adds new generated values to installed apps, but never a - `type: password` value. So the box never had one. The user name the box shows IS the real one: a session renamed the - app's admin to it on 2026-10-01. So nothing was removed from demo-hp. -- **The page now:** the header, the tab bar and every section are panels. The open tab is filled and underlined. - One „Belépés az alkalmazásba" panel shows the name and the password side by side. If the box has no value, the page - says so in a sentence. It never shows an eye that fails. -- **Other boxes:** the hub lists Calibre-Web telemetry from demo-hp and demo-felhom only. On demo-felhom it is not installed - now (checked on the box). No customer box has this state. +- **Why FileBrowser showed „Telepítés":** it has no app.yaml, so the box marks it not deployed. Since v0.315.0 the app + page read only that mark. Now a protected infra stack is installed by definition on the app page. Its login is back. +- **The Install press could have installed the infra stack as an app** (no guard). Refused now, in the API and in + `DeployStack`. +- **„Új jelszó beállítása":** when the box does not know FileBrowser's password, one press sets a new one with + FileBrowser's own CLI (server stopped ~3 s), verifies it, and stores it encrypted. Pressed on demo-hp: it works. +- **Every installed app has „Belépés az alkalmazásba" with one answer;** the catalog's new `app_info.login_kind` picks + the sentence when the box holds no login. +- **„Fájlok ↗"** opens one folder of the app in FileBrowser; the data tab lists each drive's media folders. -## 2. Baselines and commits +## 2. Commits and images -controller `8d44416` (v0.318.0) → `d170a2a` (the work) → `7adbbb1` (export panel title and inputs, seen in the browser) -→ `0f82eba` (16px under the hero on the install page) → this docs commit. Built from a clean clone at `0f82eba` with that -clone's own `build.sh`: test images `0.319.0-rc.1..rc.3` (demo-hp only), release **0.319.0**. +`39bf562` (v0.319.0) → `f30a808` (the work) → `1296e7a` (the FileBrowser line's link style, seen in the browser) → +this docs commit. Built from the clean clone with its own `build.sh`: `0.320.0-rc.1`, `rc.2` (demo-hp only), release +**0.320.0** (MinAgent 0.158.1). ## 3. What changed -- `web/app_login.go` (new): `loginFieldIndexes` (a `type: password` field plus the `secret`/`text` field with the same - prefix and `USER`/`USERNAME`/`EMAIL`), `appLoginFields`, `appSettingRows`, `storedValuePresent`. -- `web/handlers.go`: `deployPageData` gives the tab `LoginFields`, `SettingsRows`, `CurrentHDDLabel`; the reveal - handler's 404 branch uses `storedValuePresent`. -- `app_settings.html`: the login panel; „Cím és kulcsok" as rows (hint under the title, „Tárhely" row, other answers and - keys as rows); no `app_deploy_fields`, no `deploy-container` (700px) wrapper; every block an `.app-section`. -- `app_data.html`, `app_guide.html`, `app_logs.html`: every block an `.app-section` (screenshots hide their panel when none - loads; export title „Exportálás", inputs in the dashboard style). -- `style.css`: style A panels; the install page's `.form-section` and progress panel share the rule. -- `app_fields.html`: header comment only (the install page is byte-identical). -- Locales: `app_page.login_title`, `login_desc`, `login_no_password`, `login_no_name`, `value_no`; `app_export.exportalas` - is now „Exportálás" / "Export". +- `web/app_page.go`: `installed = Deployed || Infra`; infra tabs settings/guide/logs; data tab and install page 302 + for infra; the settings tab skips the install form for infra and sets `LoginAnswer`. +- `web/handlers.go` (`appCommonData`): `Infra`, `InfraInfo`, the infra subdomain, `FilesLink`; + `appFileBrowserResetHandler`. `web/server.go`: the reset route. +- `web/app_login.go`: `loginAnswerFor`. `web/datapath_card.go`: media folder rows, `drivePresent`, `filesButtonLink`, + a folder with no source is text. `web/inframeta.go`: `infraMetaIn`. +- `stacks/filebrowser_password.go`: `ResetFileBrowserAdminPassword`, `fileBrowserCLISetPassword`. + `stacks/deploy.go` + `api/router.go`: the protected-stack refusal. `stacks/metadata.go`: `AppInfo.LoginKind`, + `EffectiveLoginKind`. +- Templates: `app_settings.html` (one login panel, infra Restart only), `app_shell.html` (infra tagline, „Fájlok ↗"), + `app_data.html` (text rows, the FileBrowser line), `app_guide.html` (infra two lines); `style.css`. -**Pairs (computed by the Go code over the catalog):** calibre-web, kimai (ADMIN_EMAIL), lubelogger, nextcloud, -paperless-ngx, radicale. The other 14 password apps show the password alone. +## 4. Tests and gates -## 4. Tests and red-proofs +Red-proved: `TestAppPage_InfraAppHasNoInstall`, `_EveryInstalledAppHasOneLoginAnswer`, `_FilesButtonTarget`, +`_UnknownSourceIsTextNotLink`, `TestFileBrowserReset_SetsVerifiesAndStoresEncrypted`, `_FailedVerifyKeepsOperator`, +`_OnlyInOperatorState`, `TestDeployStack_RefusesProtectedStack` (mutations and failures: felhom.eu +`audits/logins-folders-2026-10-16/redproof.txt`). Also `TestFileBrowserResetEndpoint_Refusals`, +`TestEffectiveLoginKind_DefaultAndUnknown`. Green gate `go build/vet/test ./...` rc 0; `controller_gates.py --fast` all +OK. Parity fixtures: 25 re-captured, 6 new (named in the CHANGELOG); every other one byte-identical. -New, each seen failing by a compiling mutation, then reverted: -- `TestAppPage_LoginPairPanel` — pairing loop dropped → fails (name missing). -- `TestAppPage_NoStoredValueShowsSentence` — `Stored: true` always → fails (eye offered, endpoint 404). -- `TestAppPage_SettingsHasNoDuplicateDomain` — install form back in the tab → fails (Domain, deploy-form, HDD_PATH). -- `TestAppPage_OneSectionStyleEverywhere` — logs tab on old markup → fails. -- `TestDeployPage_DeployedSelectShowsStoredHDDPath` (re-targeted to the row) — row reads the default drive → fails. +## 5. Observations -**Caught by an old test during the work:** removing the deployed-only branches of `app_fields.html` would have put an -installed app's secret into `/apps/{slug}/install` (that address still answers for an installed app). -`TestDeployPage_DeployedApp_DoesNotCarryTheSecret` failed; the branches were restored and two parity cases now render -them (R-1095 filed for the route). - -**Parity fixtures:** 36 app-page fixtures re-captured (the per-task exception): `app_settings_*` (22), `app_data_*` (9), -`app_guide_*` (4), `app_logs`. New: `app_settings_login_not_stored`, `app_settings_login_text_name`, `deploy_installed`, -`deploy_installed_restored`. Every `deploy_new*` fixture and every other fixture byte-identical. -`go test ./...` rc=0 and `controller_gates.py --fast` green before each commit. - -## 5. Live validation - -- **Browser:** headless Chrome (`chrome-headless-shell` on DooPlex, driven over the DevTools protocol by a small script) - through `https://felhom.enkisfelhom.hu`, signed in through the real login form. Calibre-Web and Paperless, four tabs - each, plus the Grocy install page. Measured: active tab `--bg-2` + 2px `--blue-bright`; hero, tab bar, sections - `--bg-1`; section padding 18px/24px, 16px apart; every section 820px = the column (logs: 966 = the wide column); - login pair two columns, one column at 390px, no side scroll. Console: clean, except one 404 for a screenshot file the - catalog does not have (the panel hides it; see §7). Screenshots: `audits/app-page-tuning-2026-10-16/browser/`, before: - `…/before/`. -- **Release:** per-customer floors 0.319.0 on Tester 1, demo-hp, demo-felhom (303 `floor_set`); all three ran 0.319.0 at - 10:34 UTC, the image file written by the update path. Box walk checks green on all three: https-only (`https_only_check.py` - rc 0), 0 unhealthy / restarting / exited / created containers, controller healthy, dashboards 200. Global floor - 0.319.0 at 10:35:57 UTC, per-customer floors cleared, read back from the hub DB with its WAL. - -## 6. One slip of my own - -I first saved the global floor with MinAgent **0.157.0**. The floor before it (0.318.0) carried **0.158.1**, set by the -operator because agent 0.158.0's format wrapper is superseded. I re-saved 0.319.0 / **0.158.1** at 10:37:02 UTC (read -back: `0.319.0=0.158.1`). For 65 seconds the declared MinAgent was lower. No box runs agent 0.158.0 (the hub's hosts: -three on 0.158.1, Tester 2 on 0.142.0 and held), so no box changed. The CHANGELOG header now says 0.158.1. - -## 7. Observations - -1. `/apps/{slug}/install` answers for an INSTALLED app with the install form read-only. - FILED: R-1095 -2. The hub's per-app „Deployments 2" counts telemetry history (demo-felhom no longer has Calibre-Web). - NOT-A-FINDING: the page labels it telemetry; the box was checked directly. -3. `InjectMissingFields` never fills a new `type: password` field for an installed app. - NOT-A-FINDING: inventing a login the app never got is R-757's defect; the page now says it in words. -4. The guide asks for three screenshots; Calibre-Web has two, so the browser logs one 404. - NOT-A-FINDING: designed graceful hiding, unchanged. -5. The data tab's „2. mentés" status grid uses the mono font for values and wraps long text. - NOT-A-FINDING: unchanged markup, outside this brief. - -## 8. Teardown - -Machine: demo-hp guest 9201 runs 0.319.0 (was 0.318.0 → rc.1..rc.3 by hand, Tier 0); the Part 0 scripts were deleted -from the host and the guest. Host: nothing provisioned. Hub: the per-customer floors are cleared; the global floor is -0.319.0 / 0.158.1. The test tags `0.319.0-rc.1..3` stay in the registry (an rc is never offered to a household). +1. One sign-in for the dashboard and FileBrowser. FILED: R-1100. +2. FileBrowser's stored password goes stale when changed in FileBrowser. FILED: R-1101. +3. Eight apps say „starts with a known, shared password" about a generated or typed login. FILED: R-1102. +4. The install button could deploy a protected stack. NOT-A-FINDING: small, fixed in this release with a test.