docs: STATUS.md auf Phase-9-Welle-3-Stand
Some checks are pending
CI / validate (push) Waiting to run

24 Commits / 129 Tests / Phase 9 weit ausgebaut. Subtilität #11
(MinIO-Media-Storage, ObjectKey-Format <userId>/<ulid>.<ext>) und
#12 (Image-Occlusion-Architektur, MaskRegion-Schema, Editor/View-
Komponenten) ergänzt. MVP-Card-Set jetzt 4-mitgliedrig: basic,
basic-reverse, cloze, image-occlusion. Lokal-Dev-Setup um Bucket-
Container erweitert. Git-Historie + "Was als Nächstes" auf neuesten
Stand — Phase 9 ist jetzt im Wesentlichen fertig, Image-Occlusion-
Polish (Resize/Move) und weitere CardTypes (type-in, audio, mc)
sind die nächsten autonomen Items.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Till JS 2026-05-08 18:52:49 +02:00
parent 39b1791fb9
commit 04c48ed930

View file

@ -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).
- **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.
- **24 saubere Commits** auf `main`. Type-check 4/4 grün, **129 Tests
grün** (66 Domain + 56 API + 7 Web), lokaler E2E-Smoke (Postgres →
API → MinIO → Frontend → Cloze + Image-Occlusion + Anki-Import mit
Media → /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
@ -67,9 +67,9 @@ Diese stehen — nicht ohne explizite Diskussion antasten:
4. **Föderations-Endpoints als Pflicht** — alle aus `app-manifest.json`
implementiert (siehe Phase 5 unten).
5. **Encryption initial AUS.** Nachrüstbar via mana-auth-MK.
6. **MVP-Card-Types `basic` + `basic-reverse` + `cloze`** (Cloze in
Phase 8 ergänzt). Schema vorbereitet auf full-set (type-in,
image-occlusion, audio, multiple-choice).
6. **MVP-Card-Types `basic` + `basic-reverse` + `cloze` +
`image-occlusion`** (Cloze Phase 8, Image-Occlusion Phase 9l).
Schema vorbereitet auf type-in, audio, multiple-choice.
Vollständiger Plan: [`mana/docs/playbooks/CARDS_GREENFIELD.md`](../mana/docs/playbooks/CARDS_GREENFIELD.md)
(im Plattform-Repo, weil er Verein-übergreifend gilt).
@ -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) | 🟡 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 |
| 9 | Polish (DSGVO-UI, Settings, Account, Statistik, i18n, A11y, Media, Image-Occlusion) | 🟡 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 + MinIO-Media-Upload + Image-Occlusion durch (9a9l). Verbleibend: type-in, audio, multiple-choice (Schema vorbereitet) |
| 10 | Production-Deploy (Mac Mini, Cloudflare-Tunnel) | ⏸ offen | braucht DNS + Tunnel-Config |
| 11 | Decommission Cards-Modul aus mana-monorepo | ⏸ offen | erst nach Phase 10 |
@ -105,9 +105,10 @@ Legende: ✅ erledigt + verifiziert · 🚧 blockiert · ⏸ noch nicht begonnen
cd /Users/till/Documents/Code/cards
# 1. Dependencies (idempotent)
pnpm install
NPM_AUTH_TOKEN=<verdaccio-token> pnpm install
# 2. Postgres-Container (auf :5435, kollidiert nicht mit Mana-Plattform-:5432)
# 2. Postgres + MinIO-Container (Postgres :5435, MinIO :9100/:9101 —
# kollidiert nicht mit Plattform-:5432/:9000/:9001)
pnpm docker:up
# 3. Drizzle-Schema pushen
@ -231,6 +232,9 @@ Volle Konventionen: [`CLAUDE.md`](CLAUDE.md)
## Git-Historie
```
39b1791 Phase 9l: Image-Occlusion als 4. MVP-CardType
c9eb0a6 Phase 9k: Media-Upload via MinIO-Container
e7ae93d docs: STATUS.md auf Phase-9-Welle-2-Stand
593d447 Phase 9j: Anki-Re-Import-Dedupe via content_hash
4b451f1 Phase 9i: Cloze-Hint-Anzeige
fd86d96 Phase 9h: A11y-Pass
@ -371,6 +375,38 @@ 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`.
### 11. MinIO-Media-Storage (Sprint 9k)
`cards-minio`-Container im `infrastructure/docker-compose.yml` auf
9100/9101 (Plattform-MinIO ist 9000/9001 — wir bleiben isoliert).
`apps/api/src/services/storage.ts` ist ein dünner Wrapper um den
`minio`-Client; `ensureBucket()` ist idempotent. ObjectKey-Format
`<userId>/<ulid>.<ext>` ermöglicht Bucket-Prefix-Sweep beim
DSGVO-Delete (kein S3-Cascade).
Konfiguration via `CARDS_S3_*`-env-Vars; Default lokaler Container.
Phase-10-Prod kann gegen denselben Container auf dem Mac Mini laufen
(eigener Bucket) oder gegen Plattform-MinIO. Keine Code-Änderung,
nur env.
### 12. Image-Occlusion (Sprint 9l)
Field-Schema: `image_ref` zeigt auf eine `media_files.id` (Sprint 9k
Storage), `mask_regions` ist ein JSON-Array mit Schema:
`{ id, x, y, w, h, label? }`, alle Coords 0..1 relativ.
`subIndexCount('image-occlusion')` wirft analog zu cloze; Card-POST
nutzt `maskRegionCount(mask_regions)`.
Editor (`ImageOcclusionEditor.svelte`): SVG-Overlay über `<img>`,
Drag-to-create für Masken, Mindestgröße 2% damit Klicks gefiltert
werden. Touch-tauglich via Pointer-Events. Mask-Liste mit Inline-
Label-Edit + Delete.
Study-View (`ImageOcclusionView.svelte`): aktive Maske ist im Prompt
opake schwarz, im Reveal transparent grün mit Label-Text-Overlay
(SVG-Text mit stroke-Outline gegen Bild-Hintergründe). Andere Masken
bleiben dezent gelb-durchsichtig als Lern-Hinweis.
### 10. content_hash auf cards (Sprint 9j)
Jede neue Karte bekommt einen SHA-256-`content_hash` über
@ -423,23 +459,25 @@ In Reihenfolge meiner Empfehlung:
`mana-ev/cards`, mana-auth-App-Reg (Service-Key + Public-Key),
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 +
2. **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
3. **Phase 7 (AI/MCP)** — braucht laufende mana-mcp.
4. **Phase 10 (Production-Deploy)** — Mac Mini + Cloudflare-Tunnel
(cardecky.mana.how + cards-api.mana.how) + MinIO-Bucket
(eigener Container oder Plattform), nach allen Pre-Flight-Items.
5. **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.
6. **Weitere CardTypes** — type-in, audio, multiple-choice sind
im Future-Schema vorbereitet, kommen wenn der User-Wunsch klar
ist.
7. **Image-Occlusion-Polish** — Resize/Move existierender Masken
(aktuell: nur Draw + Delete), Mask-Reorder, Mehrere Masken in
einem Cluster (mehrere als ein Review).
Was nicht autonom geht: Phase 2, 6, 7, 10 — alle hängen an Pre-Flight
oder Plattform-Diensten. Phase 9 ist breit ausgebaut; Image-Occlusion
und Image-Occlusion-Editor wären die nächsten autonomen Polish-Items.
oder Plattform-Diensten. Phase 9 ist sehr breit ausgebaut.
---