---
name: feedback_persisted_model_change_update_write_normalizer
description: "Beim Ändern eines persistierten Daten-Modells (z.B. single→document) IMMER den Write-Normalizer mitziehen — sonst stiller Datenverlust, den Unit-Gates nicht fangen"
metadata: 
  node_type: memory
  type: feedback
  originSessionId: f3b085e2-503a-445f-b49f-2462a6e8c304
---

Wenn die Form eines persistierten Felds erweitert wird (Kadi-v2 `project_notes.canvas_data`: Einzel-Canvas `{strokes}` → Dokument `{orientation,background,gridMm,pages}`, KAR-662), MUSS jede Stelle, die das Feld liest UND schreibt, auf das neue Modell umgestellt werden — nicht nur die UI.

**Vorfall 2026-05-31:** Editor sendete das volle `NoteDocument`, aber `createNote`/`updateNote` normalisierten `canvas_data` weiter mit `parseCanvasData` (Einzel-Canvas-Parser). Auf ein Dokument angewandt (hat `.pages`, nicht `.strokes`) → Schema-Fail → Rückgabe `emptyCanvas()`. Ergebnis: **jeder Save persistierte ein leeres Blatt.** Titel/Text überlebten (eigene Spalten), Zeichnung+Format+Hintergrund still verworfen → leer beim Wiederöffnen. Kais merkte es nur im Live-Test ("nach Speichern wieder weg").

**Why:** Der Read-Pfad (`parseDocument`) war korrekt, der Write-Pfad nicht — klassische halbe Migration. Unit-Gates fangen es NICHT, weil der Write-Pfad `createClient()` (DB) braucht und im Test-Env nicht durchläuft (genau wie [[feedback_rsc_no_client_fn_from_server]]).

**How to apply:** Bei jeder Persisted-Shape-Änderung: (1) grep alle Schreib-Stellen des Felds (insert/update/upsert) und stelle sie auf den NEUEN Parser/Normalizer um, nicht nur die Lese-Stelle; (2) schreibe wo möglich einen Round-Trip-Test (write-normalizer(x) bewahrt die neuen Felder); (3) verifiziere mit Live-Save+Reopen, weil DB-Write-Pfade unit-untestbar sind. Symptom-Signatur „speichert, aber beim Wiederöffnen leer/Default" = fast immer Write-Normalizer-Mismatch.
