# Live validation — controller v0.254.0 on demo-hp guest 9201 (2026-09-18, release C) **Method: endpoint-level, stated as such.** No browser on DooPlex. Nothing was installed, created, formatted or deleted, and **the deploy endpoint was not touched at all** — the new rule (`.claude/rules/live-probes.md`) written after yesterday's mistake. The password was passed as a file and deleted from host and guest afterwards. ## 1. A visitor's language is their own (no session) — before and after | probe | 0.253.0 | 0.254.0 | |---|---|---| | globe on `/login` | **0** | **1** | | `POST /lang lang=en back=/login` | 302 (no such route → the login redirect) | **303, `felhom_lang=en` set** | | `/login` with that cookie | `` | **``**, and "Forgot password" present | | **`settings.json` `language` after it** | `"hu"` | **`"hu"` — unchanged.** An anonymous request cannot write what the household owns | | `POST /lang lang=xx` | 302 | **400**, no cookie | | `POST /lang back=//evil.example/x` | the login redirect | **`/`** — a protocol-relative URL is another origin | | globe on `/claim` | 0 | **1** | ## 2. A signed-in household reads their own setting, never the cookie `/launcher` with a session **and** the `felhom_lang=en` cookie → **``**. The cookie is not read once there is a session; that is the row that keeps a household from inheriting a language a previous visitor picked in the same browser. ## 3. The dashboard globe, end to end `POST /settings/language lang=en` (session CSRF) → 302 → `settings.json` `"language": "en"` → `/launcher`, `/backups`, `/backups/remote` all `` → switched back → `"hu"`. The footer renders in order — version, globe, sign-out — and the old two-text-link switch is gone (`lang-switch-btn` count 1 → **0**): ```