Entwicklung: die Karte geht auf dem Zugetragenen auf

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 <[email protected]>
This commit is contained in:
2026-10-01 00:52:07 +02:00
co-authored by Claude Opus 5
parent 718b267de0
commit 09375047a7
49 changed files with 800 additions and 695 deletions
+4 -1
View File
@@ -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", () => {});
+76 -18
View File
@@ -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();
+16 -1
View File
@@ -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("=");