From 09375047a72b1a0d5fd0fe1811da2b180e3857ed Mon Sep 17 00:00:00 2001 From: Dogfather Date: Thu, 1 Oct 2026 00:52:07 +0200 Subject: [PATCH] Entwicklung: die Karte geht auf dem Zugetragenen auf MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Filipe, 01.10.2026: „mach alles los." Damit auch der offene Punkt von gestern: „Zugetragen" ist beim Aufmachen einer Karte die Vorgabe. DER ALTE EINWAND BLEIBT GUELTIG -- er steht jetzt in der Bedingung statt im Weg. Er lautete: „Ein Filter, der beim Öffnen schon etwas versteckt, lässt einen Punkte suchen, die gestern noch da waren." Richtig, und er trifft genau EINEN Fall: den, in dem gar nichts zugetragen ist. Dann zeigte „Zugetragen" eine LEERE Karte, und eine leere Karte sieht aus wie ein Fehler. Also: Hat dieser Mensch zugetragene Punkte, steht der Filter darauf. Hat er keine, steht er auf „Alle". Beides ist eine Auskunft, keines ist eine Suche. UND ER WIRD JE MENSCH NEU ENTSCHIEDEN. Bisher blieb der Filter ueber den Personenwechsel hinweg stehen -- richtig, solange er eine Erwartungsstufe meinte („wer Fortgeschritten gewaehlt hat, will das weiter sehen"). „Zugetragen" ist eine Aussage UEBER DIESE PERSON; sie mitzunehmen waere die falsche Frage. GEMESSEN, beide Faelle: Diene (2 zugetragen) -> Filter „Zugetragen", 2 Punkte VanVan (nichts) -> Filter „Alle", 68 Punkte ein Klick auf „Alle" -> wieder 68 Die Messung fragt jetzt, WAS DASTEHT, bevor jemand etwas anfasst. Vorher klickte sie auf den Filter und zaehlte nach -- seit er die Vorgabe ist, haette derselbe Klick ihn AUSgeschaltet. Sie haette das Gegenteil gemessen und trotzdem eine Zahl gemeldet. ZWEI NACHZUEGLER AUS DEM SICHT-WEG VON GESTERN `pruef-werdegang` wurde rot: „403 Forbidden" im Browser, ohne Adresse. Die Meldung sagte nicht, WORAN sie scheitert -- also sagt sie es jetzt (`403 /workspace/api/chat/sicht`). Die Ursache lag in der Messumgebung, nicht im Programm: Der HTTPS-Vorbau der Pruefung reicht den Host OHNE Port weiter, waehrend der Browser seine Herkunft MIT Port schickt. `gleicheHerkunft` vergleicht beides und antwortet folgerichtig 403. mess-reaktion macht es seit Langem richtig; zwei Dateien nicht. Aufgefallen ist es erst jetzt, weil der Sicht-Weg der erste zustandsaendernde POST ist, der auf JEDER Seite laeuft. Live stimmen Herkunft und Host ueberein (beide ohne Port, Caddy reicht den Host durch) -- nachgemessen. GEPRUEFT pruef-werdegang 103/0 (war 103/1), pruef-entwicklung 79/0, pruef-entwicklung-kacheln 34/0, mess-vanvan-karte ohne ein einziges ACHTUNG, pruef-zwischenspeicher 34/0. Co-Authored-By: Claude Opus 5 --- server/helfer-kachel-echtfarbe.mjs | 5 +- server/mess-vanvan-karte.mjs | 94 ++++++++++++++++++++++++------ server/pruef-werdegang.mjs | 17 +++++- workspace/anruf-probe.html | 10 ++-- workspace/app.webmanifest | 8 +-- workspace/assets/js/entwicklung.js | 39 +++++++++++-- workspace/aufgaben.html | 38 ++++++------ workspace/automation.html | 32 +++++----- workspace/befinden.html | 34 +++++------ workspace/bereich.html | 44 +++++++------- workspace/bewerben.html | 38 ++++++------ workspace/bewerbungen.html | 36 ++++++------ workspace/buehne.html | 6 +- workspace/calls.html | 34 +++++------ workspace/chat.html | 40 ++++++------- workspace/content.html | 34 +++++------ workspace/crew-index.html | 12 ++-- workspace/crew.webmanifest | 8 +-- workspace/dateien.html | 34 +++++------ workspace/entwicklung.html | 36 ++++++------ workspace/hilfe.html | 30 +++++----- workspace/index.html | 10 ++-- workspace/kalender.html | 34 +++++------ workspace/leistung.html | 32 +++++----- workspace/material.html | 32 +++++----- workspace/notizen.html | 28 ++++----- workspace/personen.html | 32 +++++----- workspace/profil.html | 36 ++++++------ workspace/reaktion.html | 38 ++++++------ workspace/rechte.html | 34 +++++------ workspace/report.html | 36 ++++++------ workspace/scouting.html | 32 +++++----- workspace/start.html | 32 +++++----- workspace/startcheck.html | 34 +++++------ workspace/steckbrief.html | 36 ++++++------ workspace/support.html | 28 ++++----- workspace/tafel.html | 6 +- workspace/talente.html | 36 ++++++------ workspace/team.html | 32 +++++----- workspace/teamlage.html | 34 +++++------ workspace/teilen.html | 30 +++++----- workspace/treff-moderation.html | 32 +++++----- workspace/treff-regeln.html | 32 +++++----- workspace/uebersicht.html | 32 +++++----- workspace/unsere-seiten.html | 30 +++++----- workspace/unterstuetzen.html | 32 +++++----- workspace/werdegang.html | 32 +++++----- workspace/willkommen.html | 30 +++++----- workspace/wissen.html | 34 +++++------ 49 files changed, 800 insertions(+), 695 deletions(-) diff --git a/server/helfer-kachel-echtfarbe.mjs b/server/helfer-kachel-echtfarbe.mjs index cad39a4e..4d8b44f9 100644 --- a/server/helfer-kachel-echtfarbe.mjs +++ b/server/helfer-kachel-echtfarbe.mjs @@ -150,7 +150,10 @@ export async function pruefeEchteFarben({ port = 4369, breite = 1500 } = {}) { (an, ab) => { const weiter = httpAnfrage({ host: "127.0.0.1", port, path: an.url, method: an.method, - headers: { ...an.headers, host: CREW }, + /* MIT PORT (01.10.2026) -- siehe pruef-werdegang: Ohne + ihn vergleicht `gleicheHerkunft` Herkunft und Host und + antwortet 403. */ + headers: { ...an.headers, host: `${CREW}:${HTTPS_PORT}` }, }, (antwort) => { ab.writeHead(antwort.statusCode, antwort.headers); antwort.pipe(ab); }); weiter.on("error", () => { try { ab.destroy(); } catch { /* Zugabe */ } }); an.on("error", () => {}); diff --git a/server/mess-vanvan-karte.mjs b/server/mess-vanvan-karte.mjs index caf7525f..b5401ab6 100644 --- a/server/mess-vanvan-karte.mjs +++ b/server/mess-vanvan-karte.mjs @@ -305,32 +305,90 @@ console.log("=== 4. Was VanVan an einem Punkt sieht ==="); await seite.screenshot({ path: "server/mess-vanvan-karte-leitung.png", fullPage: true }); console.log(" Bild: server/mess-vanvan-karte-leitung.png"); - /* ---- Und der Filter: grenzt er wirklich ein? ------------------ - Ohne diesen Griff hiesse „der Knopf ist da" nur, dass ein Knopf - da ist. */ - const nachFilter = await seite.evaluate(() => { + /* ---- WOMIT GEHT DIE KARTE AUF? (01.10.2026) ----------------- + + Filipe: „mach alles los" -- damit auch: „Zugetragen" ist die + Vorgabe, wenn es etwas zu zeigen gibt. + + VORHER KLICKTE DIESE MESSUNG AUF DEN FILTER und zaehlte nach. + Seit er beim Aufmachen schon steht, haette derselbe Klick ihn + AUSgeschaltet -- die Messung haette das Gegenteil gemessen und + trotzdem eine Zahl gemeldet. Genau die Sorte gruener Haken, die + nichts prueft. + + Gefragt wird deshalb, was DASTEHT, bevor jemand etwas anfasst. */ + const beimAufmachen = await seite.evaluate(() => { + const gedrueckt = [...document.querySelectorAll(".e-stufen__knopf")] + .find((k) => k.getAttribute("aria-pressed") === "true"); + return { + filter: gedrueckt?.querySelector(".e-stufen__name")?.textContent.trim() || null, + punkte: document.querySelectorAll(".e-punkt").length, + alleZugetragen: [...document.querySelectorAll(".e-punkt")] + .every((p) => p.dataset.zugetragen === "ja"), + }; + }); + console.log(` Beim Aufmachen steht der Filter auf „${beimAufmachen.filter}": ` + + `${beimAufmachen.punkte} Punkte, alle zugetragen=${beimAufmachen.alleZugetragen}`); + if (beimAufmachen.filter !== "Zugetragen" || beimAufmachen.punkte !== 2 + || !beimAufmachen.alleZugetragen) { + console.log(" ACHTUNG: Die Karte geht nicht auf dem Zugetragenen auf."); + } + + /* GEGENPROBE: „Alle" ist einen Klick entfernt und zeigt wieder alle + 68. Ohne sie hiesse „2 Punkte" womoeglich nur, dass es nicht + mehr gibt. */ + const zurueck = await seite.evaluate(() => { const k = [...document.querySelectorAll(".e-stufen__knopf")] - .find((x) => x.querySelector(".e-stufen__name")?.textContent.trim() === "Zugetragen"); + .find((x) => x.querySelector(".e-stufen__name")?.textContent.trim() === "Alle"); if (!k) return null; k.click(); return true; }); - if (nachFilter) { + if (zurueck) { await seite.waitForTimeout(1200); - const n = await seite.evaluate(() => ({ - punkte: document.querySelectorAll(".e-punkt").length, - alleZugetragen: [...document.querySelectorAll(".e-punkt")] - .every((p) => p.dataset.zugetragen === "ja"), - })); - console.log(` Nach „Zugetragen": ${n.punkte} Punkte, ` - + `alle zugetragen=${n.alleZugetragen}`); - if (n.punkte !== 2 || !n.alleZugetragen) { - console.log(" ACHTUNG: Der Filter grenzt nicht auf das Zugetragene ein."); + const alle = await seite.evaluate(() => document.querySelectorAll(".e-punkt").length); + console.log(` Nach „Alle": ${alle} Punkte`); + if (alle !== 68) { + console.log(` ACHTUNG: „Alle“ zeigt nicht mehr alle 68.`); } - await seite.screenshot({ path: "server/mess-vanvan-karte-filter.png", fullPage: true }); - console.log(" Bild: server/mess-vanvan-karte-filter.png"); } else { - console.log(` ACHTUNG: Den Knopf „Zugetragen“ gibt es nicht.`); + console.log(` ACHTUNG: Den Knopf „Alle“ gibt es nicht.`); + } + + await seite.screenshot({ path: "server/mess-vanvan-karte-filter.png", fullPage: true }); + console.log(" Bild: server/mess-vanvan-karte-filter.png"); + + /* ==== UND WER NICHTS ZUGETRAGEN HAT? (01.10.2026) ============== + + Das ist die Gegenprobe, die der alte Kommentar verlangt: „Ein + Filter, der beim Öffnen schon etwas versteckt, lässt einen + Punkte suchen, die gestern noch da waren." Bei einem Menschen + ohne zugetragene Punkte zeigte „Zugetragen" eine LEERE Karte -- + und eine leere Karte sieht aus wie ein Fehler. + + VanVan hat in diesem Aufbau nichts zugetragen bekommen; ihre + Karte muss deshalb auf „Alle" aufgehen. */ + const beiVanVan = await seite.evaluate(async () => { + const k = [...document.querySelectorAll("#personen .e-person")] + .find((x) => (x.querySelector(".e-person__name")?.textContent || "").includes("VanVan")); + if (!k) return null; + (k.querySelector("button, a") || k).click(); + await new Promise((r) => setTimeout(r, 2200)); + const gedrueckt = [...document.querySelectorAll(".e-stufen__knopf")] + .find((x) => x.getAttribute("aria-pressed") === "true"); + return { + filter: gedrueckt?.querySelector(".e-stufen__name")?.textContent.trim() || null, + punkte: document.querySelectorAll(".e-punkt").length, + }; + }); + if (!beiVanVan) { + console.log(" KONNTE NICHT NACHSEHEN: VanVans Kachel war nicht zu finden."); + } else { + console.log(` Bei jemandem OHNE Zugetragenes: Filter „${beiVanVan.filter}", ` + + `${beiVanVan.punkte} Punkte`); + if (beiVanVan.filter !== "Alle" || beiVanVan.punkte !== 68) { + console.log(" ACHTUNG: Wer nichts zugetragen hat, bekommt eine leere Karte."); + } } if (konsole.length) console.log(" KONSOLE:", konsole.slice(0, 3).join(" | ")); await kontext.close(); diff --git a/server/pruef-werdegang.mjs b/server/pruef-werdegang.mjs index 494e0ea4..34a7d7bd 100644 --- a/server/pruef-werdegang.mjs +++ b/server/pruef-werdegang.mjs @@ -636,7 +636,13 @@ melde("=== 11. Im Browser ==="); (von, an) => { const weiter = httpWeiter({ host: "127.0.0.1", port: PORT, path: von.url, method: von.method, - headers: { ...von.headers, host: CREW }, + /* MIT PORT (01.10.2026). Der Browser schickt seine + Herkunft als `https://crew...:PORT`; wer den Host hier + ohne Port weitergibt, laesst `gleicheHerkunft` die + beiden vergleichen und 403 antworten. So macht es + mess-reaktion seit Langem richtig -- gefunden hat es + der erste POST, der auf JEDER Seite laeuft. */ + headers: { ...von.headers, host: `${CREW}:${HTTPS_PORT}` }, }, (antwort) => { an.writeHead(antwort.statusCode, antwort.headers); antwort.pipe(an); }); weiter.on("error", () => { try { an.destroy(); } catch { /* Zugabe */ } }); von.on("error", () => {}); @@ -655,6 +661,15 @@ melde("=== 11. Im Browser ==="); const konsole = []; seite.on("console", (m) => { if (m.type() === "error" && !/favicon|ERR_/i.test(m.text())) konsole.push(m.text()); }); seite.on("pageerror", (e) => konsole.push("Absturz: " + e.message)); + /* WELCHE ADRESSE ES WAR (01.10.2026). „403 (Forbidden)" allein + nennt den Weg nicht -- und dann sucht man ihn im ganzen Haus. + Eine Meldung, die nicht sagt, WORAN sie scheitert, ist der + dritte Ausgang ohne Auskunft. */ + seite.on("response", (a) => { + if (a.status() >= 400 && !/favicon/i.test(a.url())) { + konsole.push(`${a.status()} ${a.url().replace(/^https?:\/\/[^/]+/, "")}`); + } + }); await kontext.addCookies(kDogi.split("; ").filter(Boolean).map((teil) => { const i = teil.indexOf("="); diff --git a/workspace/anruf-probe.html b/workspace/anruf-probe.html index f26386f1..982bbeb5 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`. --> - - + + - +