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)
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
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.
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.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
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
melektaus-atxmitGM_STEPS=56am Stand808e1ee: Die ersten drei Checks sind grün, dann bricht das Modul ab mittyping "9" did not arrive: focus is BODY, it holds undefined,E2E EXIT 1.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}.tools/e2e/56-private-variables.mjs:100) klickt das gesperrte Feldtimeran und tippt mittypeText('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 keinemINPUTankommt.Zu bauen (Vorschlag)
typeTextbenutzen, sondern die Tastendrücke ohne Ankunftsprüfung schicken (eigener HelfertypeBlindin der Harness oderpressje Ziffer).Escapeoder ein Klick auf eine leere Stelle), damit ein Rest aus Modul 55 nichts mehr ausmacht.Beweis beim Schließen
GM_STEPS=56allein ist grün,GM_STEPS=55,56ebenso.Offen (mit Vorschlag)
typeTextauf ein Feld, das gesperrt sein soll. Mehr als ein grep ist das nicht.Erledigt mit
a40e629.Was geändert ist
typeBlind(tools/lib/harness.mjs): Er schickt die Zeichen wietypeText, prüft aber nicht, wo sie ankommen. Er ist für Tastendrücke gedacht, die abgewiesen werden sollen.t.typeBlind('9')und prüft zusätzlich, dass nach dem Klick auf das gesperrte Feld kein Feld den Fokus hält (__gm.focusedRect()istnull). Modul 28 prüft das gesperrte Asset-Feld schon genauso.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,blurIfOutsidein 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=56allein: ALL PASSED – 10 checks. Vorher endete es mittyping "9" did not arrive: focus is BODY.GM_STEPS=55,56: ALL PASSED – 27 checks.{"focusedAfter":null,…,"hp":8,"timer":42}timerbeim 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, weiltimeröffentlich bleibt.CHECK EXIT 0(unverändert, es kommt kein Unit-Test dazu).Offener Punkt 1 (andere Module mit demselben Muster)
Gesucht habe ich in
tools/e2enachread-only,readOnlyundlocked. 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üftfocusedRect() === null.Nicht gemessen
Wo die „9“ im vollen Lauf früher gelandet ist, habe ich nicht nachgemessen. Mit
typeBlindund dem Fokus-Check spielt das für den Test keine Rolle mehr.