Block a user
[Code-Quality] Robustheit: parseInt-Radix, minGapDays-Guard, catch-Logs
[Bug] saveState scheitert still bei vollem/blockiertem localStorage
[Performance] isEligible re-filtert/sortiert die ganze History pro Kandidat
[Performance] saveState debouncen + XLSX-Script defer/lazy-load
[Performance] Kalender-Voll-Rerender bei jeder Interaktion
[Bug] Jahr fest auf 2026 verdrahtet — dynamisch machen
[Bug] „Plan generieren“ überschreibt manuelle Einträge ohne Warnung
[Bug] Import (JSON/Excel) ohne Validierung — Crash & fehlendes Feedback
[Bug] <img>-Tags laden nicht bei aktivem APP_PASSWORD
[Bug] <img>-Tags laden nicht bei aktivem APP_PASSWORD
[Bug] <img>-Tags laden nicht bei aktivem APP_PASSWORD
Fix umgesetzt, siehe Issue-Body. Backend-Smoketest:
- Gueltiger Token via Query -> 200
- Kein Token -> 401
- Falscher Token -> 401
/thumbmit Query-Token -> 200
[Quality] HTTP-Status-Codes vereinheitlichen + Job-Dict typisieren
Fix (a) umgesetzt in server.py:
Konvention durchgezogen:
- 404 Resource not found (Datei, Ordner, Job, Export)
- 403 Permission denied (auth/path-sandbox/owner-check)
- 415…
[Quality] HTTP-Status-Codes vereinheitlichen + Job-Dict typisieren
[Quality] Job-Dict typisieren mit Pydantic-Modell
[Quality] DRY: Tempdir-Validation und Extension-Listen zentralisieren
Fix umgesetzt in server.py:
Zentrale Extension-Listen
IMAGE_FORMATS = {
"upload": {".jpg", ".jpeg", ".png", ".webp", ".heic", ".heif"},
"heic": {".heic", ".heif"},
…
[Quality] DRY: Tempdir-Validation und Extension-Listen zentralisieren
[Quality] Logging-Infrastruktur + bare except eliminieren
Fix umgesetzt:
Setup in server.py:
import logging
logging.basicConfig(level=logging.INFO, format="%(asctime)s %(levelname)s %(name)s: %(message)s")
logger = logging.getLogger("only…
[Quality] Logging-Infrastruktur + bare except eliminieren
[Perf/UX] Frontend: Polling-Backoff, Virtualisierung, Memo
[Perf/UX] Frontend: Polling-Backoff, Virtualisierung, Memo
Fix (a) und (b) umgesetzt in index.html:
(a) Polling-Backoff + Wall-Clock-Timeout
- Helper
_pollDelayMs(elapsedMs): 300ms < 10s, 800ms < 30s, sonst 1500ms - `POLL_TIMEOUT_MS = 10 * 60 *…