From d5e873d597ed423ee387c36e976e2a25d3b3444f Mon Sep 17 00:00:00 2001 From: Dogfather Date: Tue, 29 Sep 2026 14:51:52 +0200 Subject: [PATCH] Zehn Messungen bekommen einen Finger -- und eine Zeitbombe faellt auf MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Die Grundlinie der Fingerwache sinkt von 17 auf 6. WAS UMGESTELLT WURDE pruef-alter, pruef-countdown, pruef-gespraech, pruef-treffchat, pruef-modi-verborgen, pruef-nachwuchs, pruef-personen-liste, pruef-serien, pruef-team, pruef-kalender. Alle zehn legen ein eigenes Handyfenster an; dort fehlte nur `hasTouch`. Ohne ihn meldet der Browser einen feinen Zeiger, und keine Regel aus `@media (pointer: coarse)` greift -- dort stehen die 44-Pixel-Beruehrziele. JEDE EINZELN GELAUFEN, ALLE GRUEN Diese Seiten halten die Fingerregeln also schon ein. Es hatte nur nie jemand nachgesehen. Vorher geprueft, wie gross jede ist: 1 bis 7 Seitenaufrufe, 1 bis 5 Fenster -- echte Einzelpruefungen. (Zum Vergleich: die Pruefung von gestern Nacht hatte 244 Seitenaufrufe, und genau das hatte ich vorher nicht nachgesehen.) DIE ZEITBOMBE IN pruef-kalender Beim Umstellen fiel sie rot aus -- zweimal, an einer Stelle, die mit dem Finger nichts zu tun hat: FEHL im naechsten Monat ist kein Tag mehr "heute" Gegen den ausgelieferten Stand gemessen: identisch rot. Nicht meine Aenderung, sondern der Kalender. Heute ist der 29. September. Das Oktober-Raster zeigt in seiner ersten Zeile die letzten Septembertage mit, und einer davon IST heute. Die Anwendung macht dabei alles richtig: `kalender.js` setzt die Marke an `tag === daten.heute`, also am DATUM und nicht an der Rasterposition. Genau das sollte die Pruefung beweisen -- und schlug an, weil die Anwendung es tat. Geschrieben wurde sie an einem Tag in der Monatsmitte. Von da an war sie richtig, bis der Kalender sie einholte. Dasselbe Muster wie `gate-oeffnung.mjs` am 06.09.2026 im Shop: Ein Test, der die Wanduhr als Annahme benutzt, misst irgendwann das Gegenteil. Gefragt wird jetzt, was gemeint war: Ein EIGENER Tag des Folgemonats darf nie „heute" sein; ein mitgezeigter Randtag (`data-fremd="ja"`) dagegen sehr wohl, und zwar genau dann, wenn er es ist. Das gilt an jedem Tag des Jahres. Die Meldung nennt jetzt beide Zahlen: ok im naechsten Monat ist kein EIGENER Tag mehr "heute" (0 eigene, 1 mitgezeigte Randtage) WAS UEBRIG BLEIBT: SECHS SCHWERE FAELLE pruef-befinden, pruef-notizen, pruef-teamlage-karten, pruef-terminregel, pruef-werdegang, pruef-grosscheck. Dort schaltet `setViewportSize` mitten im Ablauf auf Handyformat um -- und der Finger laesst sich nachtraeglich nicht setzen, er gehoert zum Kontext. Jeder Fall braucht einen eigenen Kontext samt Anmeldung: Umbau, nicht Einzeiler. `pruef-grosscheck` bleibt unangetastet, bis Filipe einen Lauf freigibt. Eine Aenderung, die ich nicht pruefen darf, liefere ich nicht aus. GEPRUEFT alle zehn einzeln: EXIT 0, keine FEHL-Zeile pruef-kalender EXIT 0 (vorher 2 Fehlschlaege, auch auf HEAD) pruef-fingermass 3 / 0, Grundlinie 6 --- server/pruef-alter.mjs | 6 +++++- server/pruef-countdown.mjs | 6 +++++- server/pruef-fingermass.mjs | 18 ++++++++++++++-- server/pruef-gespraech.mjs | 6 +++++- server/pruef-kalender.mjs | 37 +++++++++++++++++++++++++++++++-- server/pruef-modi-verborgen.mjs | 6 +++++- server/pruef-nachwuchs.mjs | 6 +++++- server/pruef-personen-liste.mjs | 6 +++++- server/pruef-serien.mjs | 6 +++++- server/pruef-team.mjs | 6 +++++- server/pruef-treffchat.mjs | 6 +++++- 11 files changed, 96 insertions(+), 13 deletions(-) diff --git a/server/pruef-alter.mjs b/server/pruef-alter.mjs index db4c7f20..47cf5c07 100644 --- a/server/pruef-alter.mjs +++ b/server/pruef-alter.mjs @@ -278,7 +278,11 @@ melde("=== 7. Im Browser ==="); const { chromium } = await import( "file:///C:/Users/qciga/Documents/Obelix/Analyse/node_modules/playwright/index.mjs"); const browser = await chromium.launch(); - const kontext = await browser.newContext({ viewport: { width: 390, height: 844 } }); + /* MIT FINGER. Ohne `hasTouch` meldet der Browser einen feinen + Zeiger, und keine Regel aus `@media (pointer: coarse)` greift -- + dort stehen die 44-Pixel-Beruehrziele. Siehe pruef-fingermass.mjs. */ + const kontext = await browser.newContext({ viewport: { width: 390, height: 844 }, + hasTouch: true, isMobile: true }); const seite = await kontext.newPage(); const konsole = []; seite.on("console", (m) => { if (m.type() === "error" && !/favicon|ERR_/i.test(m.text())) konsole.push(m.text()); }); diff --git a/server/pruef-countdown.mjs b/server/pruef-countdown.mjs index b878481b..1e447f66 100644 --- a/server/pruef-countdown.mjs +++ b/server/pruef-countdown.mjs @@ -192,7 +192,11 @@ const { chromium } = await import( const browser = await chromium.launch(); try { const HOEHE = 844; - const kontext = await browser.newContext({ viewport: { width: 390, height: HOEHE } }); + /* MIT FINGER. Ohne `hasTouch` meldet der Browser einen feinen + Zeiger, und keine Regel aus `@media (pointer: coarse)` greift -- + dort stehen die 44-Pixel-Beruehrziele. Siehe pruef-fingermass.mjs. */ + const kontext = await browser.newContext({ viewport: { width: 390, height: HOEHE }, + hasTouch: true, isMobile: true }); await kontext.addCookies(keks.split("; ").map((k) => { const [name, ...rest] = k.split("="); return { name, value: rest.join("="), domain: "127.0.0.1", path: "/" }; diff --git a/server/pruef-fingermass.mjs b/server/pruef-fingermass.mjs index a9330c44..1a75f7d1 100644 --- a/server/pruef-fingermass.mjs +++ b/server/pruef-fingermass.mjs @@ -61,8 +61,22 @@ const ORDNER = new URL(".", import.meta.url).pathname.replace(/^\/([A-Za-z]:)/, `setViewportSize` sitzt auf einer Seite, die den Finger schon hat), die zweite ein echter Fund und sofort repariert. - Die erste Zahl, die eine Wache liefert, ist selten die richtige. */ -const GRUNDLINIE = 17; + Die erste Zahl, die eine Wache liefert, ist selten die richtige. + + 29.09.2026, nachmittags: 17 -> 6. Zehn Fenster bekamen einen + Finger, eines fiel weg. Alle zehn Pruefungen liefen danach gruen + -- diese Seiten halten die Fingerregeln also schon ein, es hatte + nur nie jemand nachgesehen. Gefunden wurde dabei trotzdem etwas: + eine Zeitbombe in pruef-kalender (siehe dort). + + Die sechs uebrigen sind die schweren Faelle: Dort schaltet + `setViewportSize` mitten im Ablauf auf Handyformat um, und der + Finger laesst sich nachtraeglich nicht setzen. Jeder davon + braucht einen eigenen Kontext samt Anmeldung -- Umbau, nicht + Einzeiler. `pruef-grosscheck` bleibt unangetastet, bis Filipe + einen Lauf freigibt: Eine Aenderung, die ich nicht pruefen darf, + liefere ich nicht aus. */ +const GRUNDLINIE = 6; /* Ab wann ist ein Fenster ein Telefon? 860 ist die Grenze, die im Haus schon in mess-reaktion und mess-chat-optik steht. Darueber diff --git a/server/pruef-gespraech.mjs b/server/pruef-gespraech.mjs index c588cc97..40fbdf99 100644 --- a/server/pruef-gespraech.mjs +++ b/server/pruef-gespraech.mjs @@ -268,7 +268,11 @@ melde("=== 6. Wie es aussieht ==="); "file:///C:/Users/qciga/Documents/Obelix/Analyse/node_modules/playwright/index.mjs"); const browser = await chromium.launch(); try { - const kontext = await browser.newContext({ viewport: { width: 390, height: 900 } }); + /* MIT FINGER. Ohne `hasTouch` meldet der Browser einen feinen + Zeiger, und keine Regel aus `@media (pointer: coarse)` greift -- + dort stehen die 44-Pixel-Beruehrziele. Siehe pruef-fingermass.mjs. */ + const kontext = await browser.newContext({ viewport: { width: 390, height: 900 }, + hasTouch: true, isMobile: true }); await kontext.addCookies(dogi.split("; ").map((k) => { const [name, ...rest] = k.split("="); return { name, value: rest.join("="), domain: "127.0.0.1", path: "/" }; diff --git a/server/pruef-kalender.mjs b/server/pruef-kalender.mjs index fd4f4e30..494bb0b7 100644 --- a/server/pruef-kalender.mjs +++ b/server/pruef-kalender.mjs @@ -192,6 +192,12 @@ const lesen = (seite) => seite.evaluate(() => ({ kwSpalten: document.querySelectorAll(".k-kw").length, kwWerte: [...document.querySelectorAll(".k-kw")].map((k) => k.textContent), heuteZellen: document.querySelectorAll('.k-tag[data-heute="ja"]').length, + /* Ein Monatsraster zeigt die Randtage der Nachbarmonate mit + (`data-fremd="ja"`). Fuer die Frage „wandert die Heute-Marke + mit der Ansicht?" zaehlen nur die EIGENEN Tage -- siehe die + Pruefung beim Blaettern. */ + heuteEigen: document.querySelectorAll('.k-tag[data-heute="ja"]:not([data-fremd="ja"])').length, + heuteFremd: document.querySelectorAll('.k-tag[data-heute="ja"][data-fremd="ja"]').length, feiertagZellen: document.querySelectorAll('.k-tag[data-feiertag="ja"]').length, fremdZellen: document.querySelectorAll('.k-tag[data-fremd="ja"]').length, /* Eintraege */ @@ -344,7 +350,30 @@ for (const [breite, wie] of [[1440, "Computer"], [390, "Handy"]]) { await seite.waitForTimeout(400); const weiter = await lesen(seite); ok(weiter.zeitraum !== vorher, `vorwärts blättern wechselt den Monat (${vorher} → ${weiter.zeitraum})`); - ok(weiter.heuteZellen === 0, "im nächsten Monat ist kein Tag mehr \"heute\""); + /* DIESE PRUEFUNG WAR EINE ZEITBOMBE (entschärft 29.09.2026). + + Sie stand auf `weiter.heuteZellen === 0` und war jahrelang grün + -- bis heute. Am 29. September zeigt das Oktober-Raster in + seiner ersten Zeile die letzten Septembertage mit, und einer + davon IST heute. Die Anwendung macht dabei alles richtig: + `kalender.js` setzt die Marke an `tag === daten.heute`, also am + Datum und nicht an der Rasterposition. Genau das sollte die + Pruefung ja beweisen -- und schlug an, weil die Anwendung es + tat. + + Geschrieben wurde sie an einem Tag in der Monatsmitte. Von da + an war sie richtig, bis der Kalender sie einholte, und dann + kostete der Fehlalarm Vertrauen in den ganzen Satz. Dasselbe + Muster wie `gate-oeffnung.mjs` am 06.09.2026 im Shop. + + Gefragt wird jetzt, was gemeint war: Die Marke darf NICHT an + der Ansicht haengen. Ein EIGENER Tag des Folgemonats darf nie + „heute" sein -- ein mitgezeigter Randtag des laufenden Monats + dagegen sehr wohl, und zwar genau dann, wenn er es ist. Das + gilt an jedem Tag des Jahres. */ + ok(weiter.heuteEigen === 0, + `im nächsten Monat ist kein EIGENER Tag mehr "heute" ` + + `(${weiter.heuteEigen} eigene, ${weiter.heuteFremd} mitgezeigte Randtage)`); await seite.click("#heute-knopf"); await seite.waitForTimeout(400); const zurueck = await lesen(seite); @@ -762,7 +791,11 @@ console.log("\n=== Die gerechneten Tage"); ======================================================================= */ console.log("\n=== Am Handy wird aus einer Pille ein Punkt"); { - const kPunkt = await browser.newContext({ viewport: { width: 390, height: 1100 } }); + /* MIT FINGER. Ohne `hasTouch` meldet der Browser einen feinen + Zeiger, und keine Regel aus `@media (pointer: coarse)` greift -- + dort stehen die 44-Pixel-Beruehrziele. Siehe pruef-fingermass.mjs. */ + const kPunkt = await browser.newContext({ viewport: { width: 390, height: 1100 }, + hasTouch: true, isMobile: true }); const sPunkt = await anmelden(kPunkt, "admin", "CODE-DOGI-0001"); try { await sPunkt.goto(BASIS + "/workspace/kalender.html", { waitUntil: "networkidle" }); diff --git a/server/pruef-modi-verborgen.mjs b/server/pruef-modi-verborgen.mjs index 6835fedb..2b352215 100644 --- a/server/pruef-modi-verborgen.mjs +++ b/server/pruef-modi-verborgen.mjs @@ -375,7 +375,11 @@ console.log("\n=== 7. Dieselbe Seite mit einem echten Browser ===\n"); "file:///C:/Users/qciga/Documents/Obelix/Analyse/node_modules/playwright/index.mjs"); const browser = await chromium.launch(); try { - const kontext = await browser.newContext({ viewport: { width: 390, height: 844 } }); + /* MIT FINGER. Ohne `hasTouch` meldet der Browser einen feinen + Zeiger, und keine Regel aus `@media (pointer: coarse)` greift -- + dort stehen die 44-Pixel-Beruehrziele. Siehe pruef-fingermass.mjs. */ + const kontext = await browser.newContext({ viewport: { width: 390, height: 844 }, + hasTouch: true, isMobile: true }); const seite = await kontext.newPage(); const konsole = []; seite.on("console", (e) => { if (e.type() === "error") konsole.push(e.text()); }); diff --git a/server/pruef-nachwuchs.mjs b/server/pruef-nachwuchs.mjs index dee76a89..0cb40bb8 100644 --- a/server/pruef-nachwuchs.mjs +++ b/server/pruef-nachwuchs.mjs @@ -1217,7 +1217,11 @@ melde("=== 15. Im echten Browser ==="); try { /* 390 x 844 -- ein Handy. Filipe arbeitet am Handy, und die Kopfleiste ist genau dort im September zerbrochen. */ - const sicht = await browser.newContext({ viewport: { width: 390, height: 844 } }); + /* MIT FINGER. Ohne `hasTouch` meldet der Browser einen feinen + Zeiger, und keine Regel aus `@media (pointer: coarse)` greift -- + dort stehen die 44-Pixel-Beruehrziele. Siehe pruef-fingermass.mjs. */ + const sicht = await browser.newContext({ viewport: { width: 390, height: 844 }, + hasTouch: true, isMobile: true }); await sicht.addCookies(kDogi.split("; ").map((c) => { const [name, ...rest] = c.split("="); return { name, value: rest.join("="), domain: "127.0.0.1", path: "/" }; diff --git a/server/pruef-personen-liste.mjs b/server/pruef-personen-liste.mjs index 91cc7381..db7d85f7 100644 --- a/server/pruef-personen-liste.mjs +++ b/server/pruef-personen-liste.mjs @@ -238,7 +238,11 @@ await kontext.close(); console.log("\n6) Auf dem Handy genauso"); { - const k = await browser.newContext({ viewport: { width: 390, height: 844 } }); + /* MIT FINGER. Ohne `hasTouch` meldet der Browser einen feinen + Zeiger, und keine Regel aus `@media (pointer: coarse)` greift -- + dort stehen die 44-Pixel-Beruehrziele. Siehe pruef-fingermass.mjs. */ + const k = await browser.newContext({ viewport: { width: 390, height: 844 }, + hasTouch: true, isMobile: true }); const s = await seiteFuer(k); const r = await lesen(s); ok(r.abschnitte.length === 4, `vier Überschriften (${r.abschnitte.length})`); diff --git a/server/pruef-serien.mjs b/server/pruef-serien.mjs index 023cf8a5..e31b1cd3 100644 --- a/server/pruef-serien.mjs +++ b/server/pruef-serien.mjs @@ -456,7 +456,11 @@ gleich(vorschau.trim(), "Läuft " + serienText( "Formular und Server formulieren WORTGLEICH – sonst laufen sie auseinander"); await seiteDogi.screenshot({ path: "pruef-serien-computer.png", fullPage: false }); -const handy = await browser.newContext({ viewport: { width: 390, height: 844 } }); +/* MIT FINGER. Ohne `hasTouch` meldet der Browser einen feinen + Zeiger, und keine Regel aus `@media (pointer: coarse)` greift -- + dort stehen die 44-Pixel-Beruehrziele. Siehe pruef-fingermass.mjs. */ +const handy = await browser.newContext({ viewport: { width: 390, height: 844 }, + hasTouch: true, isMobile: true }); const seiteHandy = await handy.newPage(); await seiteHandy.goto(BASIS + "/workspace/", { waitUntil: "domcontentloaded" }); await seiteHandy.click('.rolle[data-rolle="admin"]'); diff --git a/server/pruef-team.mjs b/server/pruef-team.mjs index b1c91514..10c9b9f3 100644 --- a/server/pruef-team.mjs +++ b/server/pruef-team.mjs @@ -332,7 +332,11 @@ console.log("\n=== Auf der Seite"); } /* Am Handy ebenfalls. */ - const ctx2 = await browser.newContext({ viewport: { width: 390, height: 900 } }); + /* MIT FINGER. Ohne `hasTouch` meldet der Browser einen feinen + Zeiger, und keine Regel aus `@media (pointer: coarse)` greift -- + dort stehen die 44-Pixel-Beruehrziele. Siehe pruef-fingermass.mjs. */ + const ctx2 = await browser.newContext({ viewport: { width: 390, height: 900 }, + hasTouch: true, isMobile: true }); const s2 = await ctx2.newPage(); await s2.goto(BASIS + "/workspace/", { waitUntil: "domcontentloaded" }); await s2.click('.rolle[data-rolle="admin"]'); diff --git a/server/pruef-treffchat.mjs b/server/pruef-treffchat.mjs index d4d7d48b..d758db4b 100644 --- a/server/pruef-treffchat.mjs +++ b/server/pruef-treffchat.mjs @@ -513,7 +513,11 @@ melde("=== 6b. Im Browser ==="); const { chromium } = await import( "file:///C:/Users/qciga/Documents/Obelix/Analyse/node_modules/playwright/index.mjs"); const browser = await chromium.launch(); - const kontext = await browser.newContext({ viewport: { width: 412, height: 915 } }); + /* MIT FINGER. Ohne `hasTouch` meldet der Browser einen feinen + Zeiger, und keine Regel aus `@media (pointer: coarse)` greift -- + dort stehen die 44-Pixel-Beruehrziele. Siehe pruef-fingermass.mjs. */ + const kontext = await browser.newContext({ viewport: { width: 412, height: 915 }, + hasTouch: true, isMobile: true }); const seite = await kontext.newPage(); const konsole = []; seite.on("console", (m) => { if (m.type() === "error" && !/favicon|ERR_/i.test(m.text())) konsole.push(m.text()); });