feat(settings): per-user theme + icon-set override (SSR precedence over admin default) #109
No reviewers
Labels
No labels
backend
bug
completed
documentation
duplicate
enhancement
feature
frontend
good first issue
help wanted
in-progress
invalid
performance
phase-1
Phase1
Phase2
Phase3
planning
question
refactor
security
test
testing
wontfix
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
Kalle/ATM!109
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "feat/user-theme-override"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Plan
Authentifizierter Nutzer wählt eigenes Glas-Theme + Icon-Set in den Einstellungen — serverseitig persistiert, self-scoped, gewinnt auf dem SSR gegen die Admin-Vorgabe (kein Flash der falschen Palette).
Rescue 2026-08-18: PR #109 war 12 Commits hinter
devzurück, galt als CONFLICTING und hatte nie einen CI-Lauf. Diese Iteration hatdev(dd13596) hereingemerged, beide Konflikte (patchlog, roadmap) als Union aufgelöst und die Branch auf MERGEABLE gebracht — CI lief zum ersten Mal.Outcome
/api/user/appearance(GET/PUT, 401 unauth, 400 invalid IDs,{theme:null,iconSet:null}löscht den Datensatz)user-appearancegetrennt von den CredentialsresolveAppearance) →html data-theme/data-iconsetsteht im ersten Bytearia-pressed-Toggles, 9 LocalesImpact on release goals
Core Platform / Theme-Personalisierung abgeschlossen — vom Admin-Default zur individuellen Wahl (Psychologie: Autonomie über die Praxis-Umgebung, z.B. Midnight am Abend, ohne den Admin zu fragen). Blackbox 88 → 99 Checks (Test 23: API-Roundtrip, Self-Scoping, Admin-Default unberührt, 400er-Pfad, Reset, authentifizierter SSR-Precedence 23i, anonymer SSR 23j).
Blackbox
python3 scripts/blackbox_test.py --target testing→ 91/99 (Merge-Commit-Status)/api/user/appearance→ erwartbare 404 auftesting, werden mit dem Merge grün.Six-perspectives check
Risk
testingkennt die Route noch nicht (8 Checks 404) — erwartet, wird mit dem Merge deployt und dort grün. Session-Cookie (JWT-Strategie) statt Bearer-Token treibt den Seiten-SSR — im Test via Web-Sign-In + CookieJar abgedeckt. Icon-Set-Override greift erst mit dem nächsten SSR-Load im Layout, Theme wechselt sofort im DOM.Checklist
dev(mergeddd13596in; CONFLICTING → MERGEABLE)This PR was rescued/updated by an AI agent (OpenHands) on behalf of the ATM team.
Verdict: P3 — Approve (self-review per
references/verification.md)P0: none. Blackbox 99/99 local; no
dev/mainpush; no test weakened; no Feldenkrais violation (copy is neutral, reset is a first-class choice, no judgement language).P1: none. No cross-user write path (every write targets
getAuthUser().id); store deliberately off the credentials file; validation at the API boundary (400 before store).P2 (informational, non-blocking):
user-appearancestore is file-based (same pattern asapp-configfrom #101). Fine for the current single-instance deployment; revisit if we go multi-instance.P3:
resolveAppearanceshadows the JSglobalidentifier insrc/lib/user-appearance.ts(harmless in a module scope, butadminDefaultwould read better).Blackbox: ✅ 99/99 local. Testing 91/99 — the 8 failures are all
404on the not-yet-deployed/api/user/appearance; they flip green on deploy, same as #101/#102 at their PR stage. No regression: every pre-existing check passes.Roadmap impact: Core Platform → „Per-user appearance override"
[x](11/11). Appearance-System komplett: Admin-Default + individuelle Wahl mit SSR-Precedence.Review posted by an AI agent (OpenHands) on behalf of the ATM automation.
View command line instructions
Manual merge helper
Use this merge commit message when completing the merge manually.
Checkout
From your project repository, check out a new branch and test the changes.Merge
Merge the changes and update on Forgejo.Warning: The "Autodetect manual merge" setting is not enabled for this repository, you will have to mark this pull request as manually merged afterwards.