wordeck-native/devlog/2026-05-13/macher.md
Till JS c0b0c902bc devlog: 3 Tage geschrieben (v0.1.0 → v0.9.4)
Tag 1: β-0 bis β-7 Marathon (Skelett → App-Store-Vorbereitung).
Tag 2: Cardecky-Web-Look + alle 7 Card-Types + ManaAuthUI +
Guest-Mode + γ-1 bis γ-8 (AI/CSV-Import, Marketplace, PDF).
Tag 3: kleiner Style-Polish.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-15 22:22:29 +02:00

5.4 KiB
Raw Blame History

date day view weekday commits review
2026-05-13 2 macher Mittwoch 22 written

Mittwoch, 2026-05-13 — Tag 2 (Macher-Sicht)

Großer Polish-Tag mit Funktions-Vollausbau. Web-Design adaptiert, alle 7 Karten-Typen rendern, ManaAuthUI-Migration zog die Auth-Reise nativ, Guest-Mode landete, und der γ-1-bis-γ-8-Block brachte AI-/ CSV-Import, Card-Edit, Pull-Update, Marketplace-Publish, Moderation und PDF-Export — alles in einer Schicht.

Stats

22 Commits, +6 206 / 1 511 LoC, 87 Files. 115× .swift. Session 11:17 → 02:04, 167 aktive Minuten in 7 Blöcken, längster Fokus 65 Min. Top-Dirs: Domain (11 %), project.yml (9 %), Decks (9 %), Study (8 %), Sync (6 %). Tags: decks, auth, study, editor, ui.

Schritte (chronologisch)

  • DEVELOPMENT_TEAM=QP3GLU8PH3 für Code-Signing. Erstmal Apple-Konto-Setup.
  • Rebrand auf ev.mana.cardecky. Bundle-ID, DisplayName, Strings, Icon-Asset. Vorher hieß die App intern „Cards", öffentlich aber „Cardecky".
  • Archive-Polish — Versions-Sync, Orientations, Mac-Icon.
  • Sendable-Warnings: PhotosPicker zog Sub-View struct (Sendable- Compliance für PHPickerViewController).
  • ITMS-90129 (Apple-Validation): DisplayName Cards → Cardecky in Info.plist, Build 2.
  • User-facing Strings Cards → Cardecky komplett, Build 3.
  • PublicDeckOwner.pseudonym ist Bool, nicht String? — Wire-Format-Drift gegen Server-Schema gefangen.
  • Card-Liste im DeckDetailView + listCards-API. Vorher zeigte Detail nur Metadaten.
  • ManaCore v1.0.1 pull — 404 auf Query-Endpoints (URL-Encoding von ?, siehe mana-swift-core Tag 2).
  • Cardecky-Web-Design — Fan-Stack-Tiles + CardSurface. Tiles fächern Karten auf, einheitlicher Card-Frame über Front/Back/ Cloze.
  • Multiple-Choice-Karten rendern. UI-Render-Layer für MC, Server liefert Choices + correctIndex.
  • Typing-Karten + Levenshtein-Match. Antwort-Vergleich verzeiht kleine Tippfehler (Edit-Distance ≤ 2).
  • DEBUG-Auto-Login wie in Memoro-Native — schneller Iteration.
  • Tile-Redesign — Tap=Study, Edit-Icon, Explore-Konsistenz. Vorher war Tap = Edit, was niemandes Erwartung war.
  • iOS-26 tabViewBottomAccessory für „Neues Deck"-Pille. Nutzt den neuen iOS-26-API.
  • code:nil bei AuthError.serverError-Fix in API-Wrapper.
  • ManaAuthUI-Migration — alle Auth-Surfaces (Login/Signup/Verify/ Reset/Account/Delete) auf das frische mana-swift-ui-Package. Eigene Views weg.
  • Guest-Mode + Login-optionale Surface. Public-Marketplace-Decks
    • Read-only Study ohne Account. ManaAuthGate eskaliert pro Aktion.
  • γ-1 bis γ-8 — AI-Import-Sheet (Text-Prompt → mana-llm-Deck- Generator), CSV-Import (Header-Parser + Map-Field), Card-Edit- Sheet inkl. Image/Audio, Pull-Update (subscribed deck → new version), Marketplace-Publish (Pseudonym oder echter Name), Moderation-Surface (Report-Reason-Picker), PDF-Export (PDFKit-Renderer). 3 412 / 435 LoC in einem Commit — viel generierter Sheet-Code, viel Wire-Format-Codable.
  • SwiftLint-Config + 0-Warnings-Pass + Swift-6-Concurrency-Fixes. CI-Bremse weg.

Architektur-Entscheidungen

  • Auth-UI extern, nicht selbst gebaut. Migration auf ManaAuthUI (mana-swift-ui v0.1+) sparte ~600 LoC eigene Auth-Views und zwang die anderen Apps in dieselbe Optik.
  • Guest-Mode als eigene Surface-Schicht, nicht „signed-out". Marketplace + Public-Study laufen ohne Account, ManaAuthGate eskaliert pro Aktion (z.B. „Deck speichern").
  • Levenshtein für Typing-Match. Edit-Distance ≤ 2 verzeiht Tippfehler ohne triviale Lösungen zu akzeptieren. Server kennt diese Logik nicht (Web hat sie ebenfalls clientseitig).
  • Card-Surface als shared View, statt 7× Custom-Layout. Ein Frame, in den 7 Content-Types einsteigen.
  • iOS-26-Features als progressive enhancementtabViewBottomAccessory ist nur ab iOS 26 verfügbar. #available-Gate.
  • PDF-Export client-side mit PDFKit, nicht Server. Server- Render würde mana-pdf-Service nötig machen; client-Side ist einfacher und privater.
  • DEBUG-Auto-Login-Pattern aus Memoro übernommen — Iteration ist 10× schneller wenn der Login-Step weg ist.

Trade-offs

  • 22 Commits in einer Session ist viele Sinn-Abschnitte. Jeder einzeln klein genug, dass git log lesbar bleibt. PR-Review würde leiden, aber als Solo-Sprint OK.
  • AI-Import braucht mana-llm online. Kein Offline-Fallback.
  • PublicDeckOwner.pseudonym=Bool ist Web-Schema-Verschwurbel (Server liefert Boolean use_pseudonym', nicht den Pseudonym- String — der ist anderswo). Hatte 30 Min Fehlersuche, weil Codable silent failed.
  • Web gewinnt bei Konflikt zwingt Native zu nachzuziehen. Wenn Web vorab Refactor macht, hat Native immer 1-Tag-Delay.
  • iOS-26-only-Features für Sub-Surfaces ist Verstoss gegen „iOS 18 Minimum"-Politik aus CLAUDE.md. Akzeptiert via Gate.

Offene Punkte

  • Endurance-Test echtes iPhone: ReviewQueue-Drift bei langem Offline, Battery-Drain, Memory unter Pull-Update.
  • PDF-Export-Quality für Image-Occlusion-Karten — Maske wird zurzeit ohne Pencil-Trace gerendert.
  • AI-Import-Token-Budget sichtbar machen (Credits-Anzeige).
  • Wire-Format-Drift-Detection: Pseudonym-Bool-Fall war silent-failure; sollte ein zod-Schema-Mismatch-Smoke-Test fangen.
  • Localizable.xcstrings EN-Fallback angelegt, aber nicht übersetzt.