Phase 8d: STATUS.md auf Phase-8-Stand aktualisiert

TL;DR-Summary auf 11 Commits / 92 Tests / Cloze + Anki-Import
verschoben. Phasen-Tabelle: 8  mit 92 Tests grün. Architektur-
Subtilitäten ergänzt (#6 Cloze-N-Reviews, #7 Strategie-B-Ausnahme
für Anki-Parser, #8 Media-Drop, #9 sql-wasm.wasm-Pflege; alte #6
Decommission rutscht auf #10). MVP-Card-Type-Set in Punkt 6 der
festgenagelten Architektur-Entscheidungen aktualisiert. Subtilität
#2 (SubIndex-Granularität) verweist jetzt auf #6 für die text-
abhängige Cloze-Variante.

"Was als Nächstes ansteht"-Empfehlung neu sortiert: Card-Edit-Page
+ Pre-Flight-Abräumen (Verdaccio-Token liegt vor) statt Anki-Import
auf Platz 1.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Till JS 2026-05-08 17:46:33 +02:00
parent 2ca09fe0c3
commit 9da10b3252

View file

@ -1,6 +1,6 @@
# Cards — Projekt-Status & Onboarding # Cards — Projekt-Status & Onboarding
**Letztes Update:** 2026-05-08 **Letztes Update:** 2026-05-08 (Phase 8)
**Wenn du gerade neu bist (Mensch oder KI):** dieses Dokument soll dir **Wenn du gerade neu bist (Mensch oder KI):** dieses Dokument soll dir
in 5 Minuten den vollen Kontext geben. Lies es vor allem anderen. in 5 Minuten den vollen Kontext geben. Lies es vor allem anderen.
@ -10,14 +10,18 @@ in 5 Minuten den vollen Kontext geben. Lies es vor allem anderen.
- **Cards** ist die föderierte Spaced-Repetition-App des Vereins - **Cards** ist die föderierte Spaced-Repetition-App des Vereins
**mana e.V.** Strategie-B-Greenfield (beschlossen 2026-05-08): kein **mana e.V.** Strategie-B-Greenfield (beschlossen 2026-05-08): kein
Code-Übernahme aus dem alten `mana-monorepo`, sauber neu gebaut. Code-Übernahme aus dem alten `mana-monorepo`, sauber neu gebaut —
- **6 saubere Commits** auf `main`. Type-check 4/4 grün, **70 Tests mit einer dokumentierten Ausnahme für den Anki-Format-Parser
grün**, lokaler E2E-Smoke-Test (Postgres → API → Frontend → Föderations- (Phase 8c, standalone Parser-Logik).
Endpunkte) durch. - **11 saubere Commits** auf `main`. Type-check 4/4 grün, **92 Tests
- **Phasen 0, 1, 3, 4, 5 sind durch** und verifiziert. Phase 2 (Auth- grün** (41 Domain + 46 API + 5 Web), lokaler E2E-Smoke (Postgres →
Föderation) ist auf user-side Pre-Flight blockiert. API → Frontend → Föderations-Endpunkte → Cloze-Card mit 2-Cluster-
Sub-Index) durch.
- **Phasen 0, 1, 3, 4, 5, 8 sind durch** und verifiziert. Phase 2
(Auth-Föderation) ist auf user-side Pre-Flight blockiert.
- Cards läuft lokal, ist im Browser benutzbar, hat alle Föderations- - Cards läuft lokal, ist im Browser benutzbar, hat alle Föderations-
Endpoints aus dem `app-manifest.json` implementiert. Endpoints aus dem `app-manifest.json` implementiert. Anki-Decks
können importiert werden (Cloze first-class).
``` ```
┌─────────────────────────────────┐ ┌─────────────────────────────────┐
@ -53,8 +57,9 @@ Diese stehen — nicht ohne explizite Diskussion antasten:
4. **Föderations-Endpoints als Pflicht** — alle aus `app-manifest.json` 4. **Föderations-Endpoints als Pflicht** — alle aus `app-manifest.json`
implementiert (siehe Phase 5 unten). implementiert (siehe Phase 5 unten).
5. **Encryption initial AUS.** Nachrüstbar via mana-auth-MK. 5. **Encryption initial AUS.** Nachrüstbar via mana-auth-MK.
6. **MVP-Card-Types nur `basic` + `basic-reverse`.** Schema vorbereitet 6. **MVP-Card-Types `basic` + `basic-reverse` + `cloze`** (Cloze in
auf full-set (cloze, type-in, image-occlusion, audio, multiple-choice). Phase 8 ergänzt). Schema vorbereitet auf full-set (type-in,
image-occlusion, audio, multiple-choice).
Vollständiger Plan: [`mana/docs/playbooks/CARDS_GREENFIELD.md`](../mana/docs/playbooks/CARDS_GREENFIELD.md) Vollständiger Plan: [`mana/docs/playbooks/CARDS_GREENFIELD.md`](../mana/docs/playbooks/CARDS_GREENFIELD.md)
(im Plattform-Repo, weil er Verein-übergreifend gilt). (im Plattform-Repo, weil er Verein-übergreifend gilt).
@ -73,7 +78,7 @@ Vollständiger Plan: [`mana/docs/playbooks/CARDS_GREENFIELD.md`](../mana/docs/pl
| 5 | Föderations-Endpunkte (share, tools, search, dsgvo) | ✅ | 70 Tests grün, E2E-Smoke (Quote→Inbox→Search→DSGVO-Roundtrip) | | 5 | Föderations-Endpunkte (share, tools, search, dsgvo) | ✅ | 70 Tests grün, E2E-Smoke (Quote→Inbox→Search→DSGVO-Roundtrip) |
| 6 | Subscriptions/Credits via mana-credits | ⏸ offen | autonom möglich | | 6 | Subscriptions/Credits via mana-credits | ⏸ offen | autonom möglich |
| 7 | AI/MCP-Integration | ⏸ offen | braucht laufende mana-mcp | | 7 | AI/MCP-Integration | ⏸ offen | braucht laufende mana-mcp |
| 8 | Anki-Import (.apkg-Parser + mana-media-Upload) | ⏸ offen | autonom möglich, ~57 Tage | | 8 | Anki-Import (.apkg-Parser, Cloze-Support) | ✅ | 92 Tests grün, /import-Route benutzbar, Cloze als 3. MVP-Card-Type. Media + Editor-UI bewusst out-of-scope |
| 9 | Polish (DSGVO-UI, Settings, Account, Statistik, i18n, A11y) | ⏸ offen | breite Polish-Phase | | 9 | Polish (DSGVO-UI, Settings, Account, Statistik, i18n, A11y) | ⏸ offen | breite Polish-Phase |
| 10 | Production-Deploy (Mac Mini, Cloudflare-Tunnel) | ⏸ offen | braucht DNS + Tunnel-Config | | 10 | Production-Deploy (Mac Mini, Cloudflare-Tunnel) | ⏸ offen | braucht DNS + Tunnel-Config |
| 11 | Decommission Cards-Modul aus mana-monorepo | ⏸ offen | erst nach Phase 10 | | 11 | Decommission Cards-Modul aus mana-monorepo | ⏸ offen | erst nach Phase 10 |
@ -216,6 +221,10 @@ Volle Konventionen: [`CLAUDE.md`](CLAUDE.md)
## Git-Historie ## Git-Historie
``` ```
2ca09fe Phase 8c: Anki-Import via portiertem Parser
0b609c4 Phase 8b: Cloze-Render im Study-View
553a78d Phase 8a: Cloze als MVP-Card-Type, Cluster-Counter
2bed282 docs: STATUS.md als Single Source of Truth für Cards-Onboarding
0328caa Phase 5: Föderations-Endpunkte — Cards ist föderierter Peer 0328caa Phase 5: Föderations-Endpunkte — Cards ist föderierter Peer
89a7a92 Phase 4: Frontend-Core MVP — Decks, Cards, Study mit FSRS-Loop 89a7a92 Phase 4: Frontend-Core MVP — Decks, Cards, Study mit FSRS-Loop
e3b3a2b docs: SMOKE_TEST.md — verifizierter E2E-Lauf gegen lokale Postgres e3b3a2b docs: SMOKE_TEST.md — verifizierter E2E-Lauf gegen lokale Postgres
@ -249,7 +258,9 @@ sub_index 1 = back→front). Cloze hat 1 Review pro Cluster-Index.
Beim Card-Insert werden alle initialen Reviews in **einer Transaktion** Beim Card-Insert werden alle initialen Reviews in **einer Transaktion**
mit angelegt — siehe `apps/api/src/routes/cards.ts` POST-Handler. mit angelegt — siehe `apps/api/src/routes/cards.ts` POST-Handler.
`subIndexCount(type)` in `@cards/domain` ist die Single Source of Truth. `subIndexCount(type)` in `@cards/domain` ist die SoT für statische
Typen. Für Cloze siehe Subtilität #6`subIndexCountForCloze(text)` ist
die SoT, weil die Anzahl text-abhängig ist.
### 3. Lokales Protocol-Mirror ### 3. Lokales Protocol-Mirror
@ -280,7 +291,50 @@ Swap auf mana-auth:
- Web: `@mana/shared-auth`-Login-Flow gegen `auth.mana.how` - Web: `@mana/shared-auth`-Login-Flow gegen `auth.mana.how`
- Beide aus Verdaccio (= NPM_AUTH_TOKEN-blockiert) - Beide aus Verdaccio (= NPM_AUTH_TOKEN-blockiert)
### 6. Cards-Modul in mana-monorepo wird nach Live-Gang **gelöscht** ### 6. Cloze-Karten haben N Reviews — sub_index pro Cluster
`subIndexCount('cloze')` wirft bewusst, weil die Anzahl text-abhängig
ist. Caller müssen `subIndexCountForCloze(text)` aus `@cards/domain`
nutzen. Cluster werden nach numerischer ID aufsteigend sortiert
(`{{c1::…}}` = sub_index 0, `{{c2::…}}` = 1, …). Der Card-POST-Handler
lehnt `type=cloze` ohne mindestens ein Cluster mit 422 ab — eine Cloze
ohne `{{cN::…}}`-Markup ist sinnlos.
Render-Helpers (`renderClozePrompt` / `renderClozeAnswer`) leben in
`@cards/domain/src/cloze.ts`, sind 12-fach unit-getestet und werden
vom Study-View dünn konsumiert. Hint-Markup (`{{c1::answer::hint}}`)
wird MVP-stumm gedroppt — Hint-Anzeige ist Phase-9-Polish.
### 7. Anki-Parser ist eine bewusste Strategie-B-Ausnahme
`apps/web/src/lib/anki/parse.ts` und `lib/components/AnkiImport.svelte`
sind aus mana-monorepo portiert. Kennzeichnung im Header-Kommentar.
Begründung: Anki-Format-Logik ist standalone Parser-Code (jszip +
sql.js), kein Architektur-Schmuggel — die Kopie spart 2-3 Tage
Re-Implementierung bei null Strategy-Risiko.
`import.ts` wurde NICHT portiert: das Original schreibt gegen Dexie-
Stores und bricht damit Architektur-Invariante #1 (server-authoritative
MVP). Die neue Version ist von Hand geschrieben und nutzt direkt
`$lib/api/{decks,cards}` über HTTP.
### 8. Media-Refs werden beim Anki-Import gedroppt (Phase 8 MVP)
`sanitizeAnkiHtml` strippt `<img>` und `[sound:…]`-Markup ersatzlos.
Späterer Media-Pfad ist additiv — entweder ein lokaler
`POST /api/v1/media/upload` in cards-api oder gegen Plattform-`mana-media`
nach Phase 2. Die Filename→ZIP-Map liegt im `ParsedAnki.mediaByFilename`
weiterhin bereit, sie wird aktuell nur für die Preview-Anzeige
("X Medien werden nicht übernommen") genutzt.
### 9. sql-wasm.wasm liegt unter apps/web/static/
660kB Build-Asset. Wird vom Browser einmal geladen (initSqlJs cache
in parse.ts). Bei Update von `sql.js` muss die Datei neu kopiert
werden: `cp apps/web/node_modules/sql.js/dist/sql-wasm.wasm
apps/web/static/sql-wasm.wasm`.
### 10. Cards-Modul in mana-monorepo wird nach Live-Gang **gelöscht**
Strategie-B-Konsequenz: nach `cardecky.mana.how` live + 2 Wochen Test Strategie-B-Konsequenz: nach `cardecky.mana.how` live + 2 Wochen Test
folgt ein Decommission-PR in mana-monorepo, der `apps/mana/.../modules/cards/`, folgt ein Decommission-PR in mana-monorepo, der `apps/mana/.../modules/cards/`,
@ -311,13 +365,17 @@ diskutiert worden.
In Reihenfolge meiner Empfehlung: In Reihenfolge meiner Empfehlung:
1. **Phase 8 (Anki-Import)** — autonom, klar abgegrenzte Funktionalität, 1. **Card-Edit-Page + Inbox-Banner im Frontend** — 12 Tage Polish.
~57 Tage. Brauchbar als Migrations-Hilfe für künftige User. Schließt die augenfälligste UI-Lücke (Karten kann man anlegen aber
2. **Card-Edit-Page + Inbox-Banner im Frontend** — 12 Tage Polish. nicht editieren). Cloze-Editor wäre sinnvoll mitzuziehen.
3. **Pre-Flight aktiv abräumen** — Mana-Plattform-Stack + mana-auth 2. **Pre-Flight aktiv abräumen** — Mana-Plattform-Stack + mana-auth
live, dann Cards als App registrieren (Phase 2). live, dann Cards als App registrieren (Phase 2). NPM_AUTH_TOKEN
4. **Phase 6 (Subscriptions)** — braucht laufende mana-credits. für Verdaccio liegt laut Memory bereits vor — der Protocol-Mirror-
5. **Phase 9 (Polish)** — Settings, Account, DSGVO-UI, Statistik, i18n. Swap auf `@mana/shared-share-protocol` ist eine 1-2h-Arbeit.
3. **Phase 6 (Subscriptions)** — braucht laufende mana-credits.
4. **Phase 9 (Polish)** — Settings, Account, DSGVO-UI, Statistik,
i18n, Hint-Anzeige bei Cloze, Media-Upload für Anki-Import
(additiv zu Phase 8c).
Was nicht autonom geht: Phase 2 (Auth-Föderation), Phase 7 (mana-mcp- Was nicht autonom geht: Phase 2 (Auth-Föderation), Phase 7 (mana-mcp-
Live), Phase 10 (Mac-Mini-Deploy) — alle hängen an Pre-Flight-Items. Live), Phase 10 (Mac-Mini-Deploy) — alle hängen an Pre-Flight-Items.