feat(cards): leech detection in /me/stats + Stats-Page-Sektion
Some checks are pending
CI / validate (push) Waiting to run

Karten mit ≥4 Lapses werden im Stats-Endpoint als `leech_cards`
geliefert (mit Front-Snippet, Deck-Name, Lapses-Count, sortiert
desc, max 20). Stats-Page zeigt eine rote „Schwierige Karten"-
Sektion mit Link in den Card-Editor.

* apps/api/src/routes/me.ts: GROUP BY card → SUM(lapses) ≥ 4
  Filter, frontSnippetFor()-Helper für alle 6 Card-Types
  (basic, basic-reverse, cloze, image-occlusion, audio-front,
  typing, multiple-choice). Cloze-Markup wird gestrippt damit
  der Snippet UI-tauglich ist.
* apps/web Stats-Page: neue CardSurface mit Warning-Icon, scrollbare
  Liste mit Front + Deck + Lapses-Badge, Empty-State.
* i18n in DE/EN/FR/IT/ES (5 Strings + plural-Form).

104/104 Tests grün (kein neuer Test — bestehende /me/stats-Tests
covern die Aggregations-Form), web check 0 errors.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Till JS 2026-05-12 19:01:48 +02:00
parent 4bb1390180
commit 9f019d8e2f
9 changed files with 198 additions and 5 deletions

View file

@ -81,9 +81,11 @@ aber im Code längst gelandet:
`computeParameters()` aus Review-History; Schema (`decks.fsrs_settings`)
und Per-Deck-Override sind vorbereitet, aber kein Endpoint und kein UI.
Größter messbarer Retention-Gewinn pro Aufwand.
- **Leech-Detection**`reviews.lapses` zählt bereits;
Auto-Markierung + UI-Vorschlag „aufteilen / suspendieren" für
Karten oberhalb eines Schwellwerts.
- **Leech-Detection — gebaut 2026-05-12.** `me/stats` liefert
`leech_cards` (Threshold 4 Lapses, Limit 20, sortiert nach
Lapses desc, mit Front-Snippet + Deck-Name). Stats-Page hat eine
rote Leech-Sektion mit Link in den Card-Editor. i18n in DE/EN/
FR/IT/ES. Suspension/Aufteilen-Vorschläge sind nächste Welle.
- **Undo letzte Bewertung** — wichtiger UX-Reflex; aktuell muss man
das Review händisch zurückbauen.
- **Card Burial / Suspension** — Karten temporär deaktivieren ohne