From e7ae93dcf9d3f0354fed6e8a01d1a9c71d1763f6 Mon Sep 17 00:00:00 2001 From: Till JS Date: Fri, 8 May 2026 18:31:57 +0200 Subject: [PATCH] docs: STATUS.md auf Phase-9-Welle-2-Stand MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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) --- STATUS.md | 57 ++++++++++++++++++++++++++++++++++++++++--------------- 1 file changed, 42 insertions(+), 15 deletions(-) diff --git a/STATUS.md b/STATUS.md index 849d18b..f520360 100644 --- a/STATUS.md +++ b/STATUS.md @@ -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 (9a–9j). 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. ~3–5 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). 1–2 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. ---