Conflict-Detection, endlich sauber
Eine Woche, in der unter der Haube viele Jahre alter Code aufgeräumt wurde: Sync-Konflikt-Erkennung wird zuverlässig, vier Bug-Wurzeln werden geschlossen, gleichzeitig zieht das Companion-Brain in die echte Pipeline ein und 22 Module bekommen ihre i18n-Namespaces.
Worum es geht
Aus Endnutzer-Sicht passierte diese Woche wenig. Der Sync läuft halt richtig, der Companion antwortet halt — beides aber war vorher nicht ganz wahr, und hinter beiden saßen tiefe Strukturprobleme, die Wochen auf eine Lösung warteten. Diese Woche wurden sie eingelöst.
Sync-Field-Meta-Overhaul (F1–F7)
Der Konflikt-Toast (»Es gibt einen Versionskonflikt«) hat in Mana schon fälschlich gefeuert, wenn der Server selbst ein Bootstrap- Singleton schrieb, wenn ein Agent eine Mission ausführte, wenn ein Migrationsskript ein Feld backfilled. Die vier Bug-Wurzeln:
- F1:
__fieldTimestamps/__fieldActors/__lastActorals drei getrennte Schatten-Felder — schwer synchron zu halten. Reduziert auf ein verstecktes Feld__fieldMeta:{ field → { at, actor, origin } }. - F2: Conflict-Detection feuerte für jede Schreib-Quelle. Jetzt
origin-gated: nur
origin === 'user'löst den Toast aus. Server-Replays, Agent-Writes, Migrationen, Bootstrap-Inserts gehen still durch. - F3:
updatedAtwar ein synchronisiertes Datenfeld — und damit Quelle für falsche Konflikte. Jetzt aus__fieldMetaabgeleitet, pro Read berechnet viaderiveUpdatedAt(local). Für indexed Sortierung gibt es ein non-synced_updatedAtIndexSchatten-Feld, das der Dexie-Hook automatisch stempelt. - F4: Singletons (
userContext,kontextDoc) wurden vom Client per Race-Bedingung angelegt — zwei Tabs, zwei Singletons, ein Konflikt. Jetzt server-seitig immana-auth-Bootstrap geschrieben, perorigin: 'system'. Der Client behältgetOrCreateLocalDoc()nur als Fallback für die seltene Race, in der die erste Pull noch nicht gelandet ist. - F5: Der öffentliche
userContextStore.ensureDoc()ist weg — niemand außer dem Sync-Loader braucht das. - F6: Stable
client_idin einer eigenen Dexie-Tabelle (_clientIdentity), localStorage nur als Cache. Ein localStorage- Wipe verliert dem Server keine Identität mehr. - F7: Zwei Migration-Helper (
repair-silent-twin,legacy-avatar-migration) konnten nach dem Overhaul gelöscht werden.
Aufschrift im Architektur-Doc: apps/web/src/lib/data/DATA_LAYER_AUDIT.md.
Companion-Brain wird real
Der KI-Companion (»Mana« als Default-Agent) hatte bisher Mission- Definitionen — diese Woche bekamen die Missions ihre echte Pipeline. Drei Schritte:
task-Tool im Companion-Chat verdrahtet (M3.3) — der Chat kann jetzt Missionen anlegen.- Context-Window-Compactor im Mission-Runner (M2.4) — lange Missionen verlieren ihren Anfang nicht mehr.
- Profile-Bild-Migration (M2.5) — der Companion bekommt ein Avatar, der auch in Cross-Module-Tools sichtbar wird.
Dazu isParallelSafe-Flagging im Tool-Catalog: welche Tools
dürfen gleichzeitig laufen, welche müssen seriell. Die Heuristik
sitzt in @mana/shared-ai.
i18n-Namespaces für 22 Module
Vor dem Multi-Sprache-Rollout wurden diese Woche die letzten
fest-codierten deutschen Strings durch $_()-Calls ersetzt:
AI-Workbench, AI-Missions, AI-Agents, Memoro, Photos, Sleep, Mail,
Notes, News, Places, Todo, Food, MyDay, Wallpaper, Contacts, Gifts,
Dreams. Pro Modul: Namespace-JSONs für DE/EN/ES/FR/IT, dann
ListView/DetailView/Forms gegen die Namespaces verdrahtet.
Das ist Vorbereitung: ohne diese Schicht kann das Companion-Brain nicht zuverlässig auf nicht-deutsche Inhalte reagieren.
Comic-Modul: AI-Storyboard
Comic ist ein neueres Modul: aus einem Cross-Module-Text
(Kalender + Notes + Tasks) wird ein Storyboard. Diese Woche
kam die AI-Anbindung dazu — M4 (AI-Storyboard-Generator) und
Mc4 (MCP + AI-Catalog für das Character-System).
Was kommt
Mit dem Sync-Overhaul abgehakt und der i18n-Decke geschlossen ist KW 18 frei für die Repo-Extraktion: Memoro raus aus dem Monorepo, danach das Plattform-Repo aufschlagen.
mana-monorepo