diff --git a/server/pruef-modi-verborgen.mjs b/server/pruef-modi-verborgen.mjs
index 8642b31f..4d59cbb1 100644
--- a/server/pruef-modi-verborgen.mjs
+++ b/server/pruef-modi-verborgen.mjs
@@ -702,6 +702,100 @@ console.log("\n=== 8. Aufgaben, Einträge und Dateien eines Modis ===\n");
}
}
+/* ---------- 8b. Was nach zwei Fehlversuchen dasteht -------------------
+ =====================================================================
+
+ VanVan im Support, Meldung #5, zweite Runde: „Man kann sich jetzt
+ nur noch über die richtige Schaltfläche anmelden. Das funktioniert
+ jetzt. Aber wenn man sich 2x versucht über den falschen Button
+ anzumelden, dann kommt ein irreführender Text wo steht, dass die
+ Auswahl oben nicht schuld ist."
+
+ DER SATZ WAR EINMAL RICHTIG. Auf der Crew-Wand gab es den stillen
+ Zugang; dort entschied die Kachel wirklich nicht, und wer alle
+ durchprobierte, sperrte sich nur selbst aus. Mit Abschnitt 1 oben
+ ist dieser Weg weggefallen -- und ab da sagte der Satz auf der
+ Wand, auf der jemand gerade feststeckt, das Gegenteil der Wahrheit.
+
+ GEPRUEFT WIRD BEIDES ZUSAMMEN: dass die Kachel wirklich entscheidet
+ (Abschnitt 1) UND dass der Satz das sagt. Eines ohne das andere
+ waere wieder die Lage von gestern.
+
+ DIE SPERRE WIRD VORHER GELEERT. Acht Fehlversuche je Adresse in
+ zehn Minuten -- die Abschnitte davor verbrauchen welche, und ab
+ dem neunten steht „Zu viele Versuche" statt des Satzes, um den es
+ hier geht. Das waere ein roter Haken ueber die Messumgebung, nicht
+ ueber das Programm. Gemessen werden soll der Hinweis, nicht die
+ Bremse.
+ -------------------------------------------------------------------- */
+console.log("\n=== 8b. Der Hinweis nach zwei Fehlversuchen ===\n");
+{
+ const { chromium } = await import(
+ "file:///C:/Users/qciga/Documents/Obelix/Analyse/node_modules/playwright/index.mjs");
+ const browser = await chromium.launch();
+ try {
+ const satzVon = async (wand) => {
+ /* Die Sperre je Lauf zuruecksetzen -- siehe oben. */
+ const dx = new DatabaseSync(process.env.WORKSPACE_DB);
+ dx.exec("DELETE FROM versuche");
+ dx.close();
+
+ const kontext = await browser.newContext({
+ viewport: { width: 390, height: 844 }, hasTouch: true, isMobile: true });
+ const seite = await kontext.newPage();
+ const konsole = [];
+ seite.on("pageerror", (e) => konsole.push("Absturz: " + e.message));
+ await seite.goto(`${BASIS}/workspace/${wand}`, { waitUntil: "domcontentloaded" });
+ await seite.waitForTimeout(400);
+ /* Irgendeine Kachel und ein Code, der zu keiner gehoert. */
+ await seite.click(".rolle >> nth=0");
+ const raus = [];
+ for (const n of [1, 2]) {
+ await seite.fill("#code", `FALSCH-CODE-000${n}`);
+ await seite.click("button[type=submit]");
+ await seite.waitForTimeout(900);
+ raus.push((await seite.textContent("#fehler") || "").replace(/\s+/g, " ").trim());
+ }
+ const crewKlasse = await seite.evaluate(() =>
+ document.body.classList.contains("gate--crew"));
+ await kontext.close();
+ return { nach1: raus[0], nach2: raus[1], crewKlasse, konsole };
+ };
+
+ const crew = await satzVon("crew-index.html");
+ const agentur = await satzVon("index.html");
+
+ ok(crew.crewKlasse === true && agentur.crewKlasse === false,
+ `zwei verschiedene Waende gemessen (crew ${crew.crewKlasse}, `
+ + `agentur ${agentur.crewKlasse})`);
+
+ /* DER EIGENTLICHE BEFUND: Der alte Satz ist weg. */
+ ok(!/nicht schuld/i.test(crew.nach2),
+ `auf der Crew-Wand steht nicht mehr „die Auswahl oben ist nicht schuld" `
+ + `(„${crew.nach2}")`);
+ ok(/Auswahl oben/.test(crew.nach2),
+ "sondern die Frage nach der Auswahl -- die dort seit Abschnitt 1 wirklich gilt");
+ /* EIN SATZ FUER BEIDE WAENDE. Zwei verschiedene waeren wieder zwei
+ Antworten auf dieselbe Frage, und eine davon veraltet. */
+ ok(crew.nach2 === agentur.nach2,
+ `und es ist derselbe Satz wie auf der Agenturwand (${crew.nach2 === agentur.nach2})`);
+
+ /* GEGENPROBE: Nach dem ERSTEN Fehlversuch steht der Hinweis noch
+ NICHT da. Ohne sie waere „der Hinweis kommt" auch dann gruen,
+ wenn er immer kaeme -- und ein Hinweis, der immer kommt, ist
+ keiner. */
+ ok(!/Auswahl oben/.test(crew.nach1),
+ `Gegenprobe: nach dem ersten Versuch steht er noch nicht da („${crew.nach1}")`);
+ ok(crew.nach1.length > 0 && /stimmt nicht/i.test(crew.nach1),
+ ` dort steht die kurze Absage („${crew.nach1}")`);
+
+ ok(crew.konsole.length === 0 && agentur.konsole.length === 0,
+ `kein Skriptfehler auf beiden Waenden (${crew.konsole[0] || agentur.konsole[0] || "keiner"})`);
+ } finally {
+ await browser.close();
+ }
+}
+
/* ---------- 9. Die Gegenprobe ----------------------------------------
Sie steht ABSICHTLICH GANZ UNTEN: Sie haengt eine Person
absichtlich aus der Regel aus. Lief sie weiter oben, tauchte
diff --git a/workspace/anruf-probe.html b/workspace/anruf-probe.html
index 2c7e85b0..f4cc24bf 100644
--- a/workspace/anruf-probe.html
+++ b/workspace/anruf-probe.html
@@ -16,8 +16,8 @@
verdeckt. Gefunden hat es pruef-struktur.
Richtig sind `gate.css` (die Farbwerte des Hauses) und `haus.css`. -->
-
-
+
+
-
+