Startseite: ein Zuschauer hat keine Aufgaben -- und keine toten Knoepfe

ZUM ERSTEN MAL MIT GAST-AUGEN ANGESEHEN. Gemessen wurden bisher immer
nur die sieben Bretter, nie die Seite davor -- dabei ist sie das
Erste, was ein Mitglied sieht.

Sie zeigte:
  "DEINE AUFGABEN" mit sieben Zaehlern (Ueberfaellig, Heute faellig,
  Offen, In Arbeit, Review, Erledigt, Abgebrochen), darunter "Nichts
  offen. Alles abgearbeitet - goenn dir was." und im Kopf "Nichts
  liegt an - guter Tag zum Vorarbeiten."

Das ist die Sprache eines Arbeitsplatzes. Eine Zuschauerin hat hier
keinen: Sie arbeitet nicht vor, ihr wird nichts zugewiesen, und
"Review" sagt ihr nichts.

UND JEDE DER SIEBEN ZAHLEN WAR EIN LINK auf aufgaben.html. Die
Rechtetabelle nennt dort "ALLE" -- was die Rolle der Community
ausdruecklich NICHT einschliesst. Nachgemessen: Ein Klick landet
wieder auf start.html. Sieben tote Knoepfe, und der Kommentar direkt
daneben sagt selbst: "Ein toter Knopf ist keine Antwort."

WORAN DIE ENTSCHEIDUNG HAENGT -- nicht an der Rolle. Rollennamen der
Community gehoeren nicht in eine Datei, die jeder herunterladen kann
(pruef-modi-wortleck wacht darueber, und ROLLENTEXT laesst sie aus
demselben Grund aus). Gefragt wird stattdessen nach etwas, das der
Server ohnehin beantwortet hat: Hat diese Person die Aufgaben-Kachel?
Er schickt nur, was jemand sehen darf. Keine zweite Wahrheit, kein
Rollenname -- und es bleibt richtig, wenn sich die Rechte aendern.

GEGENPROBE IM MESSWERKZEUG: ein zweiter Durchgang als DogFather auf
derselben Seite.
  DogFather : Block DA, 7 Links, "Vorarbeiten" ja
  Community : Block weg, 0 Links, keine Arbeitswoerter
Ohne diesen Durchgang saehe eine abgeschaffte Funktion genauso aus
wie eine, die richtig entscheidet.

Nebenbei: Die Startseite ist fuer die Community von 1436 auf 1231 px
geschrumpft.

Co-Authored-By: Claude Opus 5 <[email protected]>
This commit is contained in:
2026-09-18 21:30:23 +02:00
co-authored by Claude Opus 5
parent e128c169b9
commit 4f5ac04bc9
35 changed files with 526 additions and 403 deletions
+75
View File
@@ -201,6 +201,53 @@ await ctx.addCookies(kGast.split("; ").filter(Boolean).map((z) => {
return { name, value: rest.join("="), domain: "127.0.0.1", path: "/" };
}));
console.log("");
/* ---- ZUERST DIE STARTSEITE ---------------------------------------
Sie ist das Erste, was ein Mitglied sieht -- und der einzige Weg zu
den sieben Brettern. Bisher habe ich sie nie mit Gast-Augen
angesehen; gemessen wurden immer nur die Bretter selbst. */
{
await seite.goto(`${BASIS}/workspace/start.html`, { waitUntil: "networkidle" });
await seite.waitForTimeout(1600);
const z = await seite.evaluate(() => {
const kacheln = [...document.querySelectorAll(".kachel")];
return {
anzahl: kacheln.length,
namen: kacheln.map((k) => (k.querySelector(".kachel__name, h2, h3")?.textContent || "").trim()),
ohneUnterzeile: kacheln.filter((k) =>
!(k.querySelector(".kachel__unter, .kachel p")?.textContent || "").trim()).length,
hoehen: [...new Set(kacheln.map((k) => Math.round(k.getBoundingClientRect().height)))].length,
ueberschrift: document.querySelector("h1")?.textContent?.trim() || "",
seitenhoehe: document.body.scrollHeight,
aufgabenBlock: !document.getElementById("zahlen-block")?.hidden,
arbeitswoerter: [...document.body.innerText.matchAll(/Vorarbeiten|goenn dir was|gönn dir was|Betreut|Review|Abgebrochen/g)].map((m) => m[0]),
};
});
console.log("");
console.log("=== Die Startseite mit Gast-Augen ===");
console.log(` Ueberschrift: „${z.ueberschrift}"`);
console.log(` ${z.anzahl} Kacheln, ${z.hoehen} verschiedene Hoehen, ${z.ohneUnterzeile} ohne Unterzeile`);
console.log(` ${z.namen.join(" · ")}`);
console.log(` Seitenhoehe ${z.seitenhoehe} px · Aufgabenblock: ${z.aufgabenBlock ? "DA" : "weg"}`);
console.log(` Arbeitswoerter auf der Seite: ${z.arbeitswoerter.join(", ") || "(keine)"}`);
/* FUEHREN DIE ZAHLEN IRGENDWOHIN? Sieben Links auf aufgaben.html --
und die Rechtetabelle nennt dort „ALLE", was die Rolle „gast"
ausdruecklich NICHT einschliesst. Also nachsehen statt annehmen. */
const zahlenlinks = await seite.evaluate(() =>
[...document.querySelectorAll("#zahlen a")].map((a2) => a2.getAttribute("href")));
console.log(` Zahlen-Links: ${zahlenlinks.length}`);
if (zahlenlinks.length) {
const ziel = new URL(zahlenlinks[0], `${BASIS}/workspace/`).href;
const antwort = await seite.goto(ziel, { waitUntil: "domcontentloaded" });
console.log(` Klick auf die erste Zahl -> ${antwort.status()} ${seite.url().split("/").pop()}`);
await seite.goto(`${BASIS}/workspace/start.html`, { waitUntil: "networkidle" });
}
await seite.screenshot({
path: `C:/Users/qciga/AppData/Local/Temp/comm-start${BREITE < 700 ? "-handy" : ""}.png`,
fullPage: true });
}
console.log("");
console.log("=== Was ein Mitglied sieht ===");
for (const b of BRETTER) {
@@ -252,6 +299,34 @@ console.log(fehlerAufSeite.length
? `ACHTUNG: ${fehlerAufSeite.length} Konsolenfehler: ${fehlerAufSeite.slice(0, 3).join(" | ")}`
: "Keine Konsolenfehler.");
/* ---- GEGENPROBE: SIEHT DAS TEAM SEINEN ARBEITSPLATZ NOCH? --------
„Deine Aufgaben" verschwindet seit dem 18.09.2026 fuer alle, die
keine Aufgaben-Kachel haben. Die Gefahr dabei ist immer dieselbe:
dass es auch dort verschwindet, wo es hingehoert. Ohne diese
Messung saehe eine abgeschaffte Funktion genauso aus wie eine, die
richtig entscheidet. */
{
const ctx2 = await browser.newContext({ viewport: { width: BREITE, height: 1100 } });
const seite2 = await ctx2.newPage();
await seite2.goto(BASIS + "/workspace/", { waitUntil: "networkidle" });
await seite2.click('.rolle[data-rolle="admin"]');
await seite2.fill("#code", "CODE-DOGI-0001");
await seite2.click("button[type=submit]", { noWaitAfter: true });
await seite2.waitForURL("**/start.html", { timeout: 25000 });
await seite2.waitForTimeout(1600);
const z = await seite2.evaluate(() => ({
block: !document.getElementById("zahlen-block")?.hidden,
links: document.querySelectorAll("#zahlen a").length,
satz: document.body.innerText.includes("Vorarbeiten"),
}));
console.log("");
console.log("=== Gegenprobe: DogFather auf derselben Seite ===");
console.log(` Aufgabenblock: ${z.block ? "DA" : "FEHLT"} · Zahlen-Links: ${z.links}`
+ ` · „Vorarbeiten": ${z.satz ? "ja" : "nein"}`);
await ctx2.close();
}
await browser.close();
kind.kill();
try { rmSync(ordner, { recursive: true, force: true }); } catch { /* Rest */ }