From d85694bd92ab3ff3dc0f483b352aaece9509722d Mon Sep 17 00:00:00 2001 From: Dogfather Date: Thu, 24 Sep 2026 00:50:42 +0200 Subject: [PATCH] =?UTF-8?q?Keine=20fertigen=20Vorschl=C3=A4ge=20mehr=20bei?= =?UTF-8?q?=20den=20Highlights?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Filipe: "nimm die sachen da weg bitte. da sollen nur die sachen rein kommen die die modis, linke und rechte hand oder dogfather reinsetzen." In der Spalte "Noch einzusortieren" standen drei vorgefertigte Vorschlaege ("Was hier hingehoert", "Fanart von DogFather und Casper ist ausdruecklich erwuenscht", "Ein Ausschnitt, der auf die Clips soll"). Jemand hatte sie uebernommen, und danach standen sie zwischen den echten Clips -- mit Datum, mit Verfasser, aeusserlich nicht von einem echten Eintrag zu unterscheiden. WARUM DIESES BRETT ANDERS IST ALS DIE UEBRIGEN: Anderswo ist ein Vorschlag eine ANREGUNG, die man ausfuellt ("Der naechste Stream mit DogFather" -> Datum eintragen). Highlights ist eine SAMMLUNG echter Sachen. Ein vorgefertigter Text ist dort kein Anfang, sondern ein Platzhalter, der aussieht wie Inhalt. Die anderen Bretter behalten ihre Vorschlaege -- dazu hat er nichts gesagt. Nebenbefund: Seine Rollenaufzaehlung ist genau TREFF_TEAM_ROLLEN (modi, hand, linke, admin). Die Rechteregel stimmte also schon. ZWEI ECHTE MAENGEL FIELEN DABEI AUF, beide beim Versuch, die drei Eintraege wegzunehmen: 1. Der Knopf "loeschen" schickte DELETE OHNE GRUND. Der Server verlangt bei einem fremden Beitrag auf einem Treff-Brett einen (DSA Art. 17) und antwortet mit 400 -- die Oberflaeche zeigte nur "Loeschen hat nicht geklappt." Zwei Knoepfe nebeneinander, einer ging ("entfernen"), einer nicht, und die Meldung erklaerte nichts. Jetzt fragt auch "loeschen" nach dem Grund, wenn der Server einen braucht -- erkannt an `treffBrett` vom Server, nicht an einer abgeschriebenen Brettliste -- und die Fehlermeldung gibt wieder, was der Server gesagt hat. 2. Der Dialog liess DREI Zeichen als Grund durch, der Server verlangt ZEHN. Wer "spam" tippte, kam durch die Nachfrage und bekam danach eine Absage. `grund_min` steht seit dem 11.09. in /api/treff/lage und wurde nie benutzt; jetzt ist es angeschlossen. In nachfrage.js bestimmt der Aufrufer die Mindestlaenge (`grundMin`), Vorgabe bleibt 3 -- fuer alle anderen Nachfragen aendert sich nichts. UND ZWEI PRUEFUNGEN, DIE ROT WAREN, OHNE DASS ETWAS KAPUTT WAR: - pruef-treff-start verlangte `>= 8` Vorschlaege auf dem Schirm. Das stimmte bis zum Fenster-Umbau vom 20.09. -- seither kommen hoechstens VIER (FENSTER = 4). Vier Tage rot, ohne dass es jemand erfuhr. Gefragt wird jetzt der Server selbst. Und die Brettliste ["treff","anschlag","wunsch","highlight"] wird gegen den Bestand abgeglichen statt abgeschrieben -- mit ausdruecklichem Nachweis, dass Highlights keine mehr hat, damit das Wegfallen nicht einfach eine Pruefung weniger bedeutet. 41 -> 42 Pruefungen. - pruef-nachfrage zaehlte `installieren.js` als "diese Seite fragt nach", obwohl der Aufruf dort hinter `if (typeof window.frageNach === 'function')` steht. Weil die Datei auf fast jeder Seite liegt, wurde damit JEDE Seite zur fragenden -- fuenf rote Zeilen, kein einziger echter Mangel. Ausserdem wurde die Kurzschreibweise `{ titel, … }` als "ohne Titel" gemeldet. 46 -> 53 Pruefungen, alle gruen; zwei davon sind neu (Gegenprobe plus Benennung der Ausnahmen). Beide mit Gegenprobe (git stash) belegt: schon vor dieser Aenderung rot. Gemessen: 11 Messungen, 0 Befunde -- darunter die Gegenprobe, dass der alte Weg (DELETE ohne Grund) wirklich mit 400 gescheitert waere. Gruen: pruef-treff-start (42), pruef-nachfrage (53), pruef-highlights (31), pruef-anschlagbrett (12), pruef-css-klassen. Co-Authored-By: Claude Opus 5 --- server/pruef-nachfrage.mjs | 54 ++++++++++++++++++++++- server/pruef-treff-start.mjs | 75 +++++++++++++++++++++++++++++--- server/workspace-treff-start.js | 44 ++++++++++++------- workspace/anruf-probe.html | 10 ++--- workspace/app.webmanifest | 8 ++-- workspace/assets/js/bereich.js | 52 +++++++++++++++++++--- workspace/assets/js/nachfrage.js | 19 ++++++-- workspace/aufgaben.html | 38 ++++++++-------- workspace/automation.html | 32 +++++++------- workspace/befinden.html | 32 +++++++------- workspace/bereich.html | 44 +++++++++---------- workspace/bewerben.html | 36 +++++++-------- workspace/bewerbungen.html | 34 +++++++-------- workspace/calls.html | 34 +++++++-------- workspace/chat.html | 38 ++++++++-------- workspace/content.html | 34 +++++++-------- workspace/crew-index.html | 12 ++--- workspace/crew.webmanifest | 8 ++-- workspace/dateien.html | 34 +++++++-------- workspace/entwicklung.html | 34 +++++++-------- workspace/hilfe.html | 28 ++++++------ workspace/index.html | 10 ++--- workspace/kalender.html | 34 +++++++-------- workspace/leistung.html | 32 +++++++------- workspace/material.html | 32 +++++++------- workspace/personen.html | 32 +++++++------- workspace/profil.html | 36 +++++++-------- workspace/rechte.html | 32 +++++++------- workspace/report.html | 36 +++++++-------- workspace/scouting.html | 32 +++++++------- workspace/start.html | 32 +++++++------- workspace/startcheck.html | 34 +++++++-------- workspace/steckbrief.html | 36 +++++++-------- workspace/talente.html | 34 +++++++-------- workspace/team.html | 32 +++++++------- workspace/teamlage.html | 32 +++++++------- workspace/teilen.html | 28 ++++++------ workspace/treff-moderation.html | 30 ++++++------- workspace/treff-regeln.html | 30 ++++++------- workspace/uebersicht.html | 32 +++++++------- workspace/unsere-seiten.html | 28 ++++++------ workspace/werdegang.html | 30 ++++++------- workspace/willkommen.html | 30 ++++++------- workspace/wissen.html | 34 +++++++-------- 44 files changed, 800 insertions(+), 618 deletions(-) diff --git a/server/pruef-nachfrage.mjs b/server/pruef-nachfrage.mjs index 166483af..f9e12ae4 100644 --- a/server/pruef-nachfrage.mjs +++ b/server/pruef-nachfrage.mjs @@ -138,12 +138,55 @@ pruef("der Notnagel für alte Browser ist vorhanden", /** Welche Skripte rufen frageNach auf? OHNE die Datei, die es * DEFINIERT -- sonst ist die Antwort immer „alle". */ const nutzer = new Set(); +/* EIN AUFRUF HINTER EINER `typeof`-ABFRAGE IST KEINE PFLICHT + (24.09.2026 -- und die Pruefung war aus genau diesem Grund rot, + ohne dass etwas kaputt war). + + `installieren.js` liegt auf fast jeder Seite und ruft frageNach + auf -- aber ausdruecklich nur, wenn es da ist: + + if (typeof window.frageNach === 'function') { … } + + Der Kommentar daneben erklaert seit dem 22.09.2026 genau, warum: + Die Datei laeuft auch auf der Anmeldewand, wo nachfrage.js mit + Absicht nicht geladen wird. Die Pruefung zaehlte den Aufruf + trotzdem als "diese Seite fragt nach" -- und weil installieren.js + ueberall liegt, wurde damit JEDE Seite zur fragenden. Ergebnis: + fuenf rote Zeilen, kein einziger echter Mangel. + + EINE PRUEFUNG, DIE IMMER ROT IST, IST KEINE PRUEFUNG MEHR -- genau + wie eine Warnung, die immer kommt. Ab dem zweiten Mal liest man + sie weg, und dann auch die echte. + + Die Unterscheidung ist einfach und haelt: Wer vorher fragt, ob es + die Funktion gibt, kommt ohne sie aus. Wer sie einfach aufruft, + braucht sie. */ +const geschuetzt = (text) => + /typeof\s+window\.frageNach\s*===?\s*['"]function['"]/.test(text) + || /window\.frageNach\s*\?\./.test(text); +const freiwillig = new Set(); for (const f of skripte) { if (f === DER_NOTNAGEL) continue; - if (/\bfrageNach\s*\(/.test(ohneKommentare(lies(join(JS_ORDNER, f))))) nutzer.add(f); + const text = ohneKommentare(lies(join(JS_ORDNER, f))); + if (!/\bfrageNach\s*\(/.test(text)) continue; + if (geschuetzt(text)) { freiwillig.add(f); continue; } + nutzer.add(f); } pruef("es gibt überhaupt Seiten, die nachfragen", nutzer.size > 0, `gefunden: ${nutzer.size}`); +/* WAS HIER HERAUSFAELLT, WIRD BENANNT. Ein stilles Aussortieren + waere die bequeme Art, eine Pruefung gruen zu bekommen -- man + saehe dann nicht mehr, wie gross die Ausnahme geworden ist. */ +pruef("die geschützten Aufrufe sind benannt und wenige", + freiwillig.size <= 3, + `ohne Pflicht zur Datei (typeof-Abfrage davor): ${[...freiwillig].join(", ") || "keine"}`); +/* GEGENPROBE: Ein UNGESCHUETZTER Aufruf muss weiterhin zaehlen -- + sonst hiesse "alle angeschlossen" nur, dass die Regel niemanden + mehr erfasst. */ +pruef("Gegenprobe: ein ungeschützter Aufruf zählt weiterhin", + !geschuetzt("frageNach({ titel: 'x' });") + && geschuetzt("if (typeof window.frageNach === 'function') frageNach({});"), + `${nutzer.size} Dateien rufen ungeschützt auf`); const ohneDatei = [], totesGewicht = [], fragendeSeiten = []; let mitNutzung = 0; @@ -247,7 +290,14 @@ for (const f of skripte) { const code = ohneKommentare(lies(join(JS_ORDNER, f))); for (const a of aufrufe(code)) { gezaehlt++; - if (!/\btitel\s*:/.test(a)) ohneTitel.push(f); + /* AUCH DIE KURZSCHREIBWEISE ZAEHLT (24.09.2026). + Gesucht wurde nur `titel:`. In installieren.js steht aber + `frageNach({ titel, was: weg, … })` -- die Kurzform, die den + Titel aus einer gleichnamigen Variablen nimmt. Gueltiges JS, + gesetzter Titel, und trotzdem gemeldet. Eine Pruefung, die eine + richtige Schreibweise bemaengelt, bringt einem bei, ihre + Meldungen zu ignorieren. */ + if (!/\btitel\s*[:,}]/.test(a)) ohneTitel.push(f); if (!/\bwas\s*:/.test(a)) ohneWas.push(f); } } diff --git a/server/pruef-treff-start.mjs b/server/pruef-treff-start.mjs index 00ed37cb..28711b8b 100644 --- a/server/pruef-treff-start.mjs +++ b/server/pruef-treff-start.mjs @@ -169,17 +169,57 @@ melde("=== 1. Was bereitliegt ==="); `${mit} von ${alle.length} Texten nennen DogFather, seine Kanaele oder Casper ` + `(${Math.round(mit / alle.length * 100)} %)`); - /* UND DIE VIER BRETTER, DIE DIE COMMUNITY WIRKLICH SIEHT, ganz. - Auf dem Anschlagbrett, im Treff, in der Wunschliste und bei den - Highlights gibt es keinen Satz, der ohne ihn auskommt -- sie - handeln von seinen Streams. */ - for (const b of ["treff", "anschlag", "wunsch", "highlight"]) { + /* JEDES BRETT, DAS VORSCHLAEGE HAT, ganz -- sie handeln von + seinen Streams, und keiner kommt ohne ihn aus. + + DIE LISTE WIRD ABGELEITET, NICHT ABGESCHRIEBEN (24.09.2026). + Hier stand `["treff", "anschlag", "wunsch", "highlight"]`. Am + 24.09. fielen die Vorschlaege fuer Highlights weg (Filipe: "da + sollen nur die sachen rein kommen die die modis, linke und + rechte hand oder dogfather reinsetzen"), und die Pruefliste + wusste es nicht: Sie verlangte weiter Texte von einem Brett, + das keine mehr hat. Dieselbe Falle wie jede abgeschriebene + Liste in diesem Haus -- eine, die niemand pflegt, kann nicht + veralten. + + DASS ES UEBERHAUPT WELCHE GIBT, wird eine Zeile tiefer + geprueft. Sonst waere "alle geprueft" auch dann gruen, wenn + morgen gar kein Brett mehr Vorschlaege haette -- ein + uebersprungener Test beweist nichts. */ + /* DIE ABSICHT BLEIBT, DIE LISTE WIRD GEPRUEFT (berichtigt beim + zweiten Anlauf am 24.09.2026). + + Mein erster Versuch nahm einfach ALLE Bretter mit Vorschlaegen. + Das war bequem und falsch: "Regeln", "Mitmachen" und "Was + ansteht" haben zu Recht Saetze ohne seinen Namen ("Turnier", + "Schritt 2: Sag im Rudel, dass du Lust hast") -- fuer die gilt + die 60-%-Regel eine Zeile weiter oben, nicht diese hier. Die + Pruefung waere dadurch rot geworden, ohne dass etwas kaputt + war, und ich haette ihre Aussage veraendert statt ihre Liste zu + reparieren. + + Richtig ist die Schnittmenge: die Bretter, die die Community + sieht UND die ueberhaupt Vorschlaege haben. Faellt eines weg, + faellt es hier lautlos heraus -- deshalb steht direkt darunter, + WIE VIELE es sein muessen, und fuer Highlights ausdruecklich, + dass es keine mehr hat. */ + const GEMEINT = ["treff", "anschlag", "wunsch", "highlight"]; + const mitVorschlaegen = GEMEINT.filter((b) => (TREFF_START[b] || []).length > 0); + ok(mitVorschlaegen.length === 3, + `${mitVorschlaegen.length} der Bretter, die die Community sieht, haben ` + + `Vorschlaege (${mitVorschlaegen.join(", ")})`); + for (const b of mitVorschlaegen) { const liste = TREFF_START[b] || []; const ohne = liste.filter((v) => !BEZUG.test(`${v.titel} ${v.text}`)); ok(liste.length > 0 && ohne.length === 0, ohne.length ? `${b}: ohne Bezug -- "${ohne[0].titel}"` : `${b}: alle ${liste.length} Texte sind auf ihn bezogen`); } + /* UND HIGHLIGHTS HAT AUSDRUECKLICH KEINE MEHR. Ohne diese Zeile + wuerde das Wegfallen nur dazu fuehren, dass eine Pruefung + weniger laeuft -- und niemand merkte, wenn sie zurueckkaemen. */ + ok(!(TREFF_START.highlight || []).length, + "Highlights hat keine fertigen Vorschlaege (auf Ansage vom 24.09.2026)"); /* GEGENPROBE: Ein anonymer Text MUSS auffallen. Ohne sie hiesse "alle bezogen" nur, dass das Muster auf alles passt. */ @@ -333,7 +373,30 @@ melde("=== 6. Wie es aussieht ==="); alleKnopf: document.querySelector(".startkatalog__alle")?.textContent?.trim() || "", leer: document.querySelector(".leer-hinweis")?.textContent?.trim() || "", })); - ok(vorher.karten >= 8, `${vorher.karten} Vorschlaege stehen bereit`); + /* WIE VIELE STEHEN DA? NICHT EINE ZAHL VON GESTERN (24.09.2026). + + Hier stand `>= 8`. Das stimmte, bis am 20.09.2026 das Fenster + eingefuehrt wurde -- seither kommen HOECHSTENS VIER auf einmal + (FENSTER = 4 in workspace-bereiche.js), und die Pruefung war + vier Tage lang rot, ohne dass es jemandem gesagt wurde. Genau + die Sorte Zahl, vor der CLAUDE.md warnt: eine Rechnung von + gestern, die still falsch wird. + + Gefragt wird jetzt der Server selbst -- er weiss, wie viele er + schickt, und die Oberflaeche muss genau so viele zeichnen. + Zusaetzlich `> 0`, damit "gleich viele" nicht auch bei null + gruen ist. */ + const ausDerAntwort = await seite.evaluate(async () => { + const a = await fetch("/workspace/api/bereich/mitmachen/start?ab=0", + { credentials: "same-origin" }); + if (!a.ok) return null; + const j = await a.json(); + return { geschickt: (j.vorschlaege || []).length, vorrat: j.vorrat, offen: j.offen }; + }); + ok(!!ausDerAntwort && ausDerAntwort.geschickt > 0 + && vorher.karten === ausDerAntwort.geschickt, + `${vorher.karten} Vorschlaege stehen bereit -- genau so viele, wie der ` + + `Server schickt (${ausDerAntwort?.geschickt}), von ${ausDerAntwort?.offen} offenen`); ok(/Alle \d+ übernehmen/.test(vorher.alleKnopf), `mit einem Knopf ("${vorher.alleKnopf}")`); /* DER LEERTEXT IST DER DES BEREICHS, nicht der Einheitssatz. */ ok(vorher.leer.includes("dazugehören"), diff --git a/server/workspace-treff-start.js b/server/workspace-treff-start.js index 6e13a2b9..d2794b77 100644 --- a/server/workspace-treff-start.js +++ b/server/workspace-treff-start.js @@ -328,22 +328,36 @@ export const TREFF_START = { ], /* =================================================================== - HIGHLIGHTS — was hier hingehört + HIGHLIGHTS — HIER GIBT ES KEINE FERTIGEN VORSCHLÄGE MEHR + (24.09.2026) + + Filipe: „nimm die sachen da weg bitte. da sollen nur die sachen + rein kommen die die modis, linke und rechte hand oder dogfather + reinsetzen." + + Hier standen drei Vorschläge („Was hier hingehört", „Fanart von + DogFather und Casper ist ausdrücklich erwünscht", „Ein Ausschnitt, + der auf die Clips soll"). Jemand hat sie übernommen, und danach + standen sie zwischen den echten Clips — mit Datum, mit Verfasser, + äußerlich nicht von einem echten Eintrag zu unterscheiden. + + WARUM DAS BEI DIESEM BRETT ANDERS IST ALS BEI DEN ÜBRIGEN: Auf + den anderen Brettern ist ein Vorschlag eine ANREGUNG, die man + ausfüllt („Der nächste Stream mit DogFather" → Datum eintragen). + Highlights dagegen ist eine SAMMLUNG von echten Sachen — Clips, + Bilder, Fanart. Ein vorgefertigter Text ist dort kein Anfang, + sondern ein Platzhalter, der aussieht wie Inhalt. Die Erklärung, + was hierher gehört, steht ohnehin schon oben auf der Seite. + + Der Bereich fehlt in dieser Liste jetzt ganz. Das genügt: + `STARTKATALOG[bereich] || []` liefert eine leere Liste, der + Block bleibt unsichtbar, und ein POST beantwortet sich mit 404. + Eine leere Liste hier stehen zu lassen wäre dasselbe Ergebnis mit + einer Zeile mehr, an der man sich fragt, wozu sie da ist. + + Die anderen Bretter behalten ihre Vorschläge — dazu hat er + nichts gesagt, und dort tun sie das, wofür sie gedacht waren. =================================================================== */ - highlight: [ - { art: "moment", titel: "Was hier hingehört", - text: "Clips aus DogFathers Streams, Bilder, Zeichnungen, " - + "Bildschirmfotos von Momenten, die euch geblieben sind. Der erste " - + "darf ruhig wackelig sein — es geht nicht um Produktion, sondern um " - + "den Moment." }, - { art: "fanart", titel: "Fanart von DogFather und Casper ist ausdrücklich erwünscht", - text: "Gezeichnet, gebastelt, am Handy zusammengeschoben — egal. Schreib " - + "dazu, ob DogFather es im Stream zeigen darf." }, - { art: "clip", titel: "Ein Ausschnitt, der auf die Clips soll", - text: "Wenn dir eine Stelle auffällt, die als eigener Clip funktionieren " - + "würde: hier hinein, mit Zeitpunkt. So entsteht ein guter Teil von " - + "DogFather Clips." }, - ], /* =================================================================== WAS ANSTEHT — Vorlagen für Termine diff --git a/workspace/anruf-probe.html b/workspace/anruf-probe.html index 33fc6292..d130166c 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`. --> - - + + - +