e2e 56: Check zum gesperrten Feld hängt von der Reihenfolge der Module ab #307

Closed
opened 2026-10-03 17:56:50 +02:00 by meleki · 1 comment
Owner

Aus #270 (Abschluss vom 2026-09-30, „Finding, not fixed“: e2e 56 fällt allein), gefunden in Durchgang 4 von #156 und heute nachgemessen.

Befund

  • e2e 56 fällt, wenn es allein läuft. Gemessen am 2026-10-03 auf melektaus-atx mit GM_STEPS=56 am Stand 808e1ee: Die ersten drei Checks sind grün, dann bricht das Modul ab mit typing "9" did not arrive: focus is BODY, it holds undefined, E2E EXIT 1.
  • Im vollen Lauf ist derselbe Check grün. CI-Task 482 (808e1ee, Modul 55 läuft direkt davor): the value of the private timer is read-only, hp still takes a new one – {"hp":8,"timer":42}.
  • Die Ursache liegt im Test, nicht im Editor. Block 56a-ii (tools/e2e/56-private-variables.mjs:100) klickt das gesperrte Feld timer an und tippt mit typeText('9'). Ein gesperrtes Feld ist zu Recht nicht fokussierbar (focusable = !this.readOnly, src/ui/widgets/TextField.ts:68), ein Klick darauf tut nichts (Zeile 110). typeText (tools/lib/harness.mjs:355) wirft aber, sobald der Text in keinem INPUT ankommt.
  • Im vollen Lauf hält offenbar noch ein Eingabefeld aus einem früheren Modul den Fokus, und die „9“ landet dort. Wohin genau, habe ich nicht gemessen. Der Check hängt damit von der Reihenfolge ab, und im vollen Lauf tippt er in ein fremdes Feld.

Zu bauen (Vorschlag)

  • In 56a-ii nicht typeText benutzen, sondern die Tastendrücke ohne Ankunftsprüfung schicken (eigener Helfer typeBlind in der Harness oder press je Ziffer).
  • Dazu prüfen, was eigentlich gemeint ist: Nach dem Klick auf das gesperrte Feld hält kein Eingabefeld des Inspectors den Fokus, und der Wert bleibt 42.
  • Vor 56a-ii den Fokus frei machen (z. B. Escape oder ein Klick auf eine leere Stelle), damit ein Rest aus Modul 55 nichts mehr ausmacht.

Beweis beim Schließen

  • GM_STEPS=56 allein ist grün, GM_STEPS=55,56 ebenso.
  • Gegenprobe: Ist das Feld nicht gesperrt (Sperre im Test kurz umgehen), fällt der Check, weil der Wert dann nicht mehr 42 ist.

Offen (mit Vorschlag)

  1. Andere Module mit demselben Muster suchen? Vorschlag: ja, kurz mitnehmen. Gesucht wird typeText auf ein Feld, das gesperrt sein soll. Mehr als ein grep ist das nicht.
Aus #270 (Abschluss vom 2026-09-30, „Finding, not fixed“: e2e 56 fällt allein), gefunden in Durchgang 4 von #156 und heute nachgemessen. ## Befund - **e2e 56 fällt, wenn es allein läuft.** Gemessen am 2026-10-03 auf `melektaus-atx` mit `GM_STEPS=56` am Stand `808e1ee`: Die ersten drei Checks sind grün, dann bricht das Modul ab mit `typing "9" did not arrive: focus is BODY, it holds undefined`, `E2E EXIT 1`. - **Im vollen Lauf ist derselbe Check grün.** CI-Task 482 (`808e1ee`, Modul 55 läuft direkt davor): `the value of the private timer is read-only, hp still takes a new one – {"hp":8,"timer":42}`. - **Die Ursache liegt im Test, nicht im Editor.** Block 56a-ii (`tools/e2e/56-private-variables.mjs:100`) klickt das gesperrte Feld `timer` an und tippt mit `typeText('9')`. Ein gesperrtes Feld ist zu Recht nicht fokussierbar (`focusable = !this.readOnly`, `src/ui/widgets/TextField.ts:68`), ein Klick darauf tut nichts (Zeile 110). `typeText` (`tools/lib/harness.mjs:355`) wirft aber, sobald der Text in keinem `INPUT` ankommt. - Im vollen Lauf hält offenbar noch ein Eingabefeld aus einem früheren Modul den Fokus, und die „9“ landet dort. Wohin genau, habe ich nicht gemessen. Der Check hängt damit von der Reihenfolge ab, und im vollen Lauf tippt er in ein fremdes Feld. ## Zu bauen (Vorschlag) - In 56a-ii nicht `typeText` benutzen, sondern die Tastendrücke ohne Ankunftsprüfung schicken (eigener Helfer `typeBlind` in der Harness oder `press` je Ziffer). - Dazu prüfen, was eigentlich gemeint ist: Nach dem Klick auf das gesperrte Feld hält **kein** Eingabefeld des Inspectors den Fokus, und der Wert bleibt 42. - Vor 56a-ii den Fokus frei machen (z. B. `Escape` oder ein Klick auf eine leere Stelle), damit ein Rest aus Modul 55 nichts mehr ausmacht. ## Beweis beim Schließen - `GM_STEPS=56` allein ist grün, `GM_STEPS=55,56` ebenso. - Gegenprobe: Ist das Feld nicht gesperrt (Sperre im Test kurz umgehen), fällt der Check, weil der Wert dann nicht mehr 42 ist. ## Offen (mit Vorschlag) 1. **Andere Module mit demselben Muster suchen?** Vorschlag: ja, kurz mitnehmen. Gesucht wird `typeText` auf ein Feld, das gesperrt sein soll. Mehr als ein grep ist das nicht.
meleki added the new label 2026-10-03 17:56:50 +02:00
admin added high-priority and removed new labels 2026-10-03 18:05:53 +02:00
admin added this to the Development project 2026-10-03 18:05:55 +02:00
admin moved this to Next in Development on 2026-10-03 18:05:57 +02:00
admin moved this to Done in Development on 2026-10-03 18:17:06 +02:00
Author
Owner

Erledigt mit a40e629.

Was geändert ist

  • Neuer Harness-Helfer typeBlind (tools/lib/harness.mjs): Er schickt die Zeichen wie typeText, prüft aber nicht, wo sie ankommen. Er ist für Tastendrücke gedacht, die abgewiesen werden sollen.
  • 56a-ii tippt jetzt mit t.typeBlind('9') und prüft zusätzlich, dass nach dem Klick auf das gesperrte Feld kein Feld den Fokus hält (__gm.focusedRect() ist null). Modul 28 prüft das gesperrte Asset-Feld schon genauso.
  • Der Check heißt jetzt „the value of the private timer is read-only and takes no focus, hp still takes a new one“. Die Zahl der Checks bleibt gleich, die e2e-Summe bleibt 1728.

Zum Vorschlag „Fokus vorher frei machen“

Einen eigenen Schritt dafür brauche ich nicht. Jeder Klick außerhalb des fokussierten Felds nimmt ihm den Fokus (src/ui/UIContext.ts:23, blurIfOutside in der Capture-Phase). Das gilt auch für einen Klick auf das gesperrte Feld. Ein Rest aus Modul 55 ist nach dem Klick also weg, und genau das prüft der neue Teil des Checks.

Beweis (auf melektaus-atx)

  • GM_STEPS=56 allein: ALL PASSED – 10 checks. Vorher endete es mit typing "9" did not arrive: focus is BODY.
  • GM_STEPS=55,56: ALL PASSED – 27 checks.
  • PASS-Zeile: {"focusedAfter":null,…,"hp":8,"timer":42}
  • Gegenprobe greift: Wenn das zweite Sperren im Test fehlt, ist timer beim Tippen editierbar. 56a-ii fällt dann mit {"focusedAfter":{"x":1064,"y":332,"w":124,"h":24},…,"timer":9}. Drei spätere Checks fallen als Folgefehler mit, weil timer öffentlich bleibt.
  • Gate: 229 Files, 3514 Tests, CHECK EXIT 0 (unverändert, es kommt kein Unit-Test dazu).

Offener Punkt 1 (andere Module mit demselben Muster)

Gesucht habe ich in tools/e2e nach read-only, readOnly und locked. Ein weiteres Modul, das in ein gesperrtes Feld tippt, gibt es nicht. Die einzige andere Stelle mit gesperrtem Feld ist 28 (Asset-Zeile), und die klickt nur und prüft focusedRect() === null.

Nicht gemessen

Wo die „9“ im vollen Lauf früher gelandet ist, habe ich nicht nachgemessen. Mit typeBlind und dem Fokus-Check spielt das für den Test keine Rolle mehr.

Erledigt mit `a40e629`. ## Was geändert ist - **Neuer Harness-Helfer `typeBlind`** (`tools/lib/harness.mjs`): Er schickt die Zeichen wie `typeText`, prüft aber nicht, wo sie ankommen. Er ist für Tastendrücke gedacht, die abgewiesen werden sollen. - **56a-ii tippt jetzt mit `t.typeBlind('9')`** und prüft zusätzlich, dass nach dem Klick auf das gesperrte Feld kein Feld den Fokus hält (`__gm.focusedRect()` ist `null`). Modul 28 prüft das gesperrte *Asset*-Feld schon genauso. - Der Check heißt jetzt „the value of the private timer is read-only and takes no focus, hp still takes a new one“. Die Zahl der Checks bleibt gleich, die e2e-Summe bleibt **1728**. ## Zum Vorschlag „Fokus vorher frei machen“ Einen eigenen Schritt dafür brauche ich nicht. Jeder Klick außerhalb des fokussierten Felds nimmt ihm den Fokus (`src/ui/UIContext.ts:23`, `blurIfOutside` in der Capture-Phase). Das gilt auch für einen Klick auf das gesperrte Feld. Ein Rest aus Modul 55 ist nach dem Klick also weg, und genau das prüft der neue Teil des Checks. ## Beweis (auf `melektaus-atx`) - `GM_STEPS=56` allein: **ALL PASSED – 10 checks**. Vorher endete es mit `typing "9" did not arrive: focus is BODY`. - `GM_STEPS=55,56`: **ALL PASSED – 27 checks**. - PASS-Zeile: `{"focusedAfter":null,…,"hp":8,"timer":42}` - **Gegenprobe greift:** Wenn das zweite Sperren im Test fehlt, ist `timer` beim Tippen editierbar. 56a-ii fällt dann mit `{"focusedAfter":{"x":1064,"y":332,"w":124,"h":24},…,"timer":9}`. Drei spätere Checks fallen als Folgefehler mit, weil `timer` öffentlich bleibt. - Gate: 229 Files, 3514 Tests, `CHECK EXIT 0` (unverändert, es kommt kein Unit-Test dazu). ## Offener Punkt 1 (andere Module mit demselben Muster) Gesucht habe ich in `tools/e2e` nach `read-only`, `readOnly` und `locked`. Ein weiteres Modul, das in ein gesperrtes Feld tippt, gibt es nicht. Die einzige andere Stelle mit gesperrtem Feld ist 28 (*Asset*-Zeile), und die klickt nur und prüft `focusedRect() === null`. ## Nicht gemessen Wo die „9“ im vollen Lauf früher gelandet ist, habe ich nicht nachgemessen. Mit `typeBlind` und dem Fokus-Check spielt das für den Test keine Rolle mehr.
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: meleki/feuerwerk#307