feat(cards): recovery mode, undo, FSRS slider, streak header, stats charts, blog
Some checks are pending
CI / validate (push) Waiting to run

Study-View:
- Graceful Backlog Recovery: Banner bei >30 fälligen Karten, Recovery-Queue
  sortiert nach Stability aufsteigend (25er-Batch, ?recovery=true)
- Undo letzte Bewertung: 5s-Toast mit RAF-Fortschrittsbalken, Ctrl/Cmd+Z,
  prevSnapshot-Spalte in reviews (Migration 0001, Prod deployed)
- FSRS-Tooltip nach Reveal: State / Stability / Difficulty als Popover

Deck-Edit:
- Neuer Abschnitt „Lern-Algorithmus" mit request_retention-Slider (50–99 %)

Header:
- Streak-Pill (🔥 N) + fällige-Karten-Pill via GET /api/v1/me/summary

Stats-Page:
- Difficulty-Distribution (5 Buckets, Farb-Bars)
- Deck-Fortschritt (Mastery % = stability>21, max 6 Decks)

API:
- GET /me/summary: streak_days + due_now (leichtgewichtiger Header-Endpoint)
- GET /reviews/due: ?recovery=true → stability-sort, Limit 25
- POST /reviews/:cardId/:subIndex/undo: prevSnapshot-Restore, 409 wenn leer
- /me/stats: difficulty_distribution + deck_mastery

Landing:
- 5 Blog-Artikel (Quizlet-Paywall, FSRS, Datenschutz, Anki, Lernkarten-Tipps)
- BlogTeaser-Komponente auf Startseite, Footer-Spalte „Artikel"

i18n: 11 neue Schlüssel in DE/EN/FR/IT/ES

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Till JS 2026-05-13 13:37:03 +02:00
parent 21ec535173
commit abf493aeec
27 changed files with 2667 additions and 29 deletions

View file

@ -77,17 +77,23 @@ aber im Code längst gelandet:
### Scheduler-Verbesserungen
- **FSRS-Parameter pro User optimieren**`ts-fsrs` liefert
`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.
- **FSRS-Parameter pro User optimieren**`ts-fsrs@5.3.2` hat
**kein** `computeParameters()` aus Review-History (das erfordert den
Python `fsrs-optimizer`). Der praktisch nutzbare Hebel ist
`request_retention` (0.50.99): höherer Wert → mehr Wiederholungen,
besser für prüfungsrelevantes Lernen; niedrigerer Wert → lockerer,
gut für Allgemeinwissen. Schema (`decks.fsrs_settings`) und
Per-Deck-PATCH-Endpoint sind da; **Retention-Slider im Deck-Edit
gebaut 2026-05-13.** w-Gewichte-Optimierung (Offline-Python-Skript
→ JSON-Upload) bleibt offen.
- **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.
- **Undo letzte Bewertung — gebaut 2026-05-13.** `prevSnapshot`-
Spalte in `reviews`, API `POST /:cardId/:subIndex/undo`, 5-s-Toast
mit Fortschrittsbalken im Study-View, Ctrl/Cmd+Z-Shortcut.
- **Card Burial / Suspension** — Karten temporär deaktivieren ohne
Löschen; häufig angefragtes Anki-Feature.
- **Geschwister-Burial** — Cloze-Cluster und basic-reverse-Seiten
@ -100,9 +106,9 @@ aber im Code längst gelandet:
Fehler" als saubere Filter im Queue-Loader.
- **Subdeck-Unterstützung** — hierarchische Deck-Struktur
(z. B. Vokabeln → Nomen / Verben).
- **Cloze-Hint-Anzeige** — `{{c1::answer::hint}}` wird aktuell beim
Rendern fallen gelassen; Hint-Anzeige steht in `STATUS.md` als
verbleibender Phase-9-Punkt.
- **Cloze-Hint-Anzeige — bereits implementiert.** `renderClozePrompt`
in `packages/cards-domain/src/cloze.ts` rendert `{{c1::answer::hint}}`
bereits als `[hint]`. `STATUS.md`-Eintrag ist veraltet.
### Kartentypen, Schema vorhanden / vorbereitet
@ -119,8 +125,9 @@ aber im Code längst gelandet:
- **Streak-Freeze-Token** — ein Streak-Schutztag pro Woche, optional
durch Credits kaufbar.
- **Streak im Header** — heute nur im Stats-Dashboard sichtbar;
Header-Glyph mit Zahl wäre Mikro-Aufwand, sichtbare Wirkung.
- **Streak im Header — gebaut 2026-05-13.** `GET /api/v1/me/summary`
liefert `streak_days` + `due_now`; Header zeigt Flammen-Pill und
fällige-Karten-Pill via `onMount`.
- **XP + Badges** — Meilensteine (erstes Deck, 100 Karten, 30-Tage-
Streak).
- **Tages-Ziele** — „Heute: 20 Karten" mit Progress-Bar im Dashboard.
@ -152,17 +159,21 @@ aber im Code längst gelandet:
## Analytics & Insights
- **Vergessenskurven-Visualisierung** — pro Deck und Tag, aus
FSRS-State ableitbar.
- **Vergessenskurven-Visualisierung / Graceful Backlog Recovery —
gebaut 2026-05-13.** Stats-Page zeigt Difficulty-Distribution
(5 Buckets, Farb-Bars) + Deck-Fortschritt (Mastery %, Stability>21).
Study-View zeigt Recovery-Banner wenn total>30 fällige Karten,
startet Queue nach Stability sortiert (25er-Batch).
- **Retention-Rate** — aufgeschlüsselt nach Kategorie und Sprache.
- **Lernzeit-Tracking** — Minuten pro Session, Wochentrend.
- **Karten-Schwierigkeits-Heatmap** — welche Karten kosten die
meiste Review-Zeit.
- **Wöchentliche Zusammenfassung** — In-App oder per Email via
`mana-notify`.
- **Algorithmus-Transparenz pro Karte** — kleines „Wieso wurde ich
befragt?"-Tooltip mit Stability/Difficulty/letztem Rating. Macht
FSRS sichtbar (Mission-Wert „Souveränität").
- **Algorithmus-Transparenz pro Karte — gebaut 2026-05-13.**
FSRS-Tooltip im Study-View: ⓘ-Button nach Reveal öffnet Popover
mit State, Stability, Difficulty, letztem Rating. Macht FSRS
sichtbar (Mission-Wert „Souveränität").
---

View file

@ -181,10 +181,10 @@ weil sie den breitesten Markt haben.
| # | Deck-Slug | Titel | Karten | Lizenz | Sprache |
|---|---|---|---|---|---|
| 1 | `cardecky/englisch-a2-grundwortschatz` | Englisch A2 — 500 häufigste Wörter | 500 (basic-reverse) | CC-BY-4.0 | de |
| 2 | `cardecky/englisch-b1-aufbauwortschatz` | Englisch B1 — Aufbau-Wortschatz | 600 (basic-reverse) | CC-BY-4.0 | de |
| 3 | `cardecky/franzoesisch-a2-grundwortschatz` | Französisch A2 — Grundwortschatz | 500 (basic-reverse) | CC-BY-4.0 | de |
| 4 | `cardecky/mathematik-sek1-grundbegriffe` | Mathematik Sek 1 — Begriffe + Formeln | 200 (basic + cloze) | CC-BY-4.0 | de |
| 1 | `cardecky/englisch-a2-grundwortschatz` | Englisch A2 — 500 häufigste Wörter | 500 (basic-reverse) | CC-BY-4.0 | de | ✅ live 2026-05-12 (557 Karten) |
| 2 | `cardecky/englisch-b1-aufbauwortschatz` | Englisch B1 — Aufbau-Wortschatz | 600 (basic-reverse) | CC-BY-4.0 | de | ✅ live 2026-05-13 (689 Karten) |
| 3 | `cardecky/franzoesisch-a2-grundwortschatz` | Französisch A2 — Grundwortschatz | 500 (basic-reverse) | CC-BY-4.0 | de | ✅ live 2026-05-13 (575 Karten) |
| 4 | `cardecky/mathematik-sek1-grundbegriffe` | Mathematik Sek 1 — Begriffe + Formeln | 200 (basic + cloze) | CC-BY-4.0 | de | ✅ live 2026-05-13 (178 Karten) |
| 5 | `cardecky/geografie-welt-hauptstaedte` | Geografie Welt — Länder + Hauptstädte | 195 (basic-reverse) | CC-BY-4.0 | de |
| 6 | `cardecky/periodensystem-elemente` | Periodensystem — 118 Elemente | 118 (basic-reverse) | CC-BY-4.0 | de |
| 7 | `cardecky/biologie-zelle-grundlagen` | Biologie — Zelle und Zellbiologie | 80 (basic + cloze) | CC-BY-4.0 | de |
@ -206,6 +206,26 @@ weil sie den breitesten Markt haben.
geschätzt 3040 Stunden über mehrere Sessions, weil Recherche +
Quellen-Belege + Stufen-Validierung pro Deck Zeit kosten.
## 8b. Bonus-Decks (außerhalb Phase-1-Seed)
| # | Deck-Slug | Titel | Karten | Lizenz | Sprache | Status |
|---|---|---|---|---|---|---|
| B-1 | `cardecky/taegerwilen-bodensee` | Tägerwilen am Bodensee | 66 (basic + cloze + mc) | CC0-1.0 | de | ✅ live 2026-05-12 |
| B-2 | `cardecky/kreuzlingen-thurgau` | Kreuzlingen am Bodensee | 70 (basic + cloze + mc) | CC0-1.0 | de | ✅ live 2026-05-12 |
| B-3 | `cardecky/gottlieben-seerhein` | Gottlieben am Seerhein | 50 (basic + cloze + mc) | CC0-1.0 | de | ✅ live 2026-05-12 |
| B-4 | `cardecky/konstanz-bodensee` | Konstanz am Bodensee | 50 (basic + cloze + mc) | CC0-1.0 | de | ✅ live 2026-05-12 |
| B-5 | `cardecky/meersburg-bodensee` | Meersburg am Bodensee | 50 (basic + cloze + mc) | CC0-1.0 | de | ✅ live 2026-05-12 |
| B-6 | `cardecky/muensterlingen-bodensee` | Münsterlingen am Bodensee | 50 (basic + cloze + mc) | CC0-1.0 | de | ✅ live 2026-05-12 |
| B-7 | `cardecky/reichenau-bodensee` | Reichenau am Bodensee | 50 (basic + cloze + mc) | CC0-1.0 | de | ✅ live 2026-05-12 |
| B-8 | `cardecky/friedrichshafen-bodensee` | Friedrichshafen am Bodensee | 50 (basic + cloze + mc) | CC0-1.0 | de | ✅ live 2026-05-12 |
| B-9 | `cardecky/lindau-bodensee` | Lindau am Bodensee | 50 (basic + cloze + mc) | CC0-1.0 | de | ✅ live 2026-05-12 |
| B-10 | `cardecky/bregenz-vorarlberg` | Bregenz am Bodensee | 50 (basic + cloze + mc) | CC0-1.0 | de | ✅ live 2026-05-12 |
| B-11 | `cardecky/ueberlingen-bodensee` | Überlingen am Bodensee | 50 (basic + cloze + mc) | CC0-1.0 | de | ✅ live 2026-05-12 |
| B-12 | `cardecky/romanshorn-bodensee` | Romanshorn am Bodensee | 50 (basic + cloze + mc) | CC0-1.0 | de | ✅ live 2026-05-12 |
| B-13 | `cardecky/allensbach-bodensee` | Allensbach am Bodensee | 50 (basic + cloze + mc) | CC0-1.0 | de | ✅ live 2026-05-12 |
| B-14 | `cardecky/bodensee` | Der Bodensee | 50 (basic + cloze + mc) | CC0-1.0 | de | ✅ live 2026-05-12 |
| B-15 | `cardecky/thurgau` | Kanton Thurgau | 50 (basic + cloze + mc) | CC0-1.0 | de | ✅ live 2026-05-12 |
**Lizenzen:**
- Default `CC-BY-4.0` mit Attribution „Cardecky / mana e.V." erlaubt
Re-Use durch Lehrer/innen, Forks, Schul-Repositories.