diff --git a/server/pruef-vorschlaege.mjs b/server/pruef-vorschlaege.mjs index c76a0a0f..45422cc1 100644 --- a/server/pruef-vorschlaege.mjs +++ b/server/pruef-vorschlaege.mjs @@ -173,6 +173,90 @@ ok(/if \(daten\.mehr_da\)/.test(js), ok(/let katalogAb = 0;[\s\S]{0,200}async function startkatalogZeigen/.test(js), "der Merker steht AUSSERHALB der Funktion - sonst spraenge die Liste nach jedem Uebernehmen zurueck"); +/* ======================================================================= + WER ENTSCHEIDET -- steht der Satz ueberall, wo Vorschlaege sind? + ======================================================================= + + Filipe am 21.09.2026: "bei diesen vorschlägen ist sehr wichtig dass + immer wenn es um was geht was ich machen soll oder so dass immer + erwähnt wird dass ich immer am ende entscheide ob ich was mache oder + nicht. ich kann immer annehmen oder ablehnen. über all auf der + website soll dass bei den vorschlägen erwähnt werden." + + WARUM DAS EINE PRUEFUNG BRAUCHT: Ein Satz, den man an zwei Stellen + einbaut, ist beim naechsten Brett an einer davon vergessen. Und + gerade dieser faellt nicht auf, wenn er fehlt -- eine Seite ohne ihn + sieht vollkommen normal aus. Sie sieht nur nicht mehr wie ein + Vorschlag aus, sondern wie eine Zusage. + + ZWEI ORTE, EINE QUELLE: ueber den Vorschlagskarten (das Team sieht + sie beim Auswaehlen) und auf dem Brett selbst (dort liest die + Community, was daraus geworden ist). Beide holen denselben Text aus + VORSCHLAG_HINWEIS. + ======================================================================= */ +{ + const { VORSCHLAG_HINWEIS } = await import("./workspace-treff-start.js"); + + ok(/entscheidet/i.test(VORSCHLAG_HINWEIS) + && /ablehnen/i.test(VORSCHLAG_HINWEIS), + `der Satz sagt beides -- entscheiden UND ablehnen ("${VORSCHLAG_HINWEIS}")`); + + /* JEDES BRETT MIT VORSCHLAEGEN, nicht ein ausgewaehltes. Die Liste + kommt aus dem Katalog selbst; ein neues Brett ist damit + automatisch mitgeprueft, ohne dass es jemand hier eintraegt. */ + const { TREFF_START } = await import("./workspace-treff-start.js"); + const { ARBEIT_START } = await import("./workspace-arbeit-start.js").catch(() => ({})); + const ARBEIT_HAT = Object.keys(ARBEIT_START || {}); + const bretter = Object.keys(TREFF_START); + ok(bretter.length >= 3, `${bretter.length} Bretter haben Vorschlaege`); + + const ohneKarten = []; + const ohneBrett = []; + for (const b of bretter) { + const k = await hole(`/workspace/api/bereich/${b}/start?ab=0`); + if (k.status === 200 && k.daten?.hinweis !== VORSCHLAG_HINWEIS) ohneKarten.push(b); + const e = await hole(`/workspace/api/bereich/${b}`); + if (e.status === 200 && e.daten?.einstellung?.entscheidung !== VORSCHLAG_HINWEIS) { + ohneBrett.push(b); + } + } + ok(ohneKarten.length === 0, + ohneKarten.length ? `ueber den Karten fehlt er bei: ${ohneKarten.join(", ")}` + : `er steht ueber den Karten aller ${bretter.length} Bretter`); + ok(ohneBrett.length === 0, + ohneBrett.length ? `auf dem Brett fehlt er bei: ${ohneBrett.join(", ")}` + : "und auf jedem Brett selbst -- dort, wo die Community liest"); + + /* GEGENPROBE: Ein Brett OHNE Vorschlaege darf ihn NICHT tragen. Ein + Hinweis, der ueberall steht, wird nirgends gelesen -- und diese + Zeile beweist zugleich, dass die Pruefung darueber ueberhaupt + unterscheiden kann. */ + const { BEREICHE } = await import("./workspace-bereiche.js"); + const ohneKatalog = Object.keys(BEREICHE || {}) + .filter((b) => !bretter.includes(b) && !ARBEIT_HAT.includes(b)); + /* DRITTER AUSGANG: Gaebe es gar kein Brett ohne Vorschlaege, waere + diese Gegenprobe nicht durchfuehrbar -- und das ist kein "in + Ordnung", sondern "konnte nicht nachsehen". */ + if (!ohneKatalog.length) { + console.log(" -- Gegenprobe nicht moeglich: jedes Brett hat Vorschlaege"); + } else { + const ohne = await hole(`/workspace/api/bereich/${ohneKatalog[0]}`); + ok(ohne.status !== 200 || !ohne.daten?.einstellung?.entscheidung, + `Gegenprobe: "${ohneKatalog[0]}" hat keine Vorschlaege und traegt ihn nicht ` + + `(${ohne.status}, ${JSON.stringify(ohne.daten?.einstellung?.entscheidung)})`); + } + + /* Und die Oberflaeche zeigt ihn wirklich an -- ein Feld, das der + Server schickt und niemand rendert, ist kein Hinweis. */ + const seite = readFileSync(new URL("../workspace/bereich.html", import.meta.url), "utf8"); + ok(/id="brett-entscheidung"/.test(seite), + "die Brettseite hat den Platz dafuer"); + const js2 = readFileSync( + new URL("../workspace/assets/js/bereich.js", import.meta.url), "utf8"); + ok(/brett-entscheidung/.test(js2) && /startkatalog__entscheidung/.test(js2), + "und das Skript fuellt beide Stellen"); +} + console.log(`\n${fehler ? fehler + " FEHLER" : "Alles in Ordnung"} — ${geprueft} Prüfungen\n`); try { rmSync(ordner, { recursive: true, force: true }); } catch { /* egal */ } process.exit(fehler ? 1 : 0); diff --git a/server/workspace-bereiche.js b/server/workspace-bereiche.js index e7a20497..e7640f74 100644 --- a/server/workspace-bereiche.js +++ b/server/workspace-bereiche.js @@ -15,7 +15,7 @@ ===================================================================== */ import express from "express"; -import { TREFF_START } from "./workspace-treff-start.js"; +import { TREFF_START, VORSCHLAG_HINWEIS } from "./workspace-treff-start.js"; import { vorlagenFuer } from "./workspace-treff-vorlagen.js"; import { ARBEIT_START } from "./workspace-arbeit-start.js"; /* Wann ein Zettel einen Termin hat -- DIESELBE Regel, aus der auch der @@ -1491,8 +1491,33 @@ bereicheRouter.get("/workspace/api/bereich/:bereich", (req, res) => { const passend = meine.find((k) => String(k.ziel || "").split("?")[1] === "b=" + bereich); const ober = einstellung.ober || passend?.gruppe || null; + /* WER ENTSCHEIDET, STEHT AUF DEM BRETT SELBST (21.09.2026). + + Filipe: "immer wenn es um was geht was ich machen soll ... dass + ich immer am ende entscheide ob ich was mache oder nicht. ich + kann immer annehmen oder ablehnen. über all auf der website soll + dass bei den vorschlägen erwähnt werden." + + DIE VORSCHLAGSKARTEN SIEHT NUR DAS TEAM -- nachgemessen: Die + Community bekommt sie mit 404 gar nicht. Sie liest nur, was + daraus auf dem Brett landet: "Was soll DogFather im naechsten + Stream unbedingt machen?" Genau dort muss der Satz also stehen, + nicht nur ueber den Karten. + + WELCHE BRETTER IHN BEKOMMEN, WIRD ABGELEITET: genau die, fuer + die es ueberhaupt Vorschlaege gibt (`STARTKATALOG`). Eine + zweite Liste "Bretter mit Hinweis" waere die naechste, die + altert -- und wer ein Brett in den Katalog aufnimmt, denkt nicht + daran, es auch dort einzutragen. + + `null`, wo es keine Vorschlaege gibt: Auf einem Brett fuer + Termine oder Dateien waere der Satz sinnlos, und ein Hinweis, + der ueberall steht, wird nirgends gelesen. */ + const entscheidung = STARTKATALOG[bereich] ? VORSCHLAG_HINWEIS : null; + res.json({ - bereich, einstellung: { ...einstellung, ober }, treff: treffBrett, gehoert, weiter, + bereich, einstellung: { ...einstellung, ober, entscheidung }, + treff: treffBrett, gehoert, weiter, /* DARF DIESER MENSCH IN DEN KALENDER? Beantwortet von den zwei Stellen, die es entscheiden -- nicht von einer dritten Regel im Browser. Die Karte zeigt ihren Termin dann als Text statt @@ -1941,6 +1966,11 @@ bereicheRouter.get("/workspace/api/bereich/:bereich/start", (req, res) => { mehr_da: offeneListe.length > FENSTER, ab, vorrat: liste.length, + /* DER HINWEIS GEHT IMMER MIT (21.09.2026). Er kommt aus + workspace-treff-start.js, damit es ihn im ganzen Haus genau + einmal gibt -- und damit eine Pruefung ihn gegen die Quelle + halten kann statt gegen eine Abschrift. */ + hinweis: VORSCHLAG_HINWEIS, }); } catch (fehler) { console.error("[workspace] Startkatalog:", fehler?.message); diff --git a/server/workspace-treff-start.js b/server/workspace-treff-start.js index 26c15cde..44f18765 100644 --- a/server/workspace-treff-start.js +++ b/server/workspace-treff-start.js @@ -60,6 +60,38 @@ /** Ein Eintrag: { art, titel, text }. `art` muss zu den Arten des * Bereichs passen — pruef-treff-start rechnet das nach. */ +/* ===================================================================== + EIN VORSCHLAG IST EIN VORSCHLAG (21.09.2026) + + Filipe: "bei diesen vorschlägen ist sehr wichtig dass immer wenn es + um was geht was ich machen soll oder so dass immer erwähnt wird dass + ich immer am ende entscheide ob ich was mache oder nicht. ich kann + immer annehmen oder ablehnen. über all auf der website soll dass bei + den vorschlägen erwähnt werden." + + WARUM DAS MEHR IST ALS HOEFLICHKEIT: Auf den Karten stehen Saetze + wie "Was soll DogFather im naechsten Stream unbedingt machen?" oder + "Welches Spiel soll DogFather mal ausprobieren?". Wer so gefragt + wird, schreibt etwas hin -- und rechnet damit. Passiert es dann + nicht, sieht es aus wie ein gebrochenes Versprechen, obwohl nie + eines gegeben wurde. Der Satz verhindert genau diese Enttaeuschung, + und zwar VORHER. + + ER STEHT HIER UND NICHT IN DEN EINZELNEN TEXTEN. Es gibt ueber + dreissig Vorschlaege; dreissig Abschriften desselben Satzes waeren + dreissig Stellen, an denen er beim naechsten Mal fehlt oder anders + lautet. Der Server schickt ihn mit jeder Vorschlagsliste mit, die + Oberflaeche zeigt ihn einmal ueber den Karten. + + EINMAL UND NICHT AUF JEDER KARTE: Vier Karten nebeneinander mit + viermal demselben Satz liest niemand mehr -- und eine Warnung, die + immer kommt, ist keine Warnung mehr. Er steht deshalb gross ueber + dem Block, wo man ihn liest, bevor man die erste Karte antippt. + ===================================================================== */ +export const VORSCHLAG_HINWEIS = + "DogFather entscheidet am Ende selbst, was davon passiert — " + + "er kann jeden Vorschlag annehmen oder ablehnen."; + export const TREFF_START = { /* =================================================================== diff --git a/workspace/anruf-probe.html b/workspace/anruf-probe.html index 9c98c233..54a2b0ca 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`. --> - - + + - +