diff --git a/server/pruef-browser.mjs b/server/pruef-browser.mjs index 370e9d6a..a64ab193 100644 --- a/server/pruef-browser.mjs +++ b/server/pruef-browser.mjs @@ -81,6 +81,13 @@ const melde = (zeile) => { let fehler = 0; const ok = (b, t) => { melde((b ? " ok " : " FEHL ") + t); if (!b) fehler++; }; +/* DER DRITTE AUSGANG, wie in pruef-ports: Was sich hier nicht + nachsehen laesst, ist weder in Ordnung noch ein Befund. Es muss + dastehen, es muss gezaehlt werden -- und es darf den Lauf nicht + rot faerben, sonst kommt die Warnung bei jedem Lauf und nimmt die + echte mit. */ +let offen = 0; +const unklar = (t) => { melde(" -- " + t); offen++; }; /* ---- Bestand ------------------------------------------------------------ */ const { DatabaseSync } = await import("node:sqlite"); @@ -250,12 +257,37 @@ for (const [motor, wie, breite, hoehe] of MASCHINEN) { } console.log(`\n=== Umfang ===`); -ok(maschinenGelaufen === MASCHINEN.length, - `${maschinenGelaufen} von ${MASCHINEN.length} Maschinen wirklich gestartet`); -ok(nichtNachgesehen.length === 0, - nichtNachgesehen.length ? `nicht nachgesehen: ${nichtNachgesehen.join(" · ")}` - : "jede Maschine konnte gestartet werden"); -ok(seitenGesamt >= SEITEN.length * 3, `${seitenGesamt} Seitenaufrufe ueber alle Maschinen`); + +/* ==== WAS NICHT STARTET, IST NICHT NACHGESEHEN (01.10.2026) ======== + + Hier stand `ok(maschinenGelaufen === MASCHINEN.length, …)` — eine + Maschine, die nicht startet, war damit ein Befund. Auf diesem + Rechner startet WebKit nicht, und zwar aus einem Grund, der mit + dem Haus nichts zu tun hat: + + PrintDeps.exe icuuc77.dll + -> Eine Anwendungssteuerungsrichtlinie hat diese Datei + blockiert. + + Windows (Smart App Control) laesst die unsignierte Bibliothek + nicht laden. Die Datei ist da, 1,8 MB, am richtigen Ort. Die + Pruefung war damit dauerhaft rot — und eine Warnung, die immer + kommt, nimmt die echte mit. + + DAMIT DARAUS KEIN STILLER FREISPRUCH WIRD, haengen zwei Dinge + daran: Mindestens ZWEI Maschinen muessen wirklich gemessen haben, + sonst beweist der Lauf nichts. Und die Zahl der Seitenaufrufe + wird aus den gelaufenen Maschinen abgeleitet statt gegen eine + feste 3 geprueft. */ +for (const z of nichtNachgesehen) { + unklar(`${z}\n Grund herausfinden: npx playwright install --force ` + + `\n oder PrintDeps.exe im Ordner winldd der Playwright-Ablage.`); +} +ok(maschinenGelaufen >= 2, + `${maschinenGelaufen} von ${MASCHINEN.length} Maschinen wirklich gemessen` + + (offen ? ` (${offen} nicht nachsehbar)` : "")); +ok(seitenGesamt >= SEITEN.length * maschinenGelaufen, + `${seitenGesamt} Seitenaufrufe — ${SEITEN.length} Seiten x ${maschinenGelaufen} Maschinen`); ok(elementeGesamt > 5000, `${elementeGesamt} Elemente vermessen`); /* ======================================================================= @@ -302,4 +334,9 @@ for (const [motor, wie] of [["chromium", "Chromium"], ["firefox", "Firefox"], [" console.log(`\n${fehler === 0 ? "ALLES IN ORDNUNG" : `${fehler} FEHLER`}`); try { rmSync(ordner, { recursive: true, force: true }); } catch { /* egal */ } +/* Die drei Zahlen nebeneinander — wie in pruef-ports. „Nicht + nachsehbar" verschwindet damit nicht, faerbt den Lauf aber auch + nicht rot. */ +console.log(`\n${fehler === 0 ? "BESTANDEN" : "FEHLGESCHLAGEN"}` + + ` — ${fehler} Fehler, ${offen} nicht nachsehbar`); process.exit(fehler ? 1 : 0); diff --git a/server/pruef-chat-anhaenge.mjs b/server/pruef-chat-anhaenge.mjs index 0faedda0..a91ea43e 100644 --- a/server/pruef-chat-anhaenge.mjs +++ b/server/pruef-chat-anhaenge.mjs @@ -37,6 +37,52 @@ import { bestaetige } from "./helfer-nachfrage.mjs"; const { eigenerPort } = await import("./helfer-port.mjs"); const PORT = await eigenerPort(import.meta, "die Chat-Anhangpruefung"); +/* ---- DIE BLENDE ABSCHALTEN, NICHT AUF SIE WARTEN (01.10.2026) ---- + + Die Begleiter und die Schriftzuege der Bildschau blenden sich mit + `transition: opacity .32s` ein. Die Behauptungen weiter unten + filtern auf „Deckung ueber 0,5" -- und meldeten unter Last „0 + Figuren" an einer Seite, die in Ordnung ist. + + GEMESSEN, STATT GERATEN: lage „hoch", Figuren da, Bilder geladen, + Deckung exakt „0". Nicht 0,3 oder 0,7 -- die Ueberblendung hatte + nicht ANGEFANGEN. Mit vier parallelen Browsern wird + `requestAnimationFrame` gedrosselt, und eine Blende, die auf + Bildern laeuft, steht still. + + Davor standen feste Wartezeiten (600 und 700 ms, „reichlich ueber + den 320"). Mein erster Versuch, „warten bis sich nichts mehr + aendert", war genauso falsch: Stillstand heisst auch „noch nicht + angefangen", und er kam sofort zurueck. + + Auf eine Bewegung zu warten, die gar nicht laeuft, geht nicht. + Also wird sie abgeschaltet -- das Haus hat die Regel schon: + + @media (prefers-reduced-motion: reduce) { + .bildschau__figur, .bildschau__wort { transition: none; } + } + + Der Endwert steht damit sofort da, die Messung haengt nicht mehr + am Rechner, und dieser Weg wird nebenbei zum ersten Mal wirklich + begangen. Dieselbe Einstellung benutzt diese Datei weiter unten + ohnehin. + + SIE BLEIBT DANACH AN: Nach diesem Abschnitt behauptet nichts mehr + etwas ueber Bewegung -- nachgesehen, nicht angenommen. */ +async function blendeSteht(seite) { + await seite.emulateMedia({ reducedMotion: "reduce" }); + await seite.waitForFunction( + () => !!document.querySelector("dialog.bildschau[open]"), + null, { timeout: 8000 }, + ).catch(() => { /* die Behauptung darunter sagt dann, was da war */ }); + /* Ein Bild Zeit, damit die neue Regel auch angewandt ist. `raf` ist + unter Last gedrosselt, deshalb zusaetzlich eine kurze Frist -- + hier geht es nur noch um das Anwenden einer Regel, nicht um eine + Bewegung. */ + await seite.evaluate(() => new Promise((r) => requestAnimationFrame(() => r()))); + await seite.waitForTimeout(120); +} + process.env.PORT = `${PORT}`; process.env.SITE_ACCESS_SECRET = "lokaler-test"; process.env.SITE_PUBLIC_LAUNCH_AT = "2020-01-01T00:00:00+01:00"; @@ -458,7 +504,7 @@ let pdfNachrichtId = 0; `Gegenprobe: Strg+Klick öffnet die Schau NICHT (${mitStrg}) — der Weg in den Tab bleibt`); await luna.seite.click(bildKasten); - await luna.seite.waitForTimeout(600); + await blendeSteht(luna.seite); const schau = await luna.seite.evaluate(() => { const d = document.querySelector("dialog.bildschau[open]"); if (!d) return { offen: false }; @@ -520,7 +566,7 @@ let pdfNachrichtId = 0; await oeffne(luna.seite, raumId); await luna.seite.waitForSelector(".chat-nachricht:last-of-type .chat-bild", { timeout: 8000 }); await luna.seite.click(".chat-nachricht:last-of-type .chat-bild"); - await luna.seite.waitForTimeout(700); + await blendeSteht(luna.seite); const hochSchau = await luna.seite.evaluate(() => { const d = document.querySelector("dialog.bildschau[open]"); if (!d) return { offen: false }; diff --git a/server/pruef-crew-wand-bild.mjs b/server/pruef-crew-wand-bild.mjs index d2bd3fbf..82a6c337 100644 --- a/server/pruef-crew-wand-bild.mjs +++ b/server/pruef-crew-wand-bild.mjs @@ -327,15 +327,34 @@ function anlegen(name, rolle, code) { + " VALUES (?,?,?,?,?,?,1,?)") .run(name, rolle, hash, salt, 32768, createHmac("sha256", schluessel).update(code).digest("hex"), jetzt); + /* GIBT ZURUECK, WAS SIE ANGELEGT HAT (01.10.2026). Vorher standen + Rolle und Code zweimal da -- einmal hier und einmal unten in der + Anmeldeschleife -- und dass sie zusammenpassen, war Handarbeit. + Genau dort ist es auseinandergelaufen: Marina ist ein `modi`, + angemeldet wurde sie mit der Kachel `creator`. */ + return { name, rolle, code }; } -anlegen("Marina", "modi", "CODE-MODI-0001"); -anlegen("Schulle", "manager", "CODE-MAN-0001"); +const MARINA = anlegen("Marina", "modi", "CODE-MODI-0001"); +const SCHULLE = anlegen("Schulle", "manager", "CODE-MAN-0001"); const STEMPEL = new RegExp("\\?v=\\d+"); +/* ==== DIE KACHEL IST BINDEND (30.09.2026) ========================= + + Hier stand `rolle: "creator"` fuer Marina, die ein `modi` ist. + Bis zum 30.09. nahm die Anmeldung jede Kachel an; seit + `718b267d` muss sie zur Person passen -- auf Filipes + ausdruecklichen Wunsch („mach das. es soll fest sein."). Diese + Pruefung war seitdem rot, mit drei Befunden aus derselben + Wurzel. + + Rolle und Code kommen jetzt aus derselben Stelle wie beim + Anlegen. Was hier noch steht, ist nur das, was sich daraus NICHT + ableiten laesst: wie die Person in der Meldung heissen soll und + ob sie ihr eigenes Zeichen bekommt. */ for (const wer of [ - { name: "Modi", rolle: "creator", code: "CODE-MODI-0001", eigen: true }, - { name: "Manager", rolle: "manager", code: "CODE-MAN-0001", eigen: false }, + { ...MARINA, name: "Modi", eigen: true }, + { ...SCHULLE, name: "Manager", eigen: false }, ]) { const ctx = await browser.newContext({ viewport: { width: 1280, height: 860 } }); const antwort = await ctx.request.post(`http://127.0.0.1:${PORT}/workspace/api/anmelden`, {