a6181e2751
Zusammenfassung, Debug-Akte und Knowledge-Base-Eintrag zum Quick-Vorgang 260921-ldf. Die zentrale Frage war, ob hinter dem Wackeltest aus CI-Lauf 395 ein echter Nutzerfehler steckt. Sie ist gemessen beantwortet, nicht geschaetzt: ein MutationObserver ueber jeden DOM-Commit zeigt den Zustand "Vorschaubild sichtbar, Haekchen aus" bei JEDEM Oeffnen als echten, festgeschriebenen DOM-Zustand, der ohne act() zwei volle Makrotask-Runden haelt. Zwischen zwei Makrotasks darf der Browser zeichnen - der Nutzer kann das also sehen. Was nicht erreichbar ist: jemand schickt ab und das Bild fehlt, denn die Korrektur kommt binnen Millisekunden. Stabilitaet: 20 von 20 vollen Laeufen gruen, je 531 Tests. Die Zusammenfassung ordnet das ehrlich ein - bei einer Ausgangsrate von 1:17 waeren 20 gruene Laeufe auch ohne Fix zu rund 30 Prozent zu erwarten. Der tragende Beleg ist der deterministische: den falschen Zwischenzustand gibt es nicht mehr, und Test 14/15 sind gegen den Stand davor in fuenf von fuenf Laeufen rot. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01TPPB4ApQxzSU1rwV2Ffj9J
2.3 KiB
2.3 KiB
GSD Debug Knowledge Base
Geloeste Debug-Sitzungen. Wird von gsd-debugger zu Beginn einer neuen
Untersuchung gelesen, um bekannte Muster als Hypothesen-Kandidaten
vorzuschlagen.
wackeltest-bugreport-haekchen — Vorschaubild sichtbar, Haekchen "Bildschirmfoto anhaengen" aus (Wackeltest CI 395)
- Date: 2026-09-21
- Error patterns: toBeChecked, Received element is not checked, flaky, Wackeltest, nur unter Last, isoliert nie, Zustand erst einen Commit spaeter richtig
- Root cause(s): Dialog dauerhaft eingehaengt, sodass
useState(abgeleiteterWert)nur beim allerersten Mount lief (Daten noch nicht da); zusammen damit: Anfangszustand peruseEffectnachgezogen, und passive Effekte laufen NACH dem Commit — React schreibt deshalb bei jedem Oeffnen erst den falschen, dann den richtigen Zustand in den DOM - Fix: Dialog nur einhaengen, solange offen (
{open && <Dialog/>}) — frischer Mount je Oeffnen; abgeleiteten Wert beim Rendern ableiten statt per Effekt nachziehen (const attach = screenshot !== null && (attachChoice ?? true)); zuruecksetzender Effekt entfaellt ersatzlos - Files changed: apps/web/src/components/bug-report/bug-report-dialog.tsx, apps/web/src/components/bug-report/bug-report-button.tsx, apps/web/src/components/bug-report/bug-report-button.test.tsx
- Why not caught: Es gab ein Tor, aber ein stumpfes — Test 1 las den DOM EINMAL nach
findByRoleund traf damit mal den falschen ersten, meist den richtigen zweiten Commit (1:17). Eine Stichprobe am Ende kann einen falschen Zwischen-Commit grundsaetzlich nicht zuverlaessig sehen. Lint und Typpruefung koennen diese Klasse gar nicht sehen. - Recurrence guard: Regressionstest apps/web/src/components/bug-report/bug-report-button.test.tsx:"Test 14 (quick-260921-ldf): kein falscher Zwischenzustand" und ":"Test 15 (quick-260921-ldf): erneutes Oeffnen startet frisch" — beide beobachten per MutationObserver JEDEN Commit statt einer Stichprobe und sind gegen den Stand davor deterministisch rot (5/5)
- Merksatz fuer aehnliche Faelle: Bei einem Wackeltest zuerst per MutationObserver pruefen, ob der beobachtete Zwischenzustand ueberhaupt in den DOM geschrieben wird. Wird er es, ist es ein Produktfehler und der Test hat recht — dann nicht den Test beruhigen (kein retry, kein hoeheres Zeitlimit), sondern den Zustand beseitigen.