Stufe 8: Der Kreislauf -- ein Wunsch kommt als Clip zurueck

Bisher waren die acht Bretter acht Silos. Ein Wunsch wurde angenommen,
irgendwann passierte etwas im Stream, irgendwann lag ein Clip bei den
Highlights -- und nichts davon wusste voneinander. Wer den Wunsch
geschrieben hatte, erfuhr NIE, dass er erfuellt wurde.

    Wunsch  ->  Termin bei "Was ansteht"  ->  Clip bei "Highlights"

Das ist der Unterschied zwischen einem Briefkasten und einer Community.
Jemand schreibt einen Wunsch und sieht ihn vier Wochen spaeter als Clip
wieder -- mit seinem Namen daneben.

ZUM DRITTEN MAL LAG DER PLAN DANEBEN. Dort stand "`aus_eintrag_id`
gibt es in der Tabelle bereits". Gibt es -- an den AUFGABEN. Die
Eintraege hatten nichts dergleichen. Dreimal an einem Tag, und jedes
Mal hat es das Messen gefunden, nicht das Nachdenken.

EINE HANDLUNG, KEIN AUSWAHLFELD. Der Zusammenhang entsteht durch
"daraus wird ein Termin" -- als Knopf an dem Wunsch, um den es geht.
Wer ein Formular ausfuellt, denkt nicht an den Wunsch von letzter
Woche, und ein Auswahlfeld mit vierzig Eintraegen benutzt niemand.

Die Kette steht auf beiden Karten: "Aus Wunschliste: ... von Lena"
(ruhig, es ist Herkunft) und "Daraus wurde: Highlights ..." (gruen, das
ist die Nachricht, auf die jemand gewartet hat).

ON DELETE SET NULL, nicht CASCADE: Wird der Wunsch geloescht, bleibt
der Clip. Er ist ja trotzdem passiert.

UND DIE PRUEFUNG VON STUFE 2 HAT STUFE 5 ERWISCHT.
Der Startkatalog stand ueber dem Countdown und schob die Antwort auf
"wann ist der naechste Stream" von 458 px auf 1488 px -- aus dem
ersten Handybildschirm heraus. Gefunden hat das nicht das Auge,
sondern das Abnahmekriterium aus §7 des Plans, das seit heute Vormittag
in pruef-countdown steht.

  DIE REGEL DARAUS: Ein WERKZEUG (fuer das Team) draengt nie eine
  ANTWORT (fuer alle) nach unten.

Der Countdown steht jetzt ganz oben, noch vor den Filtern -- gemessen
342 px statt 458.

NEU: pruef-kreislauf (23 Pruefungen)
Lena schreibt einen Wunsch, daraus wird ein Termin, daraus ein
Highlight. Geprueft: Der Titel wandert mit, der NAME wandert mit, beide
Enden sehen die Kette, Lena sieht sie auch (ein Kreislauf, den nur das
Team sieht, ist keiner), zweimal derselbe Weg verdoppelt nichts -- und
die Gegenprobe, dass ein ANDERER Weg vom selben Wunsch sehr wohl geht.

Und wohin sie NICHT fuehrt: nicht in die Content-Planung eines
Creators. Dort steht Arbeit, die die Community nichts angeht.

pruef-countdown 22, pruef-treff-start 27, pruef-wunschliste 30,
pruef-galerie 26, pruef-treff 66, pruef-bremse 16, pruef-css-klassen:
alle gruen.

Co-Authored-By: Claude Opus 5 <[email protected]>
This commit is contained in:
2026-09-17 11:59:17 +02:00
co-authored by Claude Opus 5
parent 7701f5e5e5
commit b396e548ab
35 changed files with 883 additions and 361 deletions
+36
View File
@@ -951,3 +951,39 @@
margin: 0; flex: 1;
font-size: .84rem; line-height: 1.5; color: var(--text-leise);
}
/* =====================================================================
DIE KETTE (17.09.2026) — Stufe 8 des Plans
Bisher waren die acht Bretter acht Silos. Ein Wunsch wurde
angenommen, irgendwann passierte etwas im Stream, irgendwann lag ein
Clip bei den Highlights — und nichts davon wusste voneinander. Wer
den Wunsch geschrieben hatte, erfuhr nie, dass er erfüllt wurde.
ZWEI RICHTUNGEN, ZWEI TÖNE: Woher etwas kam, steht ruhig da — es ist
Herkunft, kein Ergebnis. Was daraus wurde, ist grün: Das ist die
Nachricht, auf die jemand gewartet hat.
KLEIN GEHALTEN. Die Kette erklärt den Eintrag, sie ersetzt ihn
nicht — eine Zeile, kein Kasten.
------------------------------------------------------------------- */
.kette {
--k-ton: #6f89a8;
display: flex; flex-wrap: wrap; align-items: baseline; gap: 4px 8px;
margin: 8px 0 0; padding: 6px 10px;
border-left: 2px solid color-mix(in srgb, var(--k-ton) 55%, transparent);
border-radius: 0 var(--radius-klein) var(--radius-klein) 0;
background: color-mix(in srgb, var(--k-ton) 8%, transparent);
font-size: .82rem;
}
/* „Daraus wurde" ist die gute Nachricht — sie darf als Einzige
auffallen. */
.kette--hin { --k-ton: #4dab77; }
.kette__wort {
font-weight: 650; letter-spacing: .02em;
color: color-mix(in srgb, var(--k-ton) 70%, #ffffff);
}
.kette__weg { color: var(--text); text-decoration: none; }
.kette__weg:hover { text-decoration: underline; }
.kette__wer { color: var(--text-still); }
+68
View File
@@ -53,6 +53,28 @@
den ABSTAND, nicht die absolute Zahl -- die steht ohnehin daneben. */
let maxStimmen = 0;
/* Wie ein Brett in einem Satz heisst. Kurz, weil es mitten in einer
Zeile steht: „Aus Wunschliste: …" liest sich, „Aus dem Bereich
Wunschliste (wunsch): …" nicht. */
const BRETT_WORT = {
anschlag: 'Anschlagbrett', ansteht: 'Was ansteht', treff: 'Treff',
wunsch: 'Wunschliste', highlight: 'Highlights', regeln: 'Regeln',
mitmachen: 'Mitmachen',
};
/* WELCHER WEG VON WO AUS SINN ERGIBT. Bewusst wenige: Ein Menü mit
sieben Zielen an jeder Karte waere ein Menü, kein Angebot. Was
hier steht, ist der Weg, den eine Sache im echten Betrieb nimmt. */
const KETTE_ZIELE = {
wunsch: [
{ nach: 'ansteht', wort: 'Daraus einen Termin machen' },
{ nach: 'highlight', wort: 'Daraus ein Highlight machen' },
],
ansteht: [{ nach: 'highlight', wort: 'Daraus ein Highlight machen' }],
treff: [{ nach: 'wunsch', wort: 'Daraus einen Wunsch machen' }],
highlight: [{ nach: 'anschlag', wort: 'Am Anschlagbrett zeigen' }],
};
const $ = (id) => document.getElementById(id);
const UNTERZEILE = {
live: 'Vorbereitung, Mitschrift und Auswertung – LIVE systematisch verbessern.',
@@ -366,6 +388,33 @@
k.append(kopf);
/* ---- DIE KETTE (17.09.2026), Stufe 8 des Plans -----------------
Woher kam das hier, und was ist daraus geworden? Beides steht
auf der Karte, nicht in einem Detail: Der Zusammenhang ist die
Aussage. Ein Clip, unter dem steht „Euer Wunsch — von Lena", ist
etwas anderes als ein Clip. */
if (e.aus) {
const z = el('p', 'kette kette--her');
z.append(el('span', 'kette__wort', 'Aus'));
const a = el('a', 'kette__weg',
`${BRETT_WORT[e.aus.bereich] || e.aus.bereich}: ${e.aus.titel}`);
a.href = `/workspace/bereich.html?b=${encodeURIComponent(e.aus.bereich)}`;
z.append(a);
if (e.aus.von_name) z.append(el('span', 'kette__wer', '· von ' + e.aus.von_name));
k.append(z);
}
if (Array.isArray(e.wurde) && e.wurde.length) {
const z = el('p', 'kette kette--hin');
z.append(el('span', 'kette__wort', 'Daraus wurde'));
for (const w of e.wurde) {
const a = el('a', 'kette__weg',
`${BRETT_WORT[w.bereich] || w.bereich}: ${w.titel}`);
a.href = `/workspace/bereich.html?b=${encodeURIComponent(w.bereich)}`;
z.append(a);
}
k.append(z);
}
/* DER RANGBALKEN. Eine Wunschliste ist eine Rangfolge, keine Liste
-- und eine Rangfolge sieht man erst, wenn der Abstand sichtbar
ist. Die Zahl allein beantwortet "wie viele", der Balken "wie
@@ -601,6 +650,25 @@
const knoepfe = el('div', 'eintrag-knoepfe');
/* ---- DER WEG WEITER ---------------------------------------------
Die Handlung, nicht ein Auswahlfeld: Wer ein Formular ausfuellt,
denkt nicht an den Wunsch von letzter Woche. Hier steht der Knopf
an dem Wunsch, um den es geht.
Schon gegangene Wege fallen weg -- ein Knopf, der beim zweiten
Druecken nichts tut, ist eine Sackgasse. */
for (const ziel of (KETTE_ZIELE[bereich] || [])) {
if ((e.wurde || []).some((w) => w.bereich === ziel.nach)) continue;
knoepfe.append(tuKnopf(ziel.wort, async () => {
const a = await hole(`/workspace/api/bereich/${bereich}/${e.id}/daraus`, {
method: 'POST', headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ nach: ziel.nach }),
});
if (!a.ok) { melde('Ging nicht.'); return; }
await laden();
}));
}
/* VIER ZUSTAENDE STATT EINES UMSCHALTERS (17.09.2026).
"erledigt / wieder offen" reicht fuer einen Vorfall. Ein Wunsch