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`. -->
-
-
+
+
-
+