Ein Vorschlag ist ein Vorschlag -- DogFather entscheidet

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 <[email protected]>
This commit is contained in:
2026-09-21 13:41:06 +02:00
co-authored by Claude Opus 5
parent 2c2c42d4aa
commit a39d02da5a
42 changed files with 759 additions and 507 deletions
+84
View File
@@ -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);