goethe_scraper.py— Added docstring explaining that prices are JS-rendered and cannot be live-scraped without PlaywrightSESSION_SUMMARY.md— Added full investigation findings (session 16)
- Documented all checked exam pages (A1-C2), JS bundles, and third-party sources
- Verdict: Live prices require Playwright or manual DevTools API capture
- CSP, HSTS, XSS-Protection, Referrer-Policy, Permissions-Policy headers
- CORS whitelist (restricted from
*) - Rate limit headers (
Retry-After,X-RateLimit-Remaining) on 429 /api/healthendpoint with DB + uptime + circuit breaker metrics- Sentry error tracking (
SENTRY_DSNenv var) - Audit log (
audit_logtable,/api/audit-logendpoint) - Session token rotation (
/api/refresh) - Brute force account lockout (30 failed = 15min ban)
- Swagger docs at
/api/docs/ - Alembic DB migrations
- Docker multi-stage build
- PWA offline support (Service Worker)
- PWA icons (48px to 512px)
- Frontend error boundary (global JS error handler)
- Dark/light theme toggle (
Tkeyboard shortcut) - Keyboard accessibility (
:focus-visiblerings,sr-only) - Form validation UX (password strength, email format hints)
- Loading state overlay on API calls
- E2E Playwright test skeleton
- pip-audit security scan in CI
- Deploy notifications via Telegram
- README updated with all new features
- SESSION_SUMMARY.md updated with Session 10 & 11
- Dead man switch now only monitors during booking (no false alarms)