# QA Issues – 2026-02-24 Scope: Agentische, statische QA-Review (Flutter/Dart CLI lokal nicht verfügbar: `flutter` fehlt). Fokus auf 4-Step-Flow, Save/Load/Delete, JSON-Export und UX-Kantenfälle. ## Issue 1 (P1) – 4-Step-Flow lässt Fortschritt ohne Pflichtdaten zu ✅ ERLEDIGT (feat/mosaic-stepper-export) **Bereich:** 4-Step-Flow **Beobachtung** - Im `Stepper` kann man per `Weiter`/Tap bis Schritt 4 springen, auch ohne Bildauswahl. - Auf Schritt 4 ist „Generate Mosaic“ aktiv, aber `_generate()` bricht stillschweigend ab, wenn kein Bild vorhanden ist. **Code-Hinweis** - `lib/main.dart:1068-1127` (`Stepper` ohne Guard/Validation) - `lib/main.dart:1250-1255` (Generate-Button nur an `_isGenerating` gebunden) - `lib/main.dart:884`ff (`_generate()` returnt bei `_sourceImageBytes == null` ohne User-Feedback) **Repro-Schritte** 1. App öffnen (kein Bild geladen). 2. Im Mosaic-Stepper mehrfach „Weiter“ klicken oder direkt auf Schritt 4 tippen. 3. „Generate Mosaic“ klicken. 4. Es passiert visuell nichts (kein Ergebnis, kein Hinweis). **Akzeptanzkriterium** - Schritt-Navigation ist zustandsbasiert: Schritt 2-4 erst zugänglich, wenn notwendige Voraussetzungen erfüllt sind. - „Generate Mosaic“ ist deaktiviert, solange kein Bild geladen ist. - Alternativ/zusätzlich: verständliche Fehlermeldung (Snackbar), falls Generierung ohne Bild ausgelöst wird. --- ## Issue 2 (P1) – Projekt-Load mit leerem Bild leert bestehenden Zustand nicht ✅ ERLEDIGT (feat/mosaic-stepper-export) **Bereich:** Save/Load-Flow **Beobachtung** - Beim Laden werden `_sourceImageBytes` und `_result` nur gesetzt, wenn `data.sourceImageBytes != null`. - Lädt man ein Projekt ohne Bild, bleibt ggf. ein altes Bild/Ergebnis aus vorherigem Zustand erhalten. **Code-Hinweis** - `lib/main.dart:308-313` (fehlender `else`-Zweig zum expliziten Zurücksetzen) **Repro-Schritte** 1. Projekt A mit Bild laden/generieren. 2. Projekt B laden, das ohne Bild gespeichert wurde (oder manuell erstellt wurde). 3. Erwartung: leerer/initialer Zustand. 4. Ist-Zustand: vorheriges Bild kann bestehen bleiben. **Akzeptanzkriterium** - Beim Laden eines Projekts ohne `sourceImageBytes` wird Zustand explizit zurückgesetzt (`_sourceImageBytes = null`, `_result = null`, ggf. Step auf 1). - UI zeigt konsistent den tatsächlich geladenen Projektzustand. --- ## Issue 3 (P1) – Projekt-Snapshots sind nicht reproduzierbar, da Katalog nicht versioniert wird ✅ ERLEDIGT (feat/mosaic-stepper-export) **Bereich:** Save/Load-Flow + JSON-Export **Beobachtung** - Gespeicherte Projekte enthalten Parameter + Bild, aber **keinen Snapshot des verwendeten Farb-Katalogs**. - Beim Laden wird mit aktuellem globalen `_catalog` neu generiert → Ergebnis kann von ursprünglichem Snapshot abweichen. **Code-Hinweis** - `lib/project_codec.dart` (`MosaicProjectData` ohne Katalogdaten) - `lib/main.dart:316` (`_generate()` nach Load nutzt aktuellen `_catalog`) **Repro-Schritte** 1. Mit Katalog-Set A ein Projekt erzeugen/speichern. 2. Katalogfarben ändern (hinzufügen/löschen/umfärben). 3. Projekt laden. 4. Ergebnisfarben/Zuordnung unterscheiden sich vom ursprünglichen Stand. **Akzeptanzkriterium** - Projektspeicherung enthält eine Palette/Katalog-Snapshot-Version (mind. Name + Farbe pro Eintrag). - Load nutzt standardmäßig den gespeicherten Snapshot (mit klarer UX bei Konflikten/Optionen). - Reproduzierbarkeit des Mosaiks ist gewährleistet. --- ## Issue 4 (P2) – Export JSON nicht klar reproduzierbar ohne Ergebnis **Bereich:** JSON-Export **Beobachtung** - Export enthält `project` immer, `result` aber nur falls bereits generiert. - Wenn vor Export keine Generierung lief, fehlt Kerninformation (`assignments`/`palette`) ohne klaren Nutzerhinweis. **Code-Hinweis** - `lib/main.dart:378-392` **Repro-Schritte** 1. Bild laden, aber nicht generieren. 2. „Export JSON“ klicken. 3. Exportdatei enthält kein `result`-Objekt. **Akzeptanzkriterium** - UX-Entscheidung explizit umsetzen: - entweder Export-Button nur mit vorhandenem Ergebnis aktivieren, oder - vor Export automatisch generieren, oder - deutlichen Hinweisdialog anzeigen („Export ohne Ergebnisdaten“). --- ## Issue 5 (P3) – „Fertig“-CTA im letzten Step ohne klaren Effekt **Bereich:** 4-Step-Flow UX **Beobachtung** - Im letzten Step zeigt der Continue-Button „Fertig“, führt aber funktional zu keiner sichtbaren Aktion. **Code-Hinweis** - `lib/main.dart:1071-1093` (`onStepContinue` erhöht nur bis max. letztem Step) **Repro-Schritte** 1. Bis Schritt 4 navigieren. 2. „Fertig“ klicken. 3. Kein Abschluss-Feedback/State-Change. **Akzeptanzkriterium** - Letzter CTA hat klare Bedeutung (z. B. „Generieren“, „Abschließen“, „Zum Export“) oder wird im letzten Step ausgeblendet. - Nutzer erhält eindeutiges Abschlussfeedback. --- ## Issue 6 (P3) – Lösch-Flow ohne Hinweis auf betroffenen Arbeitsstand **Bereich:** Delete-Flow UX **Beobachtung** - Beim Löschen eines Snapshots gibt es nur Dateiname + Bestätigung. - Kein Hinweis, ob gerade geladener Stand betroffen ist bzw. wie sich das auf „Letzten Stand laden“ auswirkt. **Code-Hinweis** - `lib/main.dart:333-367` **Repro-Schritte** 1. Snapshot laden. 2. In Projekte denselben Snapshot löschen. 3. Nutzer bleibt ohne Kontext, ob aktiver Stand/Latest-Verhalten beeinflusst ist. **Akzeptanzkriterium** - Dialog/Feedback benennt Auswirkungen klar (z. B. „Aktuell geladener Zustand bleibt im Speicher bis Wechsel/Neustart“). - Optional: Markierung des aktuell geladenen Snapshots in der Liste.