- Every number shown on a page goes through NumbersExtensions: counts,
percentages, the nerd readouts and the values written into a style.
- A failure the client builds itself (offline, timeout, retries run out, an
answer it can't read) is a 400 that names its kind; only a server's own 5XX
passes through.
- Login, sign-up, recovery and password confirmations leave autocomplete to
the browser, so it can offer the saved login.
- The Daisy components start with empty lists and attributes, and a
decorative image still renders alt="".
- Arasaka.HouseRules.Analyzers checks all of this in every build, together
with PrivaPub.ClientModels.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01W4YtEJrgxG12Pc39Fai8Bd
Completion program R3, with PrivaPub's TOTP routes of the same release.
- Settings, the login: TotpEditor turns two-factor sign-in on (the password, then the QR code, the secret and the
otpauth:// link, then the app's first code; the ten recovery codes shown once with Copy), shows how many recovery
codes are left (warned at three), and turns it off with the password and a code, asked first.
- Turning it on, like a password change, ends every other session: AuthService.ContinueSession takes the new JWT and
exchanges the persona's token again.
- Sign-in: PrivaPub's 428 keeps the name and password and asks for the six digits (DOtp), or a recovery code instead;
a wrong code says so; Back returns to the password.
- window.copyText (main.js) through AppStatusService.CopyText.
- 29 keys in both resx files; CLAUDE.md follows.
Verified: dotnet build decePubClient.csproj -c Release (0 errors, no new warnings).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WpVCoDeM1qUTRp4fXQdfof