From a39d02da5ac5f0d63527f75a4175ada0304c4d3d Mon Sep 17 00:00:00 2001 From: Dogfather Date: Mon, 21 Sep 2026 13:41:06 +0200 Subject: [PATCH] Ein Vorschlag ist ein Vorschlag -- DogFather entscheidet MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 vorher, statt sie hinterher zu erklaeren. GEMESSEN, BEVOR GEBAUT WURDE -- und die Messung hat den Auftrag groesser gemacht: Die Vorschlagskarten sieht NUR das Team. Die Community bekommt sie mit 404 gar nicht; sie liest nur, was daraus auf dem Brett landet. Ein Satz allein ueber den Karten haette also genau die Leute nicht erreicht, um die es geht. Deshalb steht er jetzt an ZWEI Stellen, aus EINER Quelle: - ueber den Vorschlagskarten (das Team beim Auswaehlen) - auf dem Brett selbst, unter der Ueberschrift (die Community beim Lesen) WELCHE BRETTER IHN TRAGEN, WIRD ABGELEITET: genau die, fuer die es ueberhaupt Vorschlaege gibt. Eine zweite Liste "Bretter mit Hinweis" waere die naechste, die altert -- wer ein Brett in den Katalog aufnimmt, denkt nicht daran, es auch dort einzutragen. Auf einem Brett fuer Termine oder Dateien steht er nicht: Ein Hinweis, der ueberall steht, wird nirgends gelesen. EINMAL UND NICHT AUF JEDER KARTE. Vier Karten nebeneinander mit viermal demselben Satz liest niemand mehr. Er steht ueber dem Block, wo man ihn liest, bevor man die erste antippt. Der Text selbst steht an genau einer Stelle im Haus (VORSCHLAG_HINWEIS), und pruef-vorschlaege haelt beide Anzeigeorte dagegen -- mit Gegenprobe, dass ein Brett ohne Vorschlaege ihn NICHT traegt. pruef-vorschlaege: 28 Pruefungen, 0 Fehler (war 21) Co-Authored-By: Claude Opus 5 --- server/pruef-vorschlaege.mjs | 84 ++++++++++++++++++++++++++++++++ server/workspace-bereiche.js | 34 ++++++++++++- server/workspace-treff-start.js | 32 ++++++++++++ workspace/anruf-probe.html | 8 +-- workspace/app.webmanifest | 8 +-- workspace/assets/css/bereich.css | 46 +++++++++++++++++ workspace/assets/js/bereich.js | 45 +++++++++++++++++ workspace/aufgaben.html | 30 ++++++------ workspace/automation.html | 30 ++++++------ workspace/befinden.html | 28 +++++------ workspace/bereich.html | 53 ++++++++++++-------- workspace/bewerben.html | 34 ++++++------- workspace/bewerbungen.html | 32 ++++++------ workspace/calls.html | 32 ++++++------ workspace/chat.html | 34 ++++++------- workspace/content.html | 32 ++++++------ workspace/crew-index.html | 10 ++-- workspace/crew.webmanifest | 8 +-- workspace/dateien.html | 32 ++++++------ workspace/entwicklung.html | 28 +++++------ workspace/hilfe.html | 26 +++++----- workspace/index.html | 8 +-- workspace/kalender.html | 32 ++++++------ workspace/leistung.html | 30 ++++++------ workspace/personen.html | 30 ++++++------ workspace/profil.html | 34 ++++++------- workspace/rechte.html | 28 +++++------ workspace/report.html | 32 ++++++------ workspace/scouting.html | 30 ++++++------ workspace/start.html | 28 +++++------ workspace/startcheck.html | 32 ++++++------ workspace/steckbrief.html | 34 ++++++------- workspace/talente.html | 30 ++++++------ workspace/team.html | 28 +++++------ workspace/teamlage.html | 28 +++++------ workspace/teilen.html | 26 +++++----- workspace/treff-moderation.html | 28 +++++------ workspace/treff-regeln.html | 28 +++++------ workspace/uebersicht.html | 30 ++++++------ workspace/unsere-seiten.html | 24 ++++----- workspace/werdegang.html | 28 +++++------ workspace/wissen.html | 32 ++++++------ 42 files changed, 759 insertions(+), 507 deletions(-) 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`. --> - - + + - +