diff --git a/docs/plans/sync-field-meta-overhaul.md b/docs/plans/sync-field-meta-overhaul.md index 9fb74077b..cca2ae1ec 100644 --- a/docs/plans/sync-field-meta-overhaul.md +++ b/docs/plans/sync-field-meta-overhaul.md @@ -147,11 +147,11 @@ _Wird befüllt während der Ausführung._ | --- | --- | --- | | F1 | `7766ea502` | Web + mana-sync (Go) + mana-ai + apps/api/mcp + tests + DB schema reset. **Note: Commit-Titel `docs(plans): mark llm-fallback-aliases SHIPPED` ist irreführend — Multi-Terminal-Race hat F1 in einem fremden Commit zusammengeführt. Code ist trotzdem korrekt drin (27 F1 Files + Plan).** Tests grün, DB migriert. | | F2 | `ad5e04a55` | Origin-Gate aktiviert. `originFromActor()` in shared-ai/field-meta.ts maps actor.kind → 'user'/'agent'/'system'/'migration'. Hooks nutzen es. Repair-Migrations (repair-silent-twin, legacy-avatar) wrappen ihre Writes in `runAsAsync(systemMigrationActor, ...)`. `applyServerChanges` bekommt `ApplyServerChangesOptions.isInitialHydration` Parameter, beide Caller (push-response + pull) setzen ihn aus dem Cursor-State. Conflict-Trigger feuert nur noch wenn `localMeta[k]?.origin === 'user' && !options.isInitialHydration`. **29 Tests grün** inkl. 4 neuer (replay-burst no-conflict, agent-origin no-conflict, hydration no-conflict, user-edit fires-conflict). | -| F3 | _staged, uncommitted_ | `updatedAt` aus dem Sync-Wire entfernt, durch zwei orthogonale Mechanismen ersetzt: (1) `_updatedAtIndex` als lokale, nicht-syncbare Schatten-Spalte die der Dexie-Hook (creating/updating) auf jedem Write stempelt — Dexie v53 indexiert sie auf 22 Tabellen die früher `updatedAt` indexiert hatten. (2) `deriveUpdatedAt(record)` als read-side Computed = `max(__fieldMeta[*].at)` für 60+ Type-Converter die einen public `updatedAt: string` zurückliefern. Module-Stores: 121 Files, ~382 Stamping-Sites entfernt (regex-codemod). Local-Types: 43 Files, `updatedAt: string` aus Local-prefixed Interfaces entfernt (Public-Types behalten ihn als computed). `applyServerChanges` setzt `_updatedAtIndex` selbst beim Replay (mit `max(serverFields.at)` oder dem record-time). mana-ai/iteration-writer schreibt kein `updatedAt` mehr ins Wire-`data`. **Skipped:** Drizzle-Schemas der 11 Backend-Services — die `updated_at` Spalten dort sind nicht sync-relevant (pure server-internal columns) und wurden nicht in F3 angetastet. **0 svelte-check errors** über 7652 Files, 29/29 sync.test.ts grün, 61 mana-ai bun tests grün, mana-sync go tests grün. | -| F4 | _pending_ | | -| F5 | _pending_ | | -| F6 | _pending_ | | -| F7 | _pending_ | | +| F3 | `6bb9d77be` | `updatedAt` aus dem Sync-Wire entfernt, durch zwei orthogonale Mechanismen ersetzt: (1) `_updatedAtIndex` als lokale, nicht-syncbare Schatten-Spalte die der Dexie-Hook (creating/updating) auf jedem Write stempelt — Dexie v53 indexiert sie auf 22 Tabellen die früher `updatedAt` indexiert hatten. (2) `deriveUpdatedAt(record)` als read-side Computed = `max(__fieldMeta[*].at)` für 60+ Type-Converter die einen public `updatedAt: string` zurückliefern. Module-Stores: 121 Files, ~382 Stamping-Sites entfernt (regex-codemod). Local-Types: 43 Files, `updatedAt: string` aus Local-prefixed Interfaces entfernt (Public-Types behalten ihn als computed). `applyServerChanges` setzt `_updatedAtIndex` selbst beim Replay (mit `max(serverFields.at)` oder dem record-time). mana-ai/iteration-writer schreibt kein `updatedAt` mehr ins Wire-`data`. **Skipped:** Drizzle-Schemas der 11 Backend-Services — die `updated_at` Spalten dort sind nicht sync-relevant (pure server-internal columns) und wurden nicht in F3 angetastet. **0 svelte-check errors** über 7652 Files, 29/29 sync.test.ts grün, 61 mana-ai bun tests grün, mana-sync go tests grün. | +| F4 | `c07db300b` | Server-side bootstrap des `userContext`-Singletons in mana-auth's /register-Flow. Schreibt einen `profile/userContext` row mit `id='singleton'` direkt in `mana_sync.sync_changes` mit `client_id='system:bootstrap'`, `origin='system'`. Empty-default shape mirrors `emptyUserContext()`. Fire-and-forget — failure logged but doesn't abort registration. Webapp `ensureDoc()` bleibt als Fallback bis F5. `kontextDoc` (per-Space, nicht per-user) ist out-of-scope für F4. | +| F5 | `d78f57c04` | `userContextStore.ensureDoc()` aus der Public-API entfernt; die drei `void userContextStore.ensureDoc()` calls in ContextOverview/ContextInterview/ContextFreeform sind weg. Internal `getOrCreateLocalDoc()` bleibt als Fallback für brand-new clients deren Pull noch nicht durch ist. `kontextStore.ensureDoc()` bleibt — der ist per-Space, kein server-bootstrap. | +| F6 | `a031493fe` | Stable `client_id` in Dexie. Neue Tabelle `_clientIdentity` (single row keyed by `id='self'`). `restoreClientIdFromDexie()` läuft einmal beim Boot in `+layout.svelte` vor `createUnifiedSync` und reconciliated Dexie ↔ localStorage: Dexie ist canonical, localStorage ist fast-read cache. Ein localStorage-Wipe wird beim nächsten Boot aus Dexie restored. Dexie v54 mit `_clientIdentity: 'id'`. Survives clear-site-data, incognito flush. | +| F7 | `2a8e8ff98` | `repair-silent-twin.ts` + `legacy-avatar.ts` Migrationen ersatzlos gelöscht. Beide existierten nur um die Symptome eines fixed-in-M2.5 Bugs zu cleanen, der pre-live keine echten Daten produziert hat. Mit F2's `origin='migration'` wrapper + F3's drop von synced `updatedAt` würden ihre writes auch nicht mehr als Conflicts auftauchen — sie waren strukturell überflüssig. Caller in MeImagesView + wardrobe/ListView entfernt; leere `migration/` Directory gelöscht. | ## F1 — Implementation Notes