docs: STATUS.md auf Phase-9-Welle-2-Stand

22 Commits / 105 Tests / Phase 9 weit ausgebaut. Subtilität #10
(content_hash-Architektur) ergänzt — Anki-Re-Import-Dedupe nutzt es,
Backfill-Lücke für Pre-9j-Karten dokumentiert. Git-Historie auf
neuesten Stand. "Was als Nächstes" auf Pre-Flight + Media-Upload
neu sortiert.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Till JS 2026-05-08 18:31:57 +02:00
parent 593d4475df
commit e7ae93dcf9

View file

@ -1,6 +1,6 @@
# Cards — Projekt-Status & Onboarding
**Letztes Update:** 2026-05-08 (Phase 8 + Phase 9 Polish-Welle)
**Letztes Update:** 2026-05-08 (Phase 8 + Phase 9 erweiterte Polish-Welle)
**Wenn du gerade neu bist (Mensch oder KI):** dieses Dokument soll dir
in 5 Minuten den vollen Kontext geben. Lies es vor allem anderen.
@ -13,10 +13,10 @@ in 5 Minuten den vollen Kontext geben. Lies es vor allem anderen.
Code-Übernahme aus dem alten `mana-monorepo`, sauber neu gebaut —
mit einer dokumentierten Ausnahme für den Anki-Format-Parser
(Phase 8c, standalone Parser-Logik).
- **17 saubere Commits** auf `main`. Type-check 4/4 grün, **94 Tests
grün** (41 Domain + 48 API + 5 Web), lokaler E2E-Smoke (Postgres →
API → Frontend → Föderations-Endpunkte → Cloze-Card → /stats
/me/export) durch.
- **22 saubere Commits** auf `main`. Type-check 4/4 grün, **105 Tests
grün** (51 Domain + 49 API + 5 Web), lokaler E2E-Smoke (Postgres →
API → Frontend → Föderations-Endpunkte → Cloze-Card mit Hint
/stats → /me/export → /cards/hashes) durch.
- **Phasen 0, 1, 3, 4, 5, 8 vollständig durch.** **Phase 9 Polish-
Welle teilweise** (Card-Edit, Cloze-Editor, Inbox-Banner, Account-
/DSGVO-Self-Service, Statistik-Dashboard) — i18n + Image-Occlusion
@ -89,7 +89,7 @@ Vollständiger Plan: [`mana/docs/playbooks/CARDS_GREENFIELD.md`](../mana/docs/pl
| 6 | Subscriptions/Credits via mana-credits | ⏸ offen | autonom möglich |
| 7 | AI/MCP-Integration | ⏸ offen | braucht laufende mana-mcp |
| 8 | Anki-Import (.apkg-Parser, Cloze-Support) | ✅ | 92 Tests grün, /import-Route benutzbar, Cloze als 3. MVP-Card-Type |
| 9 | Polish (DSGVO-UI, Settings, Account, Statistik, i18n, A11y) | 🟡 läuft | Card-Edit + Cloze-Editor + Inbox-Banner + Account/DSGVO + Statistik durch (9a-9f). i18n, A11y-Pass, Hint-Anzeige bei Cloze, Image-Occlusion und manuelle Cloze-Hint-UI offen |
| 9 | Polish (DSGVO-UI, Settings, Account, Statistik, i18n, A11y) | 🟡 weit | Card-Edit + Cloze-Editor + Inbox-Banner + Account/DSGVO + Statistik + Pre-Flight-Swap + i18n DE/EN + A11y-Pass + Cloze-Hint-Anzeige + Anki-Re-Import-Dedupe durch (9a9j). Verbleibend: Image-Occlusion, manueller Cloze-Hint-Editor-Help-UI, Media-Upload für Anki-Import |
| 10 | Production-Deploy (Mac Mini, Cloudflare-Tunnel) | ⏸ offen | braucht DNS + Tunnel-Config |
| 11 | Decommission Cards-Modul aus mana-monorepo | ⏸ offen | erst nach Phase 10 |
@ -231,6 +231,11 @@ Volle Konventionen: [`CLAUDE.md`](CLAUDE.md)
## Git-Historie
```
593d447 Phase 9j: Anki-Re-Import-Dedupe via content_hash
4b451f1 Phase 9i: Cloze-Hint-Anzeige
fd86d96 Phase 9h: A11y-Pass
c25c1d0 Phase 9g: i18n DE/EN über alle Routes
a640594 docs: STATUS.md auf Phase-9-Polish-Stand
6db6dc3 Phase 9f: Statistik-Dashboard
03117d5 Phase 9e: Account-Page mit DSGVO-Self-Service
aff4d95 Phase 9d: Pre-Flight — Protocol-Mirror durch upstream ersetzt
@ -366,7 +371,24 @@ 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**
### 10. content_hash auf cards (Sprint 9j)
Jede neue Karte bekommt einen SHA-256-`content_hash` über
`{type, sorted-fields}` — geschrieben automatisch im Card-POST,
genutzt vom Anki-Re-Import-Dedupe (`/api/v1/cards/hashes` lädt
nur die Hash-Liste, der Importer dedupliziert clientseitig).
`cardContentHash()` in `@cards/domain` ist deterministisch und
field-order-invariant. Cluster-Markup, Whitespace und Hint-
Annotationen zählen mit — bewusst, weil zwei Cards mit dem Text
`Paris ist Hauptstadt` und `{{c1::Paris}} ist Hauptstadt` sind
inhaltlich verschieden.
**Backfill-Lücke:** Pre-Sprint-9j-Karten haben `content_hash = NULL`.
Der `/hashes`-Endpoint filtert sie weg, also können sie irrtümlich
beim Re-Import erneut entstehen. Backfill-Skript ist Phase-10-Polish.
### 11. Cards-Modul in mana-monorepo wird nach Live-Gang **gelöscht**
Strategie-B-Konsequenz: nach `cardecky.mana.how` live + 2 Wochen Test
folgt ein Decommission-PR in mana-monorepo, der `apps/mana/.../modules/cards/`,
@ -397,22 +419,27 @@ diskutiert worden.
In Reihenfolge meiner Empfehlung:
1. **Phase 9 weiter ausbauen** — i18n DE/EN-Pass über alle Routes,
A11y-Pass, Hint-Anzeige bei Cloze (`{{c1::a::hint}}`), Media-
Upload für Anki-Import (additiv via lokalem cards-api-Endpoint).
Re-Import-Dedupe wäre nice. ~35 Tage.
2. **Pre-Flight Restklemmen abräumen** — DNS, GitHub-Repo
1. **Pre-Flight Restklemmen abräumen** — DNS, GitHub-Repo
`mana-ev/cards`, mana-auth-App-Reg (Service-Key + Public-Key),
mana-share-Manifest-Reg. Verdaccio + Protocol-Swap durch
(Sprint 8d). Hängt an User-Aktion + laufender Plattform.
mana-share-Manifest-Reg. Hängt an User-Aktion + laufender
Plattform.
2. **Media-Upload für Anki-Import** (Sprint-Kandidat 15) — lokaler
`POST /api/v1/media/upload`-Endpoint mit MinIO oder Disk;
Anki-Importer reicht die Filename→URL-Map durch sanitizeAnkiHtml.
Open: Storage-Backend-Wahl (MinIO vs. lokal). 12 Tage.
3. **Phase 6 (Subscriptions)** — braucht laufende mana-credits +
Phase 2 Auth-Föderation.
4. **Phase 7 (AI/MCP)** — braucht laufende mana-mcp.
5. **Phase 10 (Production-Deploy)** — Mac Mini + Cloudflare-Tunnel,
nach allen Pre-Flight-Items.
6. **content_hash-Backfill** — Pre-Phase-9j-Karten haben null
content_hash; ein einmaliges Skript würde sie nachziehen, sodass
Re-Import-Dedupe lückenlos funktioniert. Phase 10-Polish, sobald
Live-User da sind.
Was nicht autonom geht: Phase 2, 6, 7, 10 — alle hängen an Pre-Flight
oder Plattform-Diensten. Phase 9 weiter ist autonom möglich.
oder Plattform-Diensten. Phase 9 ist breit ausgebaut; Image-Occlusion
und Image-Occlusion-Editor wären die nächsten autonomen Polish-Items.
---