diff --git a/server/pruef-befinden.mjs b/server/pruef-befinden.mjs
index 980a8b7f..582de6d3 100644
--- a/server/pruef-befinden.mjs
+++ b/server/pruef-befinden.mjs
@@ -908,7 +908,71 @@ melde("=== 8. Die Analyse im Browser ===");
ok(g.kopf.length > 30, `mit einem ganzen Satz („${g.kopf.slice(0, 52)}…")`);
ok(g.schluss.length > 20, `und einem Schlusssatz („${g.schluss.slice(0, 46)}…")`);
ok(/\d+ Fragen aus \d+ Feldern/.test(g.zahlen),
- `die Belegzahlen stehen darunter („${g.zahlen}")`);
+ `die Belegzahlen stehen darunter („${g.zahlen}“)`);
+
+ /* ---- EINE FLAECHE, UND JEDER KOPF UEBER SEINEN EIGENEN FRAGEN
+ (23.09.2026) ----------------------------------------------
+
+ Filipe: „ich will dass diese seite viel übersichtlicher aussieht,
+ es soll eine riesßen kachel sein wo alles viel besser und geiler
+ aussieht.“
+
+ Die Fragen liegen jetzt in EINER Flaeche, darin je Gruppe ein
+ Abschnitt mit Kopf und eigenem Raster.
+
+ WARUM HIER GEMESSEN WIRD UND NICHT NACHGESEHEN, OB ES IM HTML
+ RICHTIG VERSCHACHTELT IST: Genau das war es die ganze Zeit. Der
+ Kopf stand im richtigen Abschnitt -- und trotzdem oben rechts
+ neben den Fragen der naechsten Gruppe, weil `columns: 2` auf dem
+ Behaelter den Abschnitt mitten durchgeschnitten hat. Eine Pruefung
+ auf die Verschachtelung waere dabei gruen geblieben; nachgemessen
+ war sie es auch (`kopfInGruppe: true`), waehrend das Bild falsch war.
+
+ Gemessen wird deshalb, WO die Kaesten liegen:
+ 1. jede Frage unterhalb des Kopfes IHRER Gruppe,
+ 2. keine Gruppe ragt in die naechste hinein.
+ Gegenprobe gefahren: mit dem Spaltensatz zurueck faellt (1) auf
+ 5 von 6 und (2) auf 3 von 5. Die Pruefung kann also auch
+ „nicht in Ordnung“ sagen. */
+ const lage = await seite.evaluate(() => {
+ const gruppen = [...document.querySelectorAll(".b-gruppe")];
+ const kasten = gruppen.map((x) => x.getBoundingClientRect());
+ let gestapelt = 0;
+ for (let i = 1; i < kasten.length; i++) {
+ if (kasten[i].top >= kasten[i - 1].bottom - 2) gestapelt++;
+ }
+ return {
+ flaechen: document.querySelectorAll(".b-flaeche").length,
+ gruppen: gruppen.length,
+ fragen: document.querySelectorAll("#fragen .e-punkt").length,
+ /* Keine Frage darf ausserhalb einer Gruppe haengen. */
+ ausserhalb: [...document.querySelectorAll("#fragen .e-punkt")]
+ .filter((f) => !f.closest(".b-gruppe")).length,
+ kopfUeberFragen: gruppen.filter((gr) => {
+ const k = gr.querySelector(".e-feld");
+ if (!k) return true;
+ const unten = k.getBoundingClientRect().bottom;
+ return [...gr.querySelectorAll(".e-punkt")]
+ .every((f) => f.getBoundingClientRect().top >= unten - 2);
+ }).length,
+ gestapelt,
+ paare: Math.max(0, kasten.length - 1),
+ /* Kein seitliches Wegrutschen -- eine Flaeche, die breiter ist
+ als das Fenster, schiebt die ganze Seite. */
+ breiter: document.documentElement.scrollWidth > innerWidth + 1,
+ };
+ });
+ ok(lage.flaechen === 1,
+ `die Fragen liegen in EINER Flaeche (${lage.flaechen})`);
+ ok(lage.gruppen >= 3 && lage.fragen > 0 && lage.ausserhalb === 0,
+ `alle ${lage.fragen} Fragen stecken in ihren ${lage.gruppen} Gruppen (${lage.ausserhalb} lose)`);
+ /* DIE ZAHL GEHOERT IN DIE BEDINGUNG -- sonst waere das hier bei null
+ Gruppen gruen, ohne etwas gesehen zu haben. */
+ ok(lage.gruppen > 0 && lage.kopfUeberFragen === lage.gruppen,
+ `jede Ueberschrift steht ueber IHREN Fragen (${lage.kopfUeberFragen} von ${lage.gruppen})`);
+ ok(lage.paare > 0 && lage.gestapelt === lage.paare,
+ `keine Gruppe ragt in die naechste (${lage.gestapelt} von ${lage.paare} Uebergaengen sauber)`);
+ ok(lage.breiter === false, "und nichts steht seitlich ueber den Rand");
/* ---- KEIN TEXT AUF TEXT, AUCH AM HANDY (20.09.2026) --------------
diff --git a/workspace/anruf-probe.html b/workspace/anruf-probe.html
index 6ea7981d..948f0525 100644
--- a/workspace/anruf-probe.html
+++ b/workspace/anruf-probe.html
@@ -16,15 +16,15 @@
verdeckt. Gefunden hat es pruef-struktur.
Richtig sind `gate.css` (die Farbwerte des Hauses) und `haus.css`. -->
-
-
+
+
-
+