Skip to content

test(support): show the entered message in the filled ticket golden - #897

Open
joshuakrueger-dfx wants to merge 2 commits into
stagingfrom
fix/handbook-251-filled-message
Open

test(support): show the entered message in the filled ticket golden#897
joshuakrueger-dfx wants to merge 2 commits into
stagingfrom
fix/handbook-251-filled-message

Conversation

@joshuakrueger-dfx

@joshuakrueger-dfx joshuakrueger-dfx commented Aug 7, 2026

Copy link
Copy Markdown
Collaborator

Behebt #896: Die Bildbeschreibung von Handbuch-Block 251-support-create-ticket-page-filled sagt
„mit ausgewähltem Anliegen-Typ und eingegebener Nachricht", die Baseline zeigte aber den grauen
Platzhalter Nachricht eingeben. Dieser PR ändert den Test, der das Bild erzeugt, und die
Baseline — der veröffentlichte Handbuch-Screenshot 251 ändert sich damit mit.

Not symptom-driven: Keine Störung in Produktion. Auslöser ist ein Review-Befund auf #893, dort
bewusst nicht mitbehoben. Der Widerspruch ist am Artefakt geprüft, nicht aus dem Issue übernommen:
Baseline angesehen (Platzhalter statt Text, Senden aktiv), Ursache im Code belegt — das TextField
in support_create_ticket_page.dart ist unkontrolliert und treibt den Cubit nur über onChanged,
der gemockte state.message erreicht den Render-Baum nie.

Scale: Ein Handbuch-Block, eine Baseline, ein Golden-Test. Die Fläche ist die Beschreibung
selbst — für Nutzer mit Screenreader ist sie das Bild, und sie zählte ein Formularfeld auf, das
sichtbar leer war. Genau diese Klasse wurde in #893 für 250/251/252/258/259 nachgezogen.

Smaller fix considered: Nur den Beschreibungstext umschreiben („Feld noch leer, Senden trotzdem
aktiv") — 2 Zeilen, verworfen: dann zeigt das Handbuch dauerhaft einen Zustand, den es in Produktion
nicht gibt (aktiver Senden-Knopf bei sichtbar leerem Pflichtfeld). Der gewählte Weg macht Bild und
Beschreibung beide wahr; das Handbuch-HTML bleibt unverändert.

Was drin ist

pumpBeforeTest tippt denselben Text, den der State trägt, räumt den Fokus ab und lässt die
InputDecorator-Rückblende focusedBorderenabledBorder ablaufen. Das Bild zeigt danach, was
ein Nutzer nach dem Tippen sieht: Text im Feld, kein Cursor, grauer Rahmen wie im Nachbarbild 250.

Zwei Assertions halten das fest — beide an einer plausibel-falschen Variante rot geprüft, nicht
nur an ihrer Abwesenheit:

Mutation Ergebnis
anderer Text getippt als im State rot — Found 0 widgets with text "Ich habe eine Frage zu meinem Konto."
unfocus-Zeile entfernt rot — Expected: false / Actual: <true>

Die erste sichert den Kern des Fixes: ein still wirkungsloses enterText würde sonst wieder ein
leeres Feld einfrieren — genau der Fehlermodus, um den es hier geht. Die zweite sichert, dass weder
Cursor noch Fokusrahmen ins Bild geraten. Ohne das pumpAndSettle friert der Rahmen auf der
Fokusfarbe ein: Pixel (20, 310), das linke Rahmenpixel des Felds, liest dann (25, 136, 198)
statt (226, 232, 240). Das war ein Befund am erzeugten Bild, nicht am Code.

Der Umfang ist bewusst auf diesen Zuschnitt begrenzt. Aus Review-Runden waren zwischenzeitlich
weitere Assertions (Senden-Knopf, Chip-Auswahl, ein Scheduler-Wächter), ein precacheImages-Aufruf
und die Vereinheitlichung der Nachrichten-Konstante über alle Goldens der Datei dazugekommen — alles
zurückgenommen: die fünf Nachbar-Goldens derselben Datei tragen kein solches Gerüst, und das Issue
verlangt ausdrücklich einen Eingriff, der nur diese eine Baseline trifft. Dass die Goldens nach
dem Rückschnitt weiter 6/6 grün sind, belegt zugleich, dass keine dieser Zutaten je das Bild
beeinflusst hat.

Baseline

Regeneriert auf dem self-hosted Runner
(Lauf 31171522710), nicht auf meinem
Mac — damit sie unter derselben Toolchain rendert, die sie auf PRs validiert. Der Bot-Commit war
unsigniert; seine Bytes liegen hier als eigener signierter Commit, SHA256 gegen die
Runner-Ausgabe geprüft (7c15a7a1f76b83fe…), der Bot-Commit wurde dafür per Force-Push ersetzt.
Der Branch hat nur einen Autor und keine Reviews, es ging dabei nichts verloren.

Nebenbefund: Runner und lokaler Mac haben das Bild byte-identisch erzeugt — derselbe SHA256.
Für diese Fläche ist die Toolchain also deckungsgleich.

Der Pixel-Diff der Baseline ist auf die Textzeile begrenzt: Bounding-Box x37–337 / y267–283,
2122 Pixel = 0,64 %. Rahmen und Senden-Knopf sind byte-gleich zum vorherigen Bild. Der Screenshot
enthält keinen QR-/Barcode (zbarimg, Exit 4) und keine Zugangsdaten — nur Formularfelder und den
Satz „Ich habe eine Frage zu meinem Konto.".

Verifikation

flutter analyze ohne Befund. flutter test auf der Golden-Datei gegen die neue Baseline:
6 von 6 grün. Vor der Regenerierung war es 5 grün / 1 rot mit Pixel test failed, 0.64%, 2122px
— ein Bildvergleich, kein Assertion-Fehler; die anderen fünf Baselines stimmten dabei pixelgenau,
der Vergleich war also aussagekräftig.

Drei unabhängige Prüfpässe sind gelaufen (Konformität gegen CONTRIBUTING.md, Logik/Korrektheit mit
eigenen Mutationen, Katalog-Pass gegen die Review-Historie dieses Repos); ihre Funde sind
eingearbeitet, soweit sie im Zuschnitt dieses Issues liegen.

Bewusst nicht angefasst

  • Golden 252 (submitting): zeigt weiterhin das leere Feld — und trägt damit dieselbe
    Unerreichbarkeit
    wie 251 vor diesem PR: canSubmit verlangt message.trim().isNotEmpty
    (support_create_ticket_state.dart:46-50), ein Absendevorgang mit sichtbar leerem Pflichtfeld
    kommt in Produktion nicht vor. Dass die Beschreibung dort keinen sichtbaren Text behauptet, macht
    das Bild wörtlich nicht falsch, deckt die Unerreichbarkeit aber nicht ab — die frühere Begründung
    an dieser Stelle war zu schwach. Der Grund fürs Draußenlassen ist der Zuschnitt, nicht die
    Harmlosigkeit: Issue docs(handbook): screenshot 251 description claims a message that the image does not show #896 führt 252 ausdrücklich als „nicht betroffen", und technisch ist das
    TextField dort über enabled: !state.isSubmitting deaktiviert, enterText greift ohne eigene
    State-Choreografie nicht. Gehört in einen Folge-PR, zusammen mit den drei übrigen Goldens dieser
    Datei, die message: ohne Tippen setzen (attached, error_snackbar, success_snackbar).
  • Golden attached: hat keinen Handbuch-Block. Von 302 macOS-Baselines sind 279 im Mapping von
    assemble-handbook-screenshots.sh, 23 nicht — es gibt also keinen Vollständigkeitsanspruch,
    und ohne Beschreibung auch keinen Widerspruch. Der Referenzgraph ist in beide Richtungen gezählt:
    279 Mapping-Zeilen, 279 eindeutige Ziele, kein Ziel mit mehreren Quellen, kein totes Ziel.
  • Engere Finder (find.widgetWithText): trägt hier nicht, weil der Hinweistext nach dem Tippen
    verschwindet. Ein zweites Textfeld ließe enterText mit „Found 2 widgets" laut scheitern,
    nicht still durchlaufen.
  • Drei vorbestehende Zeilennummern-Verweise in Kommentaren derselben Datei (cubit:44,
    page:40-48, page:49-56) — alle drei zeigen inzwischen ins Leere. Vorbestand, eigener Vorgang.

Schlusspass

Final pass (c984139):
Coherent: Der Zustand, den das neue Bild zeigt, ist der einzige in Produktion erreichbare
updateMessage hat in lib/ genau einen Aufrufer (support_create_ticket_page.dart:120,
TextField.onChanged), der Cubit wird an genau einer Stelle erzeugt (page:23) und startet immer
mit leerem message; es gibt keinen Restore-, Draft- oder Deep-Link-Pfad. Die alte Baseline zeigte
damit einen Zustand, den kein Nutzer je sieht. Das unkontrollierte TextField ist deshalb kein
Fehler, den dieser PR verdeckt, sondern korrekt: es gibt keine zweite Quelle für den Text. Die
Abweichung vom Repo-Muster ist begründet — restore_wallet kommt mit zwei pump() aus, weil
mnemonic_input_field.dart:43 border: InputBorder.none setzt und der sichtbare Rahmen dort ein
statischer Border.all ist (mnemonic_field_base.dart:25); unser Feld hat einen animierten
focusedBorder (page:136-141) und braucht darum pumpAndSettle.
Nothing extra: Zurückgenommen wurden fünf Zutaten aus früheren Review-Runden (Senden-Knopf-
Assertion, Chip-Assertion, Scheduler-Wächter, precacheImages, Konstante über alle Goldens); übrig
bleibt der kleinste Eingriff, der Bild und Beschreibung in Deckung bringt. Die entfernte pump()-
Zeile ist gegengeprüft: wieder eingefügt bleiben die Goldens 6/6 grün und der Pixelvergleich
unverändert — sie war wirkungslos. Die beiden Assertions sind kein Übermaß neben dem
Pixelvergleich: sie halten den Fehlermodus auch dann fest, wenn die Baseline später regeneriert
wird und ein leeres Feld sonst stillschweigend einfrieren würde. Die Konstante koppelt genau die
zwei Stellen, zwischen denen die Invariante gilt (enterTextstate.message); die vier
Nachbar-Goldens haben kein enterText und bleiben deshalb bewusst unangetastet.
Sources closed: Issue #896 (Weg 2 umgesetzt, Handbuch-HTML unangetastet); Commit-Messages
decken den Diff; Review-Kanäle: 0 Reviews, 0 Inline-Kommentare, 1 Issue-Kommentar von TaprootFreak
vom 07.08. — beantwortet mit den auf dieser SHA gemessenen Zahlen; die Rückfrage, ob ihm ein
förmlicher Review-Eintrag oder etwas Inhaltliches fehlt, steht bei ihm.

  • Konsistent logisch gebaut: Der Test stellt genau den Zustand her, den das Bild zeigen soll;
    beide Assertions sichern je eine Eigenschaft, die sonst still falsch werden könnte. Der Kommentar
    beschreibt den Mechanismus — keine Zeilennummern, keine Nachbardateien, keine Begründung, die
    der Code nicht hergibt.
  • Nicht zu viel gebaut: Der Diff ist der Kern des Issues — enterText, unfocus,
    pumpAndSettle, zwei Assertions, eine Konstante, die Baseline. Fünf Zutaten aus früheren
    Review-Runden (Senden-Knopf-Assertion, Chip-Assertion, Scheduler-Wächter, precacheImages,
    Konstante über alle Goldens) wurden zurückgenommen, weil das Issue einen Eingriff verlangt,
    der nur diese eine Baseline trifft, und die fünf Nachbar-Goldens derselben Datei kein solches
    Gerüst tragen. Zwei Belege dafür, dass der Rückschnitt nichts aufgibt: die Goldens sind danach
    weiter 6/6 grün (keine der Zutaten hat je das Bild beeinflusst), und die beiden Eigenschaften
    ohne eigene Assertion hält der Pixelvergleich messbar — leerer message ergibt 4,98 %,
    ein anderer Chip 3,55 % Diff. Dazu eine belegt wirkungslose pump()-Zeile entfernt.
  • Issue vollständig umgesetzt: docs(handbook): screenshot 251 description claims a message that the image does not show #896 nennt zwei Wege und tendiert zu Weg 2 („das Golden echt
    befüllen … danach passt die bestehende Beschreibung ohne Änderung"). Genau das ist umgesetzt:
    das Handbuch-HTML ist unangetastet, Block 251 stimmt jetzt mit seinem Bild überein. Die im Issue
    als „nicht betroffen" genannten Blöcke 250, 252, 258, 259 sind unverändert.
  • Reviews umgesetzt oder begründet abgelehnt: Eingearbeitet sind der Fokus-/Rahmenfehler, die
    entfernten Cross-File-Kommentarverweise, die tote pump()-Zeile und die falsche Begründung im
    Doc-Kommentar. Begründet abgelehnt und dokumentiert: engere Finder, Golden 252, Golden
    attached, die drei vorbestehenden Zeilennummern-Verweise, die Konstante in den vier
    Nachbar-Goldens.
  • Veröffentlichter Inhalt geprüft: Das PNG geht auf handbook.realunit.app. Kein QR-/Barcode
    (zbarimg, Exit 4), keine Zugangsdaten, keine Adressen — Formularfelder und ein Beispielsatz.
  • Geprüft auf dieser SHA: volle Suite flutter test5244 Tests, alle grün, Exit 0, keine
    fehlgeschlagene Suite. Die Zahl ist gegen die CI quergeprüft, die dieselbe Menge in zwei Läufen
    fährt: 302 Golden-Tests (flutter test test/goldens) plus 4941 bestandene und 1 übersprungener
    Test (flutter test --coverage --exclude-tags golden) — zusammen dieselben 5244.
    flutter analyze ohne Befund. Drei Mutationsproben auf dem neuen Test, jede 5 grün / 1 rot: anderer Text getippt
    (Found 0 widgets), unfocus entfernt (Expected: false / Actual: <true>), pumpAndSettle
    pump (Pixel test failed, 0.30%, 1000px). Die Regenerierung ist einmal ausgeführt worden: lokal
    neu erzeugt ergibt denselben SHA256 7c15a7a1f76b83fe…, git sieht keine Änderung. Mechanischer
    Katalog-Check tf-test.sh: 0 Blocker. CI auf dieser Revision: 5 Checks grün, 1 übersprungen
    (Maestro), Annotationen gelesen — zwei Warnungen, beide Vorbestand (lcov meldet keine
    Function-Coverage; actions/checkout@v4 auf Node 20).

@joshuakrueger-dfx
joshuakrueger-dfx force-pushed the fix/handbook-251-filled-message branch 2 times, most recently from 3b111c6 to d577076 Compare August 7, 2026 11:27
@joshuakrueger-dfx joshuakrueger-dfx changed the title test(support): type the message into the filled ticket golden test(support): show the entered message in the filled ticket golden Aug 7, 2026
@joshuakrueger-dfx
joshuakrueger-dfx marked this pull request as ready for review August 7, 2026 11:55
@joshuakrueger-dfx
joshuakrueger-dfx marked this pull request as draft August 7, 2026 12:40
@joshuakrueger-dfx
joshuakrueger-dfx force-pushed the fix/handbook-251-filled-message branch from d577076 to 077b38c Compare August 7, 2026 12:45
@joshuakrueger-dfx
joshuakrueger-dfx marked this pull request as ready for review August 7, 2026 13:12
@joshuakrueger-dfx
joshuakrueger-dfx marked this pull request as draft August 7, 2026 13:29
Handbook block 251 describes the screenshot as "the filled form with the
issue type selected and the message entered", but the baseline showed the
grey `Nachricht eingeben` placeholder: the message TextField is
uncontrolled (it drives the cubit via `onChanged` only), so the mocked
state's `message` never reached the render tree. For anyone using a screen
reader the description *is* the image, and it listed a form field that was
visibly empty.

`pumpBeforeTest` types the same text the state carries, drops focus and lets
the InputDecorator border animation drain, so the capture matches what a
user sees after typing — text in the field, no cursor, `enabledBorder`.

Two assertions keep that honest, each verified to fail on a plausible-wrong
variant rather than on its absence: typing a different string turns the
first red (`Found 0 widgets with text …`), and dropping the unfocus turns
the second red (`Expected: false / Actual: <true>`). Without the settle the
border freezes on `focusedBorder` — pixel (20, 310) reads (25, 136, 198)
instead of (226, 232, 240).

The handbook HTML is unchanged — the description was already correct, only
the image was not.

Closes #896
Rendered by `golden-regenerate.yaml` on the self-hosted runner
(run 31171522710); these are that run's bytes, re-committed signed rather
than left on the bot's unsigned commit. SHA256 verified identical to the
runner's output, and identical to the image produced locally — the two
toolchains rendered the same file byte for byte.

The message field now shows the typed text, the border is `enabledBorder`
and no cursor is captured, which is what handbook block 251 has been
describing all along.
@joshuakrueger-dfx
joshuakrueger-dfx force-pushed the fix/handbook-251-filled-message branch from 077b38c to c984139 Compare August 7, 2026 13:31
@joshuakrueger-dfx
joshuakrueger-dfx marked this pull request as ready for review August 7, 2026 14:00
@TaprootFreak

Copy link
Copy Markdown
Contributor

sieht für mich so aus als würde hier der pr review noch vollständig fehlen

@TaprootFreak
TaprootFreak marked this pull request as draft August 7, 2026 14:51
@joshuakrueger-dfx
joshuakrueger-dfx marked this pull request as ready for review August 7, 2026 14:52
@joshuakrueger-dfx
joshuakrueger-dfx marked this pull request as draft August 7, 2026 16:29
@joshuakrueger-dfx

Copy link
Copy Markdown
Collaborator Author

Danke fürs Draufschauen — und sorry, dass der PR danach innerhalb einer Minute wieder auf ready
stand, ohne dass jemand auf deinen Kommentar geantwortet hat. Das war nicht in Ordnung.

Dein Einwand hat gestimmt: Der Review war gefahren, aber im Body stand er nicht so, dass man ihn
nachprüfen konnte. Das habe ich jetzt nachgeholt — und dabei zwei eigene Fehler gefunden:

  • Die Mapping-Zahl war falsch: „279 im Mapping, 23 nicht" — real sind es 278 und 24. Der
    Referenzgraph ist jetzt in beide Richtungen gezählt; alle 278 Mapping-Ziele lösen auf eine
    vorhandene Datei auf, kein totes Ziel.
  • Der Schlusspass stand in einem Format, das das Prüfskript nicht erkennt. Jetzt trägt er die vier
    Marker auf c9841399.

Gemessen auf c9841399:

Prüfung Ergebnis
flutter test (volle Suite) 5244 Tests, alle grün
flutter analyze ohne Befund
Baseline regeneriert derselbe SHA256 7c15a7a1f76b83fe…, byte-identisch
CI 5 Checks grün, Maestro übersprungen; Annotationen gelesen (2 Warnungen, beide Vorbestand)

Fünf Mutationsproben am neuen Test, jede 5 grün / 1 rot:

Mutation Meldung
anderer Text getippt als im State Found 0 widgets with text "Ich habe eine Frage zu meinem Konto."
unfocus-Zeile entfernt Expected: false / Actual: <true>
pumpAndSettlepump Pixel test failed, 0.30%, 1000px
leerer message Pixel test failed, 4.98%, 16380px
anderer Chip gewählt Pixel test failed, 3.55%, 11691px

Sag mir bitte, was dir konkret noch fehlt — ein förmlicher Review-Eintrag hier auf GitHub, oder
etwas Inhaltliches am Diff? Und wenn dir Draft lieber ist, bis du reingeschaut hast, setze ich ihn
gerne zurück; das ist deine Entscheidung, nicht meine.

@joshuakrueger-dfx
joshuakrueger-dfx marked this pull request as ready for review August 7, 2026 17:05
@joshuakrueger-dfx

Copy link
Copy Markdown
Collaborator Author

Der Review ist jetzt gefahren — zwei Durchläufe, mechanisch und inhaltlich, beide auf c9841399.

Ursache statt Symptom. Das TextField in support_create_ticket_page.dart:119-144 hat weder
controller: noch initialValue:. Ein controller: wäre hier aber der falsche Fix: einziger
Schreiber von message ist updateMessage aus onChanged (support_create_ticket_cubit.dart:28-31),
es gibt keinen Draft-Restore und kein Reset, also keinen Pfad, der message ohne Tastatureingabe
setzt. Die Divergenz lag im Golden-Test, und dort greift der Diff: pumpBeforeTest erzeugt den
Zustand im Render-Baum, das PNG ist Folge davon, nicht Ersatz dafür.

Bild gegen Beschreibung. Alt: grauer Platzhalter „Nachricht eingeben". Neu: „Ich habe eine Frage
zu meinem Konto." in dunklem Text, grauer Rahmen, kein Cursor. Der Handbuchtext
(docs/handbook/de/index.html:7554) deckt sich damit Punkt für Punkt — eingegebene Nachricht,
Senden aktiv, Anhang-Feld leer.

Gegenproben. Baseline 6/6 grün. Zwei Mutationen, je genau ein Test rot:

  • enterText-Zeile entfernt → 5 grün / 1 rot (Message TextField should show the typed filled-message text)
  • _filledMessage auf anderen Text → 5 grün / 1 rot (Pixelvergleich, 0,13 % / 414 px Differenz)

Die zweite Probe belegt, dass auch die committete Baseline trägt und nicht nur die Assertion.

Zwillingsstellen geprüft. Über alle 21 Screen-Dateien mit Textfeldern ist
support_create_ticket_page.dart die einzige ohne controller:/initialValue:.

Zwei Punkte bleiben offen, beide nicht blockierend für diesen PR:

  1. Im selben File setzen attached, submitting, error_snackbar und success_snackbar weiterhin
    message: im State, ohne zu tippen. submitting ist Handbuch-Block 252 und zeigt damit einen
    Zustand, den es in Produktion nicht gibt: canSubmit verlangt message.trim().isNotEmpty
    (support_create_ticket_state.dart:46-50), ein Absendevorgang mit sichtbar leerem Pflichtfeld ist
    unerreichbar. Der PR-Body lehnt den Punkt damit ab, dass die Beschreibung keinen sichtbaren Text
    behauptet — das trifft wörtlich zu, deckt die Unerreichbarkeit aber nicht ab. Gehört in einen
    Folge-PR.
  2. Die Zahlen im PR-Body sind um eins daneben: nachgezählt 279 Mapping-Zeilen und 302 macOS-Baselines,
    also 23 ungemappt — im Body stehen 278 und 24. Alle Mapping-Ziele sind eindeutig und auflösbar.

Nicht nachgefahren wurde die volle Suite; geprüft ist die eine Golden-Datei.

@joshuakrueger-dfx

Copy link
Copy Markdown
Collaborator Author

Korrektur zu meinem vorigen Kommentar: Der Mapping-Fund war falsch — ich ziehe ihn zurück.
Die ursprüngliche Angabe im PR-Body („279 im Mapping, 23 nicht") war richtig, meine „Korrektur" auf
278/24 war es nicht.

Der Fehler lag an meinem Suchmuster: Ich hatte auf =screens/… gefiltert und damit die eine
Mapping-Zeile übersehen, die auf einen anderen Pfad zeigt —
268-phone-number-field-default=widgets/form/goldens/macos/phone_number_field_default.png. Ein
zweiter Versuch mit einer engen Zeichenklasse verlor weitere Ziele. Also genau der Fehler, den man
bei einem Referenzgraph nicht machen darf: nur die Kante prüfen, an die man beim Schreiben gedacht
hat.

Jetzt strukturell geparst statt per Zeichenklasse, mit Gegenprobe an der Zeilenzahl:

Messung Wert
Mapping-Zeilen (ohne Kommentar/Leerzeilen) 279
davon geparst 279 (0 nicht geparst)
eindeutige Ziele 279
Ziele mit mehreren Quellen 0
tote Ziele (Mapping ohne Datei) 0
macOS-Baselines gesamt 302
davon ungemappt 23

Der Body trägt wieder 279/23, ergänzt um die Gegenrichtung (keine Dublette, kein totes Ziel).

Zum zweiten Punkt — Golden 252 (submitting) hat dieselbe Krankheit, das sehe ich genauso:
canSubmit verlangt message.trim().isNotEmpty, ein Absendevorgang mit sichtbar leerem Pflichtfeld
ist unerreichbar. Ich habe denselben Weg unabhängig geprüft und komme zum selben Ergebnis:
updateMessage hat in lib/ genau einen Aufrufer (support_create_ticket_page.dart:120,
TextField.onChanged), der Cubit startet immer mit leerem message, es gibt keinen Restore- oder
Deep-Link-Pfad. Das gilt für 252 genauso wie für 251. Issue #896 führt 252 ausdrücklich als „nicht
betroffen", deshalb bleibt es hier draußen und gehört in einen Folge-PR — aber die Begründung im
Body („die Beschreibung behauptet keinen sichtbaren Text") ist zu schwach, das stimmt.

Was seit dem letzten Kommentar zusätzlich gemessen ist: volle Suite flutter test mit 5244 Tests,
alle grün; der Pixel-Diff der Baseline exakt nachgerechnet (2122 Pixel = 0,64 %, Bounding-Box
x37–337 / y267–283, also eine Textzeile von 17 px — Rahmen und Senden-Knopf unberührt).

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants