Stufe 3: Die Wunschliste bekommt einen Rang und einen Weg

Aus dem Plan im Vault. Eine Wunschliste ohne sichtbare Erfuellung ist
ein Briefkasten ohne Postbote -- nach dem dritten unbeantworteten
Wunsch schreibt niemand mehr.

ZWEIMAL LAG MEIN PLAN DANEBEN, beide Male zu pessimistisch:
- Die Sortierung nach Stimmen GAB es schon, seit dem 11.09.
- Die Datenbank erlaubte 'angenommen' und 'abgelehnt' laengst in ihrer
  CHECK-Regel; nur die Pruefung im Server liess sie nicht durch. Die
  Tabelle war der Logik voraus.

Auch ein Plan von gestern Nacht ist eine Bestandsliste und altert.

WAS DAZUGEKOMMEN IST
- Vier Zustaende JE BEREICH statt zwei global: Offen -> Wird gemacht
  -> Gemacht, dazu "Diesmal nicht". Eine gemeinsame Liste haette
  "Diesmal nicht" auch an einem Schutzvorfall erlaubt, und dort
  bedeutet es nichts.
- Ein geplanter Tag dazu: "Wird gemacht" allein ist ein Versprechen,
  "Wird gemacht -- am 24.09." ist ein Termin.
- Der Rangbalken. Eine Rangfolge sieht man erst, wenn der ABSTAND
  sichtbar ist: 12 Stimmen neben 14 sehen sonst aus wie 1 neben 40.
  Fuer ein Vorleseprogramm spricht er in Worten.
- Entschiedenes rutscht nach unten, wird aber NICHT geloescht. Gerade
  der erfuellte Wunsch ist der Beweis, dass sich Schreiben lohnt.

"DIESMAL NICHT" IST DER WICHTIGSTE DER VIER, und es ist bewusst nicht
rot. Ein Nein ist eine Antwort, Schweigen ist keine -- aber wer ein
rotes Schild an seinem Wunsch sieht, schreibt keinen zweiten.

UND AUF DEM BILDSCHIRMFOTO STAND "WAS IHR EUCH WUENSCHT".
Die Umlaut-Pruefung von gestern Nacht sah es nicht: Sie kannte die
Kataloge und die festen Seitentexte, aber nicht die
Bereichseinstellungen, aus denen JEDE Ueberschrift und jede
Art-Beschriftung kommt. Sechs Stellen ("Fuer den Stream", "Wie es hier
laeuft", "Haeufige Frage", "Ich haette Lust" ...).

Gefunden hat sie kein Gedankengang, sondern ein Blick auf das fertige
Bild. Die Wortliste hatte ausserdem Loecher -- "wuensch" fehlte
schlicht; 23 Stuecke nachgetragen. pruef-deutsche-texte deckt jetzt
auch die 120 Beschriftungen der Bereiche ab (9 -> 12 Pruefungen), mit
einer Gegenprobe auf genau den Satz, der heute Morgen durchrutschte.

NEU: pruef-wunschliste (30 Pruefungen)
Der aelteste Wunsch bekommt die meisten Stimmen -- genau der Fall, der
eine Sortierung nach Datum entlarvt. Dazu: alle vier Zustaende setzen,
ein erfundener nicht, "abgelehnt" am Anschlagbrett ABGELEHNT, der
geplante Tag, die Balkenbreiten (100/33/0 %), und dass der gemachte
Wunsch weiter in der Liste steht -- nur nicht mehr oben.

pruef-countdown 22, pruef-treff 66, pruef-bereiche-lesend,
pruef-deutsche-texte 12: gruen.

Co-Authored-By: Claude Opus 5 <[email protected]>
This commit is contained in:
2026-09-17 11:28:37 +02:00
co-authored by Claude Opus 5
parent 77db1bcc2e
commit 7eec2edf3f
36 changed files with 933 additions and 367 deletions
+64 -8
View File
@@ -117,11 +117,39 @@ export const BEREICHE = {
wunsch: {
name: "Wunschliste",
ober: "Was ihr euch wuenscht",
ober: "Was ihr euch wünscht",
/* DER WEG EINES WUNSCHES (17.09.2026).
Bis heute kannte ein Eintrag zwei Zustaende: offen und erledigt.
Fuer eine Wunschliste ist das zu wenig -- und der Mangel ist
kein Schoenheitsfehler, sondern der Grund, warum solche Listen
sterben:
Eine Wunschliste ohne sichtbare Erfuellung ist ein Briefkasten
ohne Postbote. Nach dem dritten unbeantworteten Wunsch
schreibt niemand mehr.
"Diesmal nicht" gehoert ausdruecklich dazu. Ein Nein ist eine
Antwort; Schweigen ist keine. Wer sieht, dass entschieden wurde,
schreibt beim naechsten Mal wieder -- auch wenn die Entscheidung
gegen ihn ausfiel.
DIE DATENBANK KONNTE DAS SCHON. Ihre CHECK-Regel erlaubt seit
laengerem 'angenommen' und 'abgelehnt'; nur die Pruefung im
Server liess sie nicht durch. Die Tabelle war der Logik voraus. */
zustaende: {
offen: "Offen",
angenommen: "Wird gemacht",
erledigt: "Gemacht",
abgelehnt: "Diesmal nicht",
},
/* Dazu ein Datum: "Wird gemacht" allein ist ein Versprechen,
"Wird gemacht -- am 24.09." ist ein Termin. */
mitGeplant: true,
arten: {
stream: "Fuer den Stream",
stream: "Für den Stream",
technik: "Technik",
gemeinsam: "Fuer die Community",
gemeinsam: "Für die Community",
sonstiges: "Sonstiges",
},
bewertung: false,
@@ -152,14 +180,14 @@ export const BEREICHE = {
regeln: {
name: "Regeln & Hilfe",
ober: "Wie es hier laeuft",
ober: "Wie es hier läuft",
/* REGELN IN EINFACHER SPRACHE UND AN ECHTEN FAELLEN. Vage Regeln
erzeugen Grenzfaelle, und die muss dann jeder Modi einzeln
entscheiden -- das ist der Weg, auf dem ein Team uneinheitlich
wird und die Community es merkt. */
arten: {
regel: "Regel",
frage: "Haeufige Frage",
frage: "Häufige Frage",
hilfe: "Hilfe",
folge: "Was passiert, wenn",
},
@@ -182,7 +210,7 @@ export const BEREICHE = {
weil es stimmt -- und weil es die richtige Erwartung setzt. */
arten: {
gesucht: "Wir suchen",
lust: "Ich haette Lust",
lust: "Ich hätte Lust",
frage: "Frage dazu",
},
bewertung: false,
@@ -1072,7 +1100,18 @@ bereicheRouter.get("/workspace/api/bereich/:bereich", (req, res) => {
const reihenfolge = bereich === "anschlag"
? "angeheftet DESC, e.datum DESC, e.id DESC"
: bereich === "wunsch"
? "stimmen DESC, e.datum DESC, e.id DESC"
/* ENTSCHIEDENES NACH UNTEN -- ABER NICHT WEG (17.09.2026).
Die Sortierung nach Stimmen gibt es seit dem 11.09. Seit es
vier Zustaende gibt, reicht sie nicht mehr: Ein gemachter
Wunsch mit vielen Stimmen stuende dauerhaft ganz oben und
verdraengte die offenen, ueber die noch zu entscheiden ist.
Loeschen waere die falsche Antwort. Gerade der ERFUELLTE
Wunsch ist der Beweis, dass sich Schreiben lohnt -- er
gehoert gesehen, nur nicht an der ersten Stelle. */
? `CASE e.status WHEN 'offen' THEN 0 WHEN 'angenommen' THEN 0 ELSE 1 END,
stimmen DESC, e.datum DESC, e.id DESC`
: `CASE e.status WHEN 'offen' THEN 0 ELSE 1 END,
CASE e.dringlichkeit WHEN 'hoch' THEN 0 WHEN 'mittel' THEN 1 ELSE 2 END,
e.datum DESC, e.id DESC`;
@@ -1244,9 +1283,26 @@ function pruefe(bereich, körper, { neu }) {
else aus.uhrzeit = u;
}
if (körper.status !== undefined) {
if (!STATUS.includes(körper.status)) fehler.push("Unbekannter Status.");
/* JE BEREICH, NICHT GLOBAL (17.09.2026). Die Wunschliste kennt
vier Zustaende, alle anderen zwei. Eine gemeinsame Liste haette
"Diesmal nicht" auch an einem Schutzvorfall erlaubt -- und dort
bedeutet es nichts. */
const erlaubt = einstellung.zustaende
? Object.keys(einstellung.zustaende) : STATUS;
if (!erlaubt.includes(körper.status)) fehler.push("Unbekannter Status.");
else aus.status = körper.status;
}
/* DER GEPLANTE TERMIN eines Wunsches. Bisher gab es das Feld nur in
der Content-Planung; hier traegt es dieselbe Bedeutung und darf
deshalb dasselbe Format haben. Leer heisst "noch kein Termin" und
nicht "unveraendert". */
if (einstellung.mitGeplant && körper.geplant !== undefined) {
const g = String(körper.geplant ?? "").trim();
if (!g) aus.geplant = null;
else if (!/^\d{4}-\d{2}-\d{2}$/.test(g) || Number.isNaN(Date.parse(g))) {
fehler.push("Der geplante Tag ist ungültig.");
} else aus.geplant = g;
}
/* Bewertung und Dringlichkeit gibt es nur dort, wo der Bereich sie
vorsieht -- sonst werden sie stillschweigend verworfen. */
if (einstellung.bewertung && körper.bewertung !== undefined) {