docs(website): demo mode step 4 built — DM19, DM20 (the app)

- DM19: the app shows a refusal as one snackbar with the server's sentence;
  lines that blame the role say the demo sentence; ErrorKind.DEMO_LOCKED for
  load screens. §3.1 rewritten to match.
- DM20: the app shows the banner only; its strip names the site's sign-in page
  for the passwords (§6).
- §10 step 4 built as Android-app#61.
- android/PLAN.md §7: the demo's refusal and strip.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01E14m6SuuY6i1vASFeGDBeY
This commit is contained in:
2026-10-26 06:30:10 -05:00
parent cf5fe5cf75
commit 076eebee24
2 changed files with 20 additions and 4 deletions

View File

@@ -776,6 +776,11 @@ Mirrors the website's "degrade gracefully" invariant:
shard as **offline**, keep the rest of the app usable.
- **Site maintenance** (`/public/status` = maintenance) → show the maintenance page; public shard
widgets may still render (they're not maintenance-gated server-side).
- **The public demo's refusal** (`403` with `code: "DEMO_LOCKED"`, `../website/DEMO_MODE.md` §3.1) →
one app-wide snackbar with the server's sentence, spotted by an interceptor on the main client;
`HttpError` carries the body's `code`, `ErrorKind.DEMO_LOCKED` covers load screens (no Retry), and
a screen whose `403` line blames the role says the demo sentence instead (DM19). Home shows the
demo's strip from `/public/settings`' `demo` block (DM20).
- **Offline caching is not a v1 requirement** (decided). The app assumes connectivity and shows clean
loading/error/retry states; it does **not** ship a Room cache in v1. Cached read-only content can be
added later without reworking the repository layer (its typed results already isolate the UI from the