mana-kotlin-event-sync/devlog/2026-06-04/macher.md
Till JS 27de51e07e devlog: Repo-Historie nachgezogen (spieler+macher)
Erste Devlog-Befüllung; geerdet in den realen Commits, data.json via @mana/devlog-gen.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-16 01:44:27 +02:00

2.5 KiB

date day view weekday commits review
2026-06-04 1 macher Donnerstag 2 auto

Donnerstag, 2026-06-04 — Tag 1 (Macher-Sicht)

Tag eins der Lib: in zwei Commits steht Phase 2 fast komplett. Diese Library ist der Kotlin-Port von mana-swift-event-sync (ManaEventSync) — der event-sourced Daten-Layer, über den User-eigene Decks/Cards/Reviews E2E-verschlüsselt gegen sync2.mana.how laufen, bewusst nicht über REST. Reine Kotlin/JVM-Lib auf mana-kotlin-core (Auth), während der Entwicklung per includeBuild("../mana-kotlin-core") verdrahtet — kein Maven-Publish.

v0.1 (fa7f4c6, +1478) — Bausteine, Teil 1. Crypto + Envelope + Vault + Sync-HTTP:

  • MasterKeyCryptoProvider — AES-GCM-256, byte-kompatibel zu Swift und TS (enc:1:<b64-iv>.<b64-(ct‖tag)>, WebCrypto-Layout). Cross-Impl-Parität per Golden-Vektor aus dem Node/WebCrypto-Pfad bewiesen — das ist der nicht-verhandelbare Punkt, weil dasselbe Log von drei Plattformen geschrieben/gelesen wird.
  • NoOpCryptoProvider — Passthrough für Anonymous-Modus / Vault unerreichbar, mixed-log-tolerant.
  • VaultClient + createMasterKeyProviderFromVault — holt den Master-Key (/api/v1/me/encryption-vault/{key,init}); ZK-Modus → wirft, Caller fällt auf NoOp zurück.
  • EventEnvelope + ActorContext — Wire-Format; sequenceNumber toleriert JSON-String und -Zahl (mana-sync Go schreibt json:",string").
  • Ulid — sortierbare IDs, Port der Swift-Generierung.
  • SyncHttpClient — POST /sync/{appId} (append ≤500) + GET .../pull?since=N&limit=K; 422 → SchemaOutdated.

v0.2.0 (89d9f37, +1032/-16) — Engine, Teil 2. Der EventSyncEngine: App-facing Orchestrierung mit Anonymous-First-Identität, emit (lokal + Outbox + Crypto-Wire), Pull-Loop (decrypt + Projektion + Cursor), signIn-Claim (anon→sub re-taggen + re-encrypt + drainen), Poll-Timer, Soft-Fail, Schema-Outdated-Stop, Crypto-Degraded-Pause, Aggregate-Change- Listener. Port des Swift EventSyncEngine. Dazu das EventStore-Interface

  • InMemoryEventStore (Event-Log + Outbox + Meta + Retention) und die Transport-Abstraktionen SyncTransport/SyncWebSocket.

Trade-off bewusst gezogen: Die Engine bleibt pure Kotlin/JVM — der persistente Room-EventStore-Adapter und die Ktor-SyncWebSocket-Impl brauchen das Android-SDK bzw. einen Live-Server und bleiben deshalb (vorerst) im App-Modul. So bleibt die Lib JVM-testbar; 26 Tests inkl. WebCrypto-Golden- Vektor laufen ohne Emulator. SOT-Plan: mana/docs/playbooks/WORDECK_ANDROID_GREENFIELD.md.