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>
50 lines
2.5 KiB
Markdown
50 lines
2.5 KiB
Markdown
---
|
|
date: 2026-06-04
|
|
day: 1
|
|
view: macher
|
|
weekday: Donnerstag
|
|
commits: 2
|
|
review: 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`.
|