VanVan im Support, Meldung #6, zweite Haelfte -- der Rest, der heute frueh ausdruecklich offen stehen blieb: „Bei den Vorlagen laesst sich weder die Frist anpassen noch ‚dauerhaft' einstellen, und eine Anmerkung fehlt auch." EIN ZWEITER KNOPF, NICHT EIN FENSTER FUER ALLE „An alle" verteilt zwoelf Aufgaben mit einem Druck. Haette jedes Uebernehmen jetzt ein Fenster geoeffnet, waere der haeufige Weg langsamer geworden, um den seltenen moeglich zu machen. Neben „Uebernehmen" steht deshalb „Anpassen …" -- an den Creator-Vorlagen und am Katalog, aus derselben Funktion. DAS FENSTER IST DAS DES HAUSES `frageNach` kann seit heute ein DATUM und einen HAKEN, die Anmerkung konnte es als `grund` schon. Ein eigener kleiner Dialog in vorlagenbrett.js waere der zweite im Haus gewesen -- und der, in dem beim naechsten Mal Esc, Fokusfalle oder der Abbruch fehlen. Beide Felder sind standardmaessig aus; fuer die dreissig anderen Aufrufe aendert sich nichts. DREI ENTSCHEIDUNGEN, DIE NICHT NAHELIEGEND WAREN 1. DIE ANMERKUNG WIRD EINE NOTIZ (`aufgaben_notizen`), kein Anhang an der Beschreibung. Sie traegt damit, von wem sie stammt, und die Aufgabe zeigt sie ohnehin an. In die Beschreibung geschrieben waere sie von der Vorlage nicht mehr zu unterscheiden -- und dieselbe Vorlage haette beim naechsten Mal einen anderen Text. 2. EINE DAUERHAFTE AUFGABE BEKOMMT KEINE FRIST, auch wenn eine mitgeschickt wird. Sie waere ab dem naechsten Tag fuer immer ueberfaellig, und eine Warnung, die immer kommt, ist keine mehr. Dieselbe Regel steht seit Langem im Aenderungsweg; haette sie hier gefehlt, gaebe es zwei Antworten auf dieselbe Frage. Im Fenster wird das Datum deshalb GRAU, sobald der Haken sitzt -- ein Datum, das dasteht und nicht gilt, ist schlimmer als keins. 3. „DAUERHAFT" DARF NUR, WER VERTEILEN DARF. Eine dauerhafte Aufgabe laesst sich nicht abhaken (Commit von heute frueh); wer sie sich selbst anlegen koennte, haette etwas, das er nie wieder loswird. Der Haken fehlt deshalb im Fenster eines Creators -- und abgelehnt wird trotzdem am Server, nicht nur ausgeblendet. EIN FUND, DEN DIE PRUEFUNG GEMACHT HAT `Number(tage) || 7` -- die Untergrenze des Datumsfeldes lag dadurch sieben Tage in der Zukunft statt heute, weil Null in JavaScript unwahr ist. Die VORGABE („in 1 Tag") lag damit UNTER der erlaubten Grenze: Wer das Fenster oeffnete und einfach „Uebernehmen" drueckte, bekam eine Absage. `Number.isFinite` fragt, ob eine Zahl da ist, und nicht, ob sie wahr ist -- derselbe Unterschied wie bei `kill -0`. NEBENBEI BEHOBEN: Ein gerades Anfuehrungszeichen in einem deutschen Fehlersatz (gemeldet von pruef-struktur). GEPRUEFT pruef-aufgaben-vorlagen 46 -> 60 ok eigene Frist kommt an (und die Vorlage saehe 5 Tage vor -- die Angabe hat also wirklich gewirkt), Anmerkung wird woertlich zur Notiz mit Namen, ohne Angabe bleibt alles wie bisher, Scout 403 und es entsteht auch nichts, DogFather 200 und KEINE Frist, „morgen" 400, der 45.13. 400, Vergangenheit 400, und als Gegenprobe dieselbe Vorlage ohne Frist 200. Im Browser: der Knopf, das Fenster, die Vorgabe, kein Haken fuer einen Creator, die Aufgabe traegt danach genau die eingetragene Frist samt Notiz -- und Abbrechen legt nichts an. pruef-nachfrage 74 -> 89 ok Datum mit Vorgabe und Untergrenze, Haken 44 px hoch mit 22-px- Kaestchen (nicht ueber die ganze Zeile), Sperre und Gegenprobe, beide Schranken fuer ein zu fruehes Datum einzeln. pruef-struktur 102 · pruef-css-klassen · pruef-modi-katalog 150 · pruef-aufgabenbrett · pruef-vorlagen 24 · pruef-bewerbung-aufgaben 164 · pruef-zuteilung NUR DAS AGENTURHAUS. Vorlagenbrett und Aufgaben liegen unter `/workspace`; am Crew-Haus aendert sich keine Zeile. Co-Authored-By: Claude Opus 5 <[email protected]>
2935 lines
210 KiB
JavaScript
2935 lines
210 KiB
JavaScript
/* =====================================================================
|
||
workspace-vorlagen.js — fertige Inhalte, die man übernehmen kann.
|
||
|
||
Der Wunsch vom 01.09.2026, an fünf Stellen gleichlautend: "ich will
|
||
dass da schon fertige Sachen stehen". Eine leere Seite mit einem
|
||
Knopf "Neuer Eintrag" verlangt vom Creator genau das, was er noch
|
||
nicht kann — zu wissen, was überhaupt hineingehört.
|
||
|
||
WARUM VORLAGEN UND KEINE VORAUSGEFÜLLTEN DATEN.
|
||
Man könnte beim Anlegen eines Creators dreißig Einträge in seine
|
||
Datenbank schreiben. Das wäre falsch:
|
||
* Sie wären ab dem ersten Tag "seine" Einträge -- und damit
|
||
Altlast, sobald sich etwas ändert.
|
||
* Ändert Filipe später eine Formulierung, gilt sie nur für neue
|
||
Creator. Die alten behalten die alte für immer.
|
||
* Und die Liste sähe voll aus, obwohl noch nichts geschehen ist --
|
||
genau das Gegenteil einer ehrlichen Übersicht.
|
||
|
||
Vorlagen bleiben deshalb VORSCHLÄGE, bis jemand sie übernimmt. Sie
|
||
stehen im Code, gelten für alle sofort, und werden erst dann zu Daten,
|
||
wenn sie tatsächlich gebraucht werden. Wer sie übernimmt, bekommt
|
||
einen ganz normalen Eintrag, den er ändern und löschen kann.
|
||
|
||
FACHLICHE GRUNDLAGE der Inhalte:
|
||
* Die ersten ein bis drei Sekunden eines Kurzvideos entscheiden über
|
||
die Verbreitung -- deshalb hat jede Content-Vorlage einen Hook,
|
||
und zwar als eigenes Feld.
|
||
* Ein LIVE steht und fällt mit dem, was VOR der Sendung passiert.
|
||
Deshalb sind die Vorbereitungspunkte die längste Liste.
|
||
* Was während der Sendung auffällt, ist am nächsten Tag vergessen.
|
||
Deshalb gibt es Punkte für "während LIVE", die man in Sekunden
|
||
anklicken kann, statt sie zu tippen.
|
||
* 70/20/10: etwa 70 % Inhalte mit Wert, 20 % Community, 10 %
|
||
Eigenwerbung. Die Content-Vorlagen sind danach verteilt.
|
||
===================================================================== */
|
||
|
||
import express from "express";
|
||
import {
|
||
db,
|
||
sitzungLesen,
|
||
istLeitung,
|
||
darfCreator,
|
||
protokolliere,
|
||
echteIp,
|
||
kategorienFuer,
|
||
termineSichtbar,
|
||
MODI_KATEGORIEN,
|
||
MODI_STUFEN,
|
||
entscheidetUeberAufgaben,
|
||
darfAufgabenVerteilen,
|
||
/* Fuer die Absagen-Uebersicht (30.09.2026): Wer den Menschen gar
|
||
nicht sehen darf, sieht auch nicht, dass ihm abgesagt wurde.
|
||
Ohne diese Zeile erfuehre die Agentur ueber eine Uebersicht,
|
||
dass es Team Dogi gibt. */
|
||
darfSchreibenMit,
|
||
KATALOG_EMPFAENGER,
|
||
KATALOG_EMPFAENGER_SQL,
|
||
heuteLokal,
|
||
} from "./workspace.js";
|
||
|
||
/* Dieselbe Meldung wie beim anderen Bewerbungsweg -- eine Stelle,
|
||
damit dieselbe Person nicht zweimal etwas Verschiedenes ueber
|
||
denselben Vorgang liest. */
|
||
import {
|
||
meldeBewerbung, meldeBewerbungsantwort,
|
||
} from "./workspace-bewerbung-melden.js";
|
||
|
||
export const vorlagenRouter = express.Router();
|
||
|
||
const jetzt = () => new Date().toISOString();
|
||
|
||
/* Welche Bereiche haben Punktelisten? Eine Zuordnung statt drei
|
||
Sonderfaellen im Code. */
|
||
const BEREICH_PUNKTE = {};
|
||
|
||
/* =====================================================================
|
||
CONTENT-IDEEN
|
||
|
||
Jede Vorlage bringt mit, was ein Video braucht, bevor man es dreht:
|
||
einen Aufhänger, ein Format und die Säule, zu der es gehört. Der
|
||
Aufhänger ist ausformuliert, nicht beschrieben -- "mach was
|
||
Persönliches" hilft niemandem, "Das hätte ich am Anfang gern gewusst"
|
||
kann man sagen.
|
||
===================================================================== */
|
||
|
||
export const CONTENT_IDEEN = [
|
||
/* ---- Wert (70 %) ---------------------------------------------------- */
|
||
{ schluessel: "das-haette-ich-am-anfang-gern-gewusst", titel: "Das hätte ich am Anfang gern gewusst",
|
||
hook: "„Ich hab drei Monate gebraucht, um das zu kapieren – du brauchst 30 Sekunden.“",
|
||
format: "Talking Head", saeule: "Wert", stufe: "anfaenger",
|
||
text: "Ein Fehler, den du selbst gemacht hast, und was du heute anders machst. "
|
||
+ "Konkret bleiben: ein Fehler, eine Lösung. Wer drei Dinge sagt, sagt nichts." },
|
||
{ schluessel: "mein-setup-fuer-unter-100", titel: "Mein Setup für unter 100 €",
|
||
hook: "„Alle sagen, du brauchst teure Technik. Hier ist meins für 87 Euro.“",
|
||
format: "Zeigen & Erklären", saeule: "Wert", stufe: "anfaenger",
|
||
text: "Was du wirklich benutzt, mit Preisen. Ehrlich sein, wo es hakt – "
|
||
+ "das ist der Teil, den niemand sonst zeigt." },
|
||
{ schluessel: "drei-einstellungen-die-sofort-was-bringe", titel: "Drei Einstellungen, die sofort was bringen",
|
||
hook: "„Wenn dein Stream unscharf aussieht, liegt es an einer davon.“",
|
||
format: "Bildschirmaufnahme", saeule: "Wert", stufe: "fort",
|
||
text: "Nicht mehr als drei. Jede in unter 15 Sekunden erklärt, mit Vorher/Nachher." },
|
||
{ schluessel: "was-ich-in-einer-woche-gelernt-habe", titel: "Was ich in einer Woche gelernt habe",
|
||
hook: "„Sieben Tage, eine Erkenntnis – die hier hat alles verändert.“",
|
||
format: "Talking Head", saeule: "Wert", stufe: "anfaenger",
|
||
text: "Rückblick auf eine echte Woche. Funktioniert nur mit einer konkreten Zahl "
|
||
+ "oder einem konkreten Moment." },
|
||
{ schluessel: "antwort-auf-die-frage-die-immer-kommt", titel: "Antwort auf die Frage, die immer kommt",
|
||
hook: "„Das werde ich jeden Tag gefragt – hier einmal in Ruhe.“",
|
||
format: "Talking Head", saeule: "Wert", stufe: "fort",
|
||
text: "Aus dem Chat sammeln, welche Frage sich wiederholt. Die Antwort einmal "
|
||
+ "gut aufnehmen und immer wieder verwenden." },
|
||
{ schluessel: "so-bereite-ich-einen-stream-vor", titel: "So bereite ich einen Stream vor",
|
||
hook: "„Zwei Stunden vor LIVE mache ich immer dasselbe.“",
|
||
format: "Vlog", saeule: "Wert", stufe: "fort",
|
||
text: "Der Ablauf hinter der Sendung. Zeigt Verlässlichkeit und gibt Anfängern "
|
||
+ "eine Vorlage." },
|
||
{ schluessel: "fehler-die-ich-bei-anderen-sehe", titel: "Fehler, die ich bei anderen sehe",
|
||
hook: "„Bitte mach das nicht – ich sehe es jeden Tag.“",
|
||
format: "Talking Head", saeule: "Wert", stufe: "profi",
|
||
text: "Niemanden bloßstellen. Das Verhalten beschreiben, nicht die Person." },
|
||
|
||
/* ---- Community (20 %) ------------------------------------------------ */
|
||
{ schluessel: "der-beste-moment-aus-dem-letzten-live", titel: "Der beste Moment aus dem letzten LIVE",
|
||
hook: "„Das ist gestern passiert, und ich rede immer noch davon.“",
|
||
format: "Zusammenschnitt", saeule: "Community", stufe: "anfaenger",
|
||
text: "Ein Ausschnitt, keine Zusammenfassung. Wer alles zeigt, zeigt nichts." },
|
||
{ schluessel: "ich-beantworte-eure-kommentare", titel: "Ich beantworte eure Kommentare",
|
||
hook: "„Ihr habt gefragt – jetzt rede ich.“",
|
||
format: "Talking Head", saeule: "Community", stufe: "anfaenger",
|
||
text: "Drei bis fünf echte Kommentare, sichtbar eingeblendet. Auch die kritischen." },
|
||
{ schluessel: "danke-an-die-die-immer-da-sind", titel: "Danke an die, die immer da sind",
|
||
hook: "„Ihr seid seit dem ersten Stream dabei. Das hier ist für euch.“",
|
||
format: "Talking Head", saeule: "Community", stufe: "fort",
|
||
text: "Namen nennen, wenn die Leute einverstanden sind. Sonst allgemein bleiben – "
|
||
+ "aber ehrlich." },
|
||
{ schluessel: "eine-entscheidung-bei-der-ihr-mitredet", titel: "Eine Entscheidung, bei der ihr mitredet",
|
||
hook: "„Ich kann mich nicht entscheiden. Ihr habt 24 Stunden.“",
|
||
format: "Umfrage", saeule: "Community", stufe: "fort",
|
||
text: "Echte Wahl, keine Scheinfrage. Das Ergebnis danach auch wirklich umsetzen." },
|
||
|
||
/* ---- Eigenwerbung (10 %) --------------------------------------------- */
|
||
{ schluessel: "wann-und-wo-ich-streame", titel: "Wann und wo ich streame",
|
||
hook: "„Immer dienstags und donnerstags – und ich fange pünktlich an.“",
|
||
format: "Kurzclip", saeule: "Eigenwerbung", stufe: "anfaenger",
|
||
text: "Fester Sendeplan als eigener Clip. Wiederholbar, sobald sich etwas ändert." },
|
||
{ schluessel: "was-diese-woche-ansteht", titel: "Was diese Woche ansteht",
|
||
hook: "„Drei Sachen, und eine davon habe ich noch nie gemacht.“",
|
||
format: "Kurzclip", saeule: "Eigenwerbung", stufe: "anfaenger",
|
||
text: "Vorschau auf die Woche. Kurz halten, sonst wird es eine Ankündigung "
|
||
+ "statt einer Einladung." },
|
||
/* ---- Aus der Recherche vom 09.09.2026 -------------------------------
|
||
Filipe: "informier dich wirklich seeeehr krass ... hol das beste vom
|
||
besten." Diese fuenfzehn Vorlagen sind der Ertrag daraus. Was sie von
|
||
den ersten dreizehn unterscheidet: Sie haengen an einer NACHPRUEFBAREN
|
||
Beobachtung, nicht an einer Meinung.
|
||
|
||
Die wichtigsten Belege, die dahinterstehen:
|
||
- Ueber 70 Prozent der Zuschauer entscheiden in den ersten zwei bis
|
||
drei Sekunden, ob sie bleiben. Plattformen messen inzwischen
|
||
ausdruecklich die "Intro-Retention".
|
||
- Ein Ankuendigungsvideo 30 bis 60 Minuten vor dem LIVE buendelt den
|
||
Start -- und ein voller Start zieht neue Zuschauer nach.
|
||
- Die besten Kurzformate 2026 sind: Haken-zuerst-Erklaerung,
|
||
nummerierte Liste, Vorher/Nachher, POV-Geschichte, Vergleich.
|
||
- Wiederkehr schlaegt Spitzenwert: Eine Zahl, die man nicht
|
||
faelschen kann.
|
||
-------------------------------------------------------------------- */
|
||
|
||
/* ---- Wert (70 %) ---- */
|
||
{ schluessel: "vorher-nachher-an-meinem-kanal", titel: "Vorher / Nachher an meinem Kanal",
|
||
hook: "„So sah mein Stream vor drei Monaten aus. Und so heute.“",
|
||
format: "Vorher / Nachher", saeule: "Wert", stufe: "anfaenger",
|
||
text: "Zwei Ausschnitte nebeneinander, dazwischen die eine Sache, die du geändert hast. "
|
||
+ "Das Format funktioniert, weil der Zuschauer den Unterschied SIEHT und nicht glauben muss." },
|
||
{ schluessel: "drei-sachen-die-dir-keiner-sagt", titel: "Drei Sachen, die dir keiner sagt",
|
||
hook: "„Drei Sachen über Streaming, die dir keiner sagt – die dritte hat mich am meisten gekostet.“",
|
||
format: "Nummerierte Liste", saeule: "Wert", stufe: "fort",
|
||
text: "Eine Zahl im Aufhänger verspricht ein Ende – deshalb bleiben Leute dran. "
|
||
+ "Die stärkste Nummer kommt zuletzt, und sie wird im Aufhänger angekündigt." },
|
||
{ schluessel: "ich-teste-was-alle-empfehlen", titel: "Ich teste, was alle empfehlen",
|
||
hook: "„Jeder empfiehlt das. Ich habe es zwei Wochen gemacht – hier ist das Ergebnis.“",
|
||
format: "Selbstversuch", saeule: "Wert", stufe: "fort",
|
||
text: "Ein verbreiteter Ratschlag, von dir selbst überprüft, mit Zahlen davor und danach. "
|
||
+ "Widerspruch zieht Aufmerksamkeit – aber nur, wenn du wirklich getestet hast." },
|
||
{ schluessel: "so-lese-ich-meine-zahlen", titel: "So lese ich meine Zahlen",
|
||
hook: "„Diese eine Zahl sagt mir mehr als die Zuschauerzahl.“",
|
||
format: "Bildschirm & Erklären", saeule: "Wert", stufe: "profi",
|
||
text: "Zeig deine eigene Auswertung: durchschnittliche Verweildauer, Anteil neuer Zuschauer, "
|
||
+ "Wiederkehrer. Erklär, was du daraufhin geändert hast. Wenige machen das – deshalb wirkt es." },
|
||
{ schluessel: "die-erste-sekunde-entscheidet", titel: "Die erste Sekunde entscheidet",
|
||
hook: "„Sag das in Sekunde eins – oder der Zuschauer ist weg.“",
|
||
format: "Zerlegung", saeule: "Wert", stufe: "profi",
|
||
text: "Nimm ein eigenes Video auseinander: Was hast du in Sekunde eins gesagt, was würdest du "
|
||
+ "heute sagen? Über 70 Prozent entscheiden in den ersten drei Sekunden. Zeig beides." },
|
||
{ schluessel: "mein-ablauf-als-vorlage", titel: "Mein Ablauf als Vorlage zum Mitnehmen",
|
||
hook: "„Hier ist der Ablauf, nach dem ich jeden Stream fahre. Nimm ihn.“",
|
||
format: "Zeigen & Weitergeben", saeule: "Wert", stufe: "meister",
|
||
text: "Etwas herzugeben, das bei dir funktioniert, kostet nichts und bringt Vertrauen. "
|
||
+ "Meisterschaft zeigt sich daran, dass es auch ohne dich funktioniert." },
|
||
{ schluessel: "was-hundert-streams-mir-beigebracht-h", titel: "Was hundert Streams mir beigebracht haben",
|
||
hook: "„Hundert Streams. Drei Sachen sind übrig geblieben.“",
|
||
format: "Rückblick", saeule: "Wert", stufe: "meister",
|
||
text: "Kein Best-of, sondern das, was du heute anders machst als am Anfang. "
|
||
+ "Wer lange dabei ist, hat den einen Vorteil, den niemand abkürzen kann." },
|
||
|
||
/* ---- Community (20 %) ---- */
|
||
{ schluessel: "ein-insider-den-nur-ihr-versteht", titel: "Ein Insider, den nur ihr versteht",
|
||
hook: "„Wenn du weißt, was das bedeutet, bist du schon länger dabei.“",
|
||
format: "Kurzclip", saeule: "Community", stufe: "anfaenger",
|
||
text: "Ein Spruch, ein Emote, ein Moment aus dem Stream. Wer ihn versteht, fühlt sich zugehörig – "
|
||
+ "und wer nicht, will dazugehören. Beides hilft." },
|
||
{ schluessel: "eure-clips-mein-kommentar", titel: "Eure Clips, mein Kommentar",
|
||
hook: "„Ihr habt das aufgenommen. Ich sag euch, was da wirklich los war.“",
|
||
format: "Reaction", saeule: "Community", stufe: "fort",
|
||
text: "Clips, die Zuschauer selbst geschnitten haben, mit deinem Kommentar. "
|
||
+ "Das belohnt die, die mitmachen – und wer belohnt wird, macht weiter." },
|
||
{ schluessel: "die-regel-die-ihr-euch-gewuenscht-hab", titel: "Die Regel, die ihr euch gewünscht habt",
|
||
hook: "„Ihr habt gefragt, ich habe es geändert. Ab heute gilt:“",
|
||
format: "Talking Head", saeule: "Community", stufe: "profi",
|
||
text: "Eine Änderung, die aus der Community kam, mit Nennung derer, die sie angestoßen haben. "
|
||
+ "Mitreden zu dürfen ist der stärkste Grund zu bleiben." },
|
||
{ schluessel: "wir-machen-das-zusammen", titel: "Wir machen das zusammen",
|
||
hook: "„Wenn wir das diese Woche schaffen, mache ich Folgendes:“",
|
||
format: "Gemeinsames Ziel", saeule: "Community", stufe: "profi",
|
||
text: "Ein Ziel mit Frist und einer Belohnung, die du wirklich einlöst. "
|
||
+ "Ein Versprechen, das nicht gehalten wird, kostet mehr als es gebracht hat." },
|
||
{ schluessel: "mein-moderator-stellt-sich-vor", titel: "Mein Moderator stellt sich vor",
|
||
hook: "„Ihr kennt den Namen. Hier ist der Mensch dahinter.“",
|
||
format: "Interview", saeule: "Community", stufe: "meister",
|
||
text: "Wer im Chat für Ordnung sorgt, bekommt ein Gesicht. Das schützt ihn – "
|
||
+ "gegen einen Namen schimpft man leichter als gegen einen Menschen." },
|
||
|
||
/* ---- Eigenwerbung (10 %) ---- */
|
||
{ schluessel: "dreissig-minuten-vorher", titel: "30 Minuten vorher",
|
||
hook: "„In einer halben Stunde geht es los – und heute passiert Folgendes:“",
|
||
format: "Ankündigung", saeule: "Eigenwerbung", stufe: "anfaenger",
|
||
text: "Ein kurzes Video 30 bis 60 Minuten vor dem Start. Es bündelt die, die ohnehin kommen "
|
||
+ "wollten – und ein voller Start zieht neue Zuschauer nach. Eine Sache nennen, nicht drei." },
|
||
{ schluessel: "warum-ich-heute-live-gehe", titel: "Warum ich heute live gehe",
|
||
hook: "„Heute ist ein Grund da, und der ist nicht ‚weil Dienstag ist‘.“",
|
||
format: "Talking Head", saeule: "Eigenwerbung", stufe: "fort",
|
||
text: "Ein Anlass macht aus einem Termin ein Ereignis. Auch ein kleiner reicht: "
|
||
+ "ein neues Spiel, ein Gast, eine offene Frage von letzter Woche." },
|
||
{ schluessel: "mein-kanal-in-fuenfzehn-sekunden", titel: "Mein Kanal in fünfzehn Sekunden",
|
||
hook: "„Fünfzehn Sekunden, dann weißt du, ob das hier für dich ist.“",
|
||
format: "Kurzvorstellung", saeule: "Eigenwerbung", stufe: "profi",
|
||
text: "Für wen, worum, wann. Fest angeheftet, damit neue Zuschauer nicht raten müssen. "
|
||
+ "Alle paar Monate neu drehen – ein Kanal von vor einem Jahr bist du nicht mehr." },
|
||
|
||
|
||
/* ===== PROFI UND MEISTER, AUSGEBAUT (09.09.2026) ===================
|
||
Filipe: "ich will dass die 2 kategorien profi und meister überall
|
||
noch mehr perfektionniert werden ... die müssen richtig krass sein"
|
||
|
||
Gezählt: 10 Ideen für Anfänger, 9 für Fortgeschrittene, 6 für Profi
|
||
und 3 für Meister. Wer am weitesten ist, hatte am wenigsten zur
|
||
Auswahl -- und das ist genau der Rang, in dem man Jahre verbringt.
|
||
|
||
Die neuen Ideen sind bewusst NICHT nur schwierigere Versionen der
|
||
alten. Auf den oberen Stufen ändert sich die Art der Idee: Es geht
|
||
nicht mehr um das eigene Können, sondern um Zahlen, Verfahren,
|
||
andere Menschen und darum, etwas weiterzugeben. ============== */
|
||
{ schluessel: "meine-zahlen-offen-gezeigt", titel: "Meine Zahlen offen gezeigt",
|
||
hook: "„Das hier ist mein echter Monat. Ohne Schönfärberei.“",
|
||
format: "Bildschirm & Erklären", saeule: "Wert", stufe: "profi",
|
||
text: "Reichweite, Verweildauer, Einnahmen. Wer Zahlen zeigt, wird geglaubt -- und niemand sonst tut es." },
|
||
{ schluessel: "dasselbe-video-zwei-anfaenge", titel: "Dasselbe Video, zwei Anfänge",
|
||
hook: "„Gleicher Inhalt, anderer Einstieg. Rate, welcher gewonnen hat.“",
|
||
format: "Vorher / Nachher", saeule: "Wert", stufe: "profi",
|
||
text: "Ein echter Vergleich mit nur einem Unterschied. Das ist der einzige Weg, eine Frage wirklich zu beantworten." },
|
||
{ schluessel: "was-ich-abgesagt-habe", titel: "Was ich abgesagt habe und warum",
|
||
hook: "„Ich habe diese Woche zwei Anfragen abgelehnt. Hier ist der Grund.“",
|
||
format: "Talking Head", saeule: "Wert", stufe: "profi",
|
||
text: "Nein sagen zu können ist ein Ausweis von Stand. Und es zeigt anderen, dass man es darf." },
|
||
{ schluessel: "mein-schlechtester-monat", titel: "Mein schlechtester Monat",
|
||
hook: "„Der Monat, in dem alles fiel. Was ich daraus gelernt habe.“",
|
||
format: "Rückblick", saeule: "Wert", stufe: "profi",
|
||
text: "Ein ehrlicher Tiefpunkt bringt mehr Vertrauen als zehn gute Nachrichten. Aber nur, wenn eine Erkenntnis darin steht." },
|
||
{ schluessel: "stream-in-fuenf-minuten", titel: "Vier Stunden in fünf Minuten",
|
||
hook: "„Der ganze Abend, auf fünf Minuten eingedampft.“",
|
||
format: "Zusammenschnitt", saeule: "Eigenwerbung", stufe: "profi",
|
||
text: "Für alle, die nicht live dabei waren. Ein guter Zusammenschnitt bringt mehr neue Zuschauer als jede Ankündigung." },
|
||
{ schluessel: "ich-analysiere-meinen-eigenen-clip", titel: "Ich zerlege meinen eigenen Clip",
|
||
hook: "„Dieser Clip lief. Ich zeige euch Sekunde für Sekunde, warum.“",
|
||
format: "Zerlegung", saeule: "Wert", stufe: "profi",
|
||
text: "Am eigenen Material erklärt, mit den echten Zahlen daneben. Fremde Beispiele kann jeder zeigen." },
|
||
{ schluessel: "werkzeuge-die-ich-wirklich-nutze", titel: "Die Werkzeuge, die ich wirklich benutze",
|
||
hook: "„Kein Sponsoring. Nur das, was seit einem Jahr offen ist.“",
|
||
format: "Zeigen & Erklären", saeule: "Wert", stufe: "profi",
|
||
text: "Ehrlich heißt auch: sagen, was man wieder abgeschafft hat. Eine reine Empfehlungsliste glaubt niemand." },
|
||
{ schluessel: "eine-woche-anders-gemacht", titel: "Eine Woche lang alles anders gemacht",
|
||
hook: "„Sieben Tage, eine geänderte Regel. Das ist dabei herausgekommen.“",
|
||
format: "Selbstversuch", saeule: "Wert", stufe: "profi",
|
||
text: "Ein Versuch mit Anfang, Ende und Ergebnis. Nicht ein Vorsatz, sondern eine Messung." },
|
||
{ schluessel: "ich-begleite-einen-anfaenger", titel: "Ich begleite einen Anfänger",
|
||
hook: "„Vier Wochen, ein Kanal von null. Wir zeigen alles.“",
|
||
format: "Vlog", saeule: "Community", stufe: "meister",
|
||
text: "Eine Reihe statt eines Videos. Wer jemanden sichtbar besser macht, beweist sein Können ohne ein Wort darüber." },
|
||
{ schluessel: "mein-team-arbeitet-hier", titel: "Mein Team arbeitet hier",
|
||
hook: "„Ihr seht mich. Hier sind die vier, die ihr nicht seht.“",
|
||
format: "Zeigen & Erklären", saeule: "Community", stufe: "meister",
|
||
text: "Moderation, Schnitt, Betreuung. Wer die Arbeit dahinter zeigt, macht aus einem Kanal einen Betrieb." },
|
||
{ schluessel: "mein-jahr-in-zahlen", titel: "Mein Jahr in Zahlen",
|
||
hook: "„Zwölf Monate, vier Zahlen, eine Entscheidung.“",
|
||
format: "Bildschirm & Erklären", saeule: "Wert", stufe: "meister",
|
||
text: "Einmal im Jahr die ganze Rechnung offenlegen -- auch die Kosten. Das traut sich fast niemand, und genau deshalb wirkt es." },
|
||
{ schluessel: "was-ich-heute-anders-baue", titel: "Was ich heute anders aufbauen würde",
|
||
hook: "„Wenn ich morgen bei null anfangen müsste: diese Reihenfolge.“",
|
||
format: "Nummerierte Liste", saeule: "Wert", stufe: "meister",
|
||
text: "Die Abkürzung, die man selbst nicht hatte. Das ist das Wertvollste, was Erfahrung hergibt." },
|
||
{ schluessel: "gespraech-mit-jemandem-groesser", titel: "Gespräch mit jemandem, der weiter ist",
|
||
hook: "„Ich habe jemanden gefragt, der zehnmal so groß ist.“",
|
||
format: "Interview", saeule: "Wert", stufe: "meister",
|
||
text: "Nicht um Reichweite zu leihen, sondern um eine Frage zu stellen, die man wirklich hat." },
|
||
{ schluessel: "mein-verfahren-zum-mitnehmen", titel: "Mein Verfahren zum Mitnehmen",
|
||
hook: "„Meine Vorlage, meine Liste, mein Ablauf. Kostenlos, hier.“",
|
||
format: "Zeigen & Weitergeben", saeule: "Wert", stufe: "meister",
|
||
text: "Etwas herzugeben, das wirklich funktioniert. Wer es nachbaut, kommt wieder -- und erzählt davon." },
|
||
{ schluessel: "fehler-der-mich-am-meisten-kostete", titel: "Der Fehler, der mich am meisten gekostet hat",
|
||
hook: "„Diese eine Entscheidung hat mich ein halbes Jahr gekostet.“",
|
||
format: "Talking Head", saeule: "Wert", stufe: "meister",
|
||
text: "Konkret, mit Zahl, ohne Ausrede. Wer den teuersten eigenen Fehler benennt, wird beim Rest auch geglaubt." },
|
||
{ schluessel: "wie-ich-nein-sage", titel: "Wie ich Anfragen prüfe, bevor ich zusage",
|
||
hook: "„Drei Fragen. Wer sie nicht beantwortet, bekommt keine Zusage.“",
|
||
format: "Nummerierte Liste", saeule: "Wert", stufe: "meister",
|
||
text: "Ein Prüfverfahren statt eines Bauchgefühls. Für alle nützlich, die gerade ihre erste Anfrage bekommen." },
|
||
{ schluessel: "was-nach-mir-bleibt", titel: "Was weiterläuft, wenn ich zwei Wochen weg bin",
|
||
hook: "„Ich war zwei Wochen weg. Der Kanal lief trotzdem.“",
|
||
format: "Zeigen & Erklären", saeule: "Wert", stufe: "meister",
|
||
text: "Der ehrlichste Beweis für einen aufgebauten Betrieb. Und die beste Werbung für ein Team." },
|
||
{ schluessel: "gemeinsames-jahresziel", titel: "Ein Jahresziel, das wir zusammen erreichen",
|
||
hook: "„Ein Ziel. Zwölf Monate. Wir alle zusammen.“",
|
||
format: "Gemeinsames Ziel", saeule: "Community", stufe: "meister",
|
||
text: "Nicht eine Zahl für dich, sondern eine für die Gemeinschaft -- mit sichtbarem Stand. Wer mitzählt, bleibt." },
|
||
|
||
/* ===== NACHGEZOGEN: COMMUNITY UND EIGENWERBUNG (09.09.2026) ========
|
||
Der erste Ausbau hat Profi und Meister verdoppelt -- aber fast nur
|
||
in der Saeule "Wert". Nach Saeulen gezaehlt stand danach:
|
||
|
||
Wert 10 Profi / 9 Meister
|
||
Community 2 / 4
|
||
Eigenwerbung 2 / 0
|
||
|
||
Aufgefallen ist das nicht beim Schreiben, sondern der neuen Regel
|
||
in pruef-checkliste: Profi und Meister duerfen in KEINER Gruppe
|
||
duenner sein als Fortgeschritten. Ohne die Pruefung je Gruppe
|
||
haette die Gesamtsumme (14 zu 13 zu 9) tadellos ausgesehen -- eine
|
||
Summe deckt eine leere Ecke zuverlaessig zu. ================== */
|
||
{ schluessel: "umfrage-die-etwas-aendert", titel: "Eine Umfrage, deren Ergebnis wirklich gilt",
|
||
hook: "„Ihr entscheidet. Und zwar verbindlich, nicht als Meinungsbild.“",
|
||
format: "Umfrage", saeule: "Community", stufe: "profi",
|
||
text: "Vorher sagen, dass das Ergebnis umgesetzt wird -- und es dann tun. Eine Umfrage ohne Folgen fragt man nur einmal." },
|
||
{ schluessel: "die-fragen-die-immer-kommen", titel: "Die Fragen, die immer wiederkommen",
|
||
hook: "„Diese fünf Fragen kommen in jedem Stream. Einmal in Ruhe beantwortet.“",
|
||
format: "Nummerierte Liste", saeule: "Community", stufe: "profi",
|
||
text: "Aus der Mitschrift der letzten Wochen. Spart in jedem weiteren Stream Zeit und zeigt, dass zugehört wird." },
|
||
{ schluessel: "zuschauer-uebernimmt-die-fuehrung", titel: "Ein Zuschauer übernimmt die Führung",
|
||
hook: "„Heute bestimmt einer von euch, was passiert.“",
|
||
format: "Selbstversuch", saeule: "Community", stufe: "profi",
|
||
text: "Abgeben ist ein Vertrauensbeweis in beide Richtungen. Vorher Grenzen absprechen, damit es nicht kippt." },
|
||
{ schluessel: "gemeinsam-ein-zwischenziel", titel: "Gemeinsam ein Zwischenziel erreichen",
|
||
hook: "„Noch 200. Dann machen wir das, was wir versprochen haben.“",
|
||
format: "Gemeinsames Ziel", saeule: "Community", stufe: "profi",
|
||
text: "Ein sichtbarer Stand und eine eingelöste Zusage. Ein Ziel ohne sichtbaren Fortschritt zählt niemand mit." },
|
||
{ schluessel: "communitytag-mit-eigenen-beitraegen", titel: "Ein Tag, an dem die Community sendet",
|
||
hook: "„Heute macht ihr das Programm. Ich sitze daneben.“",
|
||
format: "Vlog", saeule: "Community", stufe: "meister",
|
||
text: "Beiträge von Mitgliedern, angekündigt und vorbereitet. Wer einmal auf dem Kanal war, gehört ab da wirklich dazu." },
|
||
{ schluessel: "wie-man-bei-uns-moderator-wird", titel: "Wie man bei uns Moderator wird",
|
||
hook: "„Der Weg ist beschrieben. Hier ist er.“",
|
||
format: "Zeigen & Erklären", saeule: "Community", stufe: "meister",
|
||
text: "Offen zu sagen, wie jemand in das Team kommt, nimmt den Verdacht der Günstlingswirtschaft -- und bringt Bewerbungen." },
|
||
{ schluessel: "rueckblick-auf-unsere-regeln", titel: "Warum unsere Regeln so sind, wie sie sind",
|
||
hook: "„Jede dieser Regeln hat einen Anlass. Ich erzähle sie.“",
|
||
format: "Talking Head", saeule: "Community", stufe: "meister",
|
||
text: "Regeln, deren Grund man kennt, werden eingehalten. Regeln ohne Grund werden umgangen." },
|
||
{ schluessel: "bester-moment-des-monats", titel: "Der beste Moment des Monats",
|
||
hook: "„Ein Monat, ein Moment. Der hier.“",
|
||
format: "Zusammenschnitt", saeule: "Eigenwerbung", stufe: "profi",
|
||
text: "Monatlich, immer gleich aufgebaut, immer zur selben Zeit. Ein Format, auf das man wartet, schlägt einen Clip, den man findet." },
|
||
{ schluessel: "wo-man-mich-sonst-findet", titel: "Wo man mich sonst findet",
|
||
hook: "„Hier bin ich live. Und hier sind die anderen Orte.“",
|
||
format: "Kurzvorstellung", saeule: "Eigenwerbung", stufe: "profi",
|
||
text: "Einmal im Quartal, kurz, ohne Betteln. Wer nur auf einem Kanal erreichbar ist, verliert bei jeder Störung dort alles." },
|
||
{ schluessel: "naechste-woche-bei-mir", titel: "Nächste Woche bei mir",
|
||
hook: "„Drei Termine, drei Themen. Trag es dir ein.“",
|
||
format: "Ankündigung", saeule: "Eigenwerbung", stufe: "profi",
|
||
text: "Am selben Wochentag, immer in derselben Form. Wer weiß, wann etwas kommt, plant es ein." },
|
||
{ schluessel: "clip-fuer-andere-plattform-geschnitten", titel: "Derselbe Moment, für die andere Plattform geschnitten",
|
||
hook: "„Ein Ausschnitt, zwei Fassungen. Der Unterschied ist größer, als man denkt.“",
|
||
format: "Vorher / Nachher", saeule: "Eigenwerbung", stufe: "profi",
|
||
text: "Hochkant, Untertitel, anderer Einstieg. Wer überall dieselbe Datei hochlädt, verschenkt drei Viertel der Wirkung." },
|
||
{ schluessel: "jahresrueckblick-als-trailer", titel: "Jahresrückblick als Trailer",
|
||
hook: "„Ein Jahr in neunzig Sekunden.“",
|
||
format: "Zusammenschnitt", saeule: "Eigenwerbung", stufe: "meister",
|
||
text: "Einmal im Jahr, mit Sorgfalt gemacht. Das ist das Video, das man verschickt, wenn jemand fragt, was man eigentlich tut." },
|
||
{ schluessel: "was-partner-bei-mir-bekommen", titel: "Was ein Partner bei mir bekommt",
|
||
hook: "„Falls du fragen willst: Das hier ist die Antwort auf deine erste Frage.“",
|
||
format: "Zeigen & Erklären", saeule: "Eigenwerbung", stufe: "meister",
|
||
text: "Zahlen, Formate, Beispiele -- öffentlich statt in einer Datei auf Anfrage. Wer es nachlesen kann, fragt ernsthafter." },
|
||
{ schluessel: "mein-kanal-in-neunzig-sekunden", titel: "Mein Kanal in neunzig Sekunden",
|
||
hook: "„Neu hier? Das hier ist alles, was du wissen musst.“",
|
||
format: "Kurzvorstellung", saeule: "Eigenwerbung", stufe: "meister",
|
||
text: "Fest angeheftet, einmal im Jahr erneuert. Es ist das Erste, was ein Neuer sieht -- und meistens das Einzige." },
|
||
{ schluessel: "gemeinsame-sendung-mit-partnerkanal", titel: "Gemeinsame Sendung mit einem Partnerkanal",
|
||
hook: "„Heute zu zweit. Zwei Communities, ein Abend.“",
|
||
format: "Ankündigung", saeule: "Eigenwerbung", stufe: "meister",
|
||
text: "Lange vorbereitet, auf beiden Seiten angekündigt. Der stärkste Weg zu neuen Zuschauern, den es ohne Geld gibt." },
|
||
];
|
||
|
||
/* =====================================================================
|
||
LIVE-PUNKTE
|
||
|
||
Drei Listen entlang der Sendung. Die mittlere ist die wichtigste und
|
||
zugleich die, die es sonst nirgends gibt: Was während des Streams
|
||
auffällt, ist am nächsten Tag weg. Deshalb sind diese Punkte so
|
||
formuliert, dass man sie in einem Moment anklicken kann, in dem man
|
||
eigentlich keine Zeit hat.
|
||
|
||
===================================================================== */
|
||
|
||
export const LIVE_PUNKTE = {
|
||
vorbereitung: [
|
||
{ schluessel: "ton-geprueft", titel: "Ton geprüft", text: "Eine Minute aufnehmen und anhören. Ton ist der Grund Nummer eins, warum Leute wieder gehen.", stufe: "anfaenger" },
|
||
{ schluessel: "licht-sitzt", titel: "Licht sitzt", text: "Gesicht heller als der Hintergrund. Kein Fenster im Rücken.", stufe: "anfaenger" },
|
||
{ schluessel: "verbindung-getestet", titel: "Verbindung getestet", text: "Upload-Geschwindigkeit geprüft, Kabel statt WLAN wenn möglich.", stufe: "anfaenger" },
|
||
{ schluessel: "titel-und-thema-stehen", titel: "Titel und Thema stehen", text: "Wer den Titel liest, weiß, was ihn erwartet – und ob es für ihn ist.", stufe: "anfaenger" },
|
||
{ schluessel: "ablauf-grob-im-kopf", titel: "Ablauf grob im Kopf", text: "Drei Blöcke reichen. Ein Stream ohne roten Faden fühlt sich für Zuschauer wie Warten an.", stufe: "fort" },
|
||
{ schluessel: "angekuendigt", titel: "Angekündigt", text: "Mindestens einmal vorher gesagt, dass es losgeht – Story, Post oder Nachricht.", stufe: "fort" },
|
||
{ schluessel: "moderation-geklaert", titel: "Moderation geklärt", text: "Weiß jemand Bescheid, der eingreifen kann, wenn es im Chat kippt?", stufe: "fort" },
|
||
{ schluessel: "technik-ersatz-bereit", titel: "Technik-Ersatz bereit", text: "Was passiert, wenn der Stream abbricht? Handy als Notlösung bereitlegen.", stufe: "fort" },
|
||
{ schluessel: "upload-gemessen-bitrate-darunter", titel: "Upload gemessen, Bitrate darunter", text: "Vor der Sendung messen, nicht schaetzen. Video und Ton zusammen sollen hoechstens 70 bis 80 Prozent des gemessenen Uploads belegen -- der Rest ist der Puffer, der verworfene Bilder verhindert.", stufe: "profi" },
|
||
{ schluessel: "keyframe-alle-zwei-sekunden", titel: "Keyframe alle zwei Sekunden", text: "Der Abstand, in dem ein volles Bild geschickt wird. Zwei Sekunden ist keine Geschmacksfrage: Alles andere kann bei Zuschauern zu Puffern oder gar nicht erst zum Abspielen fuehren.", stufe: "profi" },
|
||
{ schluessel: "probelauf-privat-gestreamt", titel: "Probelauf privat gestreamt", text: "Nicht die Vorschau im Programm, sondern ein echter privater Stream. Erst der zeigt, was beim Zuschauer ankommt -- Ton, Bild, Verzoegerung, Verbindung.", stufe: "profi" },
|
||
{ schluessel: "die-ersten-dreissig-sekunden-stehen", titel: "Die ersten dreissig Sekunden stehen", text: "Wortwoertlich vorbereitet. In dieser halben Minute entscheidet sich, ob jemand bleibt, und genau dort improvisiert man am schlechtesten.", stufe: "profi" },
|
||
{ schluessel: "ausweichweg-laeuft-mit", titel: "Ausweichweg laeuft mit", text: "Zweites Geraet bereit und angemeldet, nicht nur daneben. Ein Ersatz, den man erst einrichten muss, ist im Moment des Ausfalls keiner.", stufe: "meister" },
|
||
{ schluessel: "ablauf-als-vorlage-nicht-als-zettel", titel: "Ablauf als Vorlage, nicht als Zettel", text: "Derselbe Aufbau jedes Mal, als Vorlage gespeichert. Was jedes Mal neu erfunden wird, wird jedes Mal anders gut.", stufe: "meister" },
|
||
{ schluessel: "ein-ziel-in-einer-zahl", titel: "Ein Ziel in einer Zahl", text: "Vorher festlegen, woran diese Sendung gemessen wird -- Verweildauer, Wiederkehrer, Kommentare. Ohne Zahl vorher ist die Auswertung danach eine Meinung.", stufe: "meister" },
|
||
|
||
/* --- Aus der Recherche vom 09.09.2026 --- */
|
||
{ schluessel: "ankuendigung-kurz-vorher", titel: "Ankündigung kurz vorher", text: "Ein kurzes Video 30 bis 60 Minuten vor dem Start. Es bündelt die, die ohnehin kommen wollten – und ein voller Start zieht neue nach.", stufe: "fort" },
|
||
{ schluessel: "sendeplan-steht-fest", titel: "Sendeplan steht fest", text: "Zwei feste Tage schlagen fünf zufällige. Wer weiß, wann du sendest, kommt wieder – und Wiederkehr ist das Signal, das man nicht fälschen kann.", stufe: "fort" },
|
||
|
||
/* ===== PROFI UND MEISTER, AUSGEBAUT (09.09.2026) =================
|
||
Filipe: "ich will dass die 2 kategorien profi und meister überall
|
||
noch mehr perfektionniert werden. ich will dass da noch mehr
|
||
aufgeben und möglichkeiten sind."
|
||
|
||
Gezählt statt geschätzt: vorbereitung hatte 4 Punkte fuer Profi und 3 fuer Meister, aber 6 fuer Fortgeschrittene.
|
||
Die oberen beiden Ränge waren die dünnsten von allen -- genau
|
||
verkehrt herum. Wer schon alles kann, was auf der Liste steht,
|
||
findet dort nichts mehr; und Meisterschaft ist der Rang, in dem
|
||
man am längsten bleibt. ================================== */
|
||
{ schluessel: "tonkette-hochpass-gate-kompressor", titel: "Tonkette in der richtigen Reihenfolge", text: "Hochpass bei 80 Hertz, dann Gate, dann Kompressor, zuletzt Begrenzer. Die Reihenfolge ist keine Geschmacksfrage: Wer den Kompressor vor das Gate setzt, macht das Rauschen mit lauter, statt es wegzunehmen.", stufe: "profi" },
|
||
{ schluessel: "pegel-mit-luft-nach-oben", titel: "Pegel mit Luft nach oben", text: "Die lauteste Stelle liegt bei minus sechs Dezibel, nicht bei null. Die sechs Dezibel Reserve sind der Unterschied zwischen laut und verzerrt -- und Verzerrung bekommt man nachher nicht mehr heraus.", stufe: "profi" },
|
||
{ schluessel: "szenen-einmal-durchgeschaltet", titel: "Szenen vor dem Start einmal durchgeschaltet", text: "Jede Szene einmal aufrufen, bevor jemand zusieht. Eine Szene, die beim ersten Aufruf zwei Sekunden braucht, tut das sonst vor Publikum.", stufe: "profi" },
|
||
{ schluessel: "probelauf-zur-echten-sendezeit", titel: "Probelauf zur echten Sendezeit", text: "Nicht vormittags testen, wenn abends gesendet wird. Abends teilen sich mehr Leute dieselbe Leitung, und genau dann zeigt sich, ob die Bitrate wirklich passt.", stufe: "profi" },
|
||
{ schluessel: "vorschaubild-und-titel-liegen-fertig", titel: "Titel und Vorschaubild liegen fertig bereit", text: "Beides vor dem Start gespeichert, nicht in der ersten Minute getippt. Wer beim Anfangen noch schreibt, sendet die ersten Minuten an niemanden.", stufe: "profi" },
|
||
{ schluessel: "zweite-leitung-am-mobilfunk", titel: "Zweite Leitung über Mobilfunk bereit", text: "Ein zweiter Weg ins Netz über einen anderen Anbieter, eingerichtet und getestet. Fällt die Hauptleitung aus, ist das die einzige Rettung, die man nicht erst besorgen muss.", stufe: "meister" },
|
||
{ schluessel: "startcheck-wird-abgehakt", titel: "Startcheck wird abgehakt, nicht erinnert", text: "Eine feste Liste, die vor jeder Sendung Punkt für Punkt durchgegangen wird. Piloten machen das seit hundert Jahren so, und zwar gerade weil sie es können.", stufe: "meister" },
|
||
{ schluessel: "ablauf-an-vertretung-uebergebbar", titel: "Der Ablauf ist übergebbar", text: "So aufgeschrieben, dass jemand anderes die Sendung fahren könnte. Das ist der Unterschied zwischen einem Können und einem Verfahren -- und der Grund, warum man auch mal krank sein darf.", stufe: "meister" },
|
||
{ schluessel: "gaeste-vorher-technisch-geprueft", titel: "Gäste vorher technisch geprüft", text: "Zehn Minuten Verbindungsprobe am Vortag, nicht fünf Minuten vorher. Ein Gast mit schlechtem Ton kostet mehr Zuschauer als gar kein Gast.", stufe: "meister" },
|
||
{ schluessel: "aufzeichnung-laeuft-immer-mit", titel: "Die Aufzeichnung läuft immer mit", text: "Lokal, in voller Qualität, unabhängig vom Stream. Was nicht aufgezeichnet ist, kann kein Ausschnitt werden -- und die besten Momente kündigen sich nicht an.", stufe: "meister" },
|
||
],
|
||
mitschrift: [
|
||
{ schluessel: "guter-moment-aufheben", titel: "Guter Moment – aufheben", text: "Etwas ist gut gelaufen. Kurz notieren, woran es lag – daraus wird später ein Clip.", stufe: "anfaenger" },
|
||
{ schluessel: "hier-sind-leute-gegangen", titel: "Hier sind Leute gegangen", text: "Zeitpunkt merken. Später nachsehen, was in dem Moment passiert ist.", stufe: "fort" },
|
||
{ schluessel: "frage-aus-dem-chat-die-wiederkommt", titel: "Frage aus dem Chat, die wiederkommt", text: "Wird oft gefragt? Dann gehört sie in ein eigenes Video.", stufe: "fort" },
|
||
{ schluessel: "technik-hat-gehakt", titel: "Technik hat gehakt", text: "Ton weg, Bild eingefroren, Verzögerung – aufschreiben, solange man es noch weiß.", stufe: "anfaenger" },
|
||
{ schluessel: "unangenehme-situation-im-chat", titel: "Unangenehme Situation im Chat", text: "Was war es, wie ist es ausgegangen? Auch wenn es gut lief.", stufe: "fort" },
|
||
{ schluessel: "neue-zuschauer-aufgetaucht", titel: "Neue Zuschauer aufgetaucht", text: "Woher kamen sie? Wurde jemand begrüßt oder ging es unter?", stufe: "fort" },
|
||
{ schluessel: "ich-wusste-nicht-weiter", titel: "Ich wusste nicht weiter", text: "Stelle merken, an der es gestockt hat. Dafür gibt es Hilfe.", stufe: "anfaenger" },
|
||
{ schluessel: "zeitstempel-statt-gefuehl", titel: "Zeitstempel statt Gefuehl", text: "Die Minute notieren, nicht 'irgendwann in der Mitte'. Nur mit der Minute findet man die Stelle in der Aufzeichnung wieder.", stufe: "profi" },
|
||
{ schluessel: "chatverlauf-gesichert", titel: "Chatverlauf gesichert", text: "Vor dem Schliessen speichern. Er ist die einzige Quelle dafuer, was wirklich gesagt wurde -- und bei einem Vorfall die einzige, die zaehlt.", stufe: "profi" },
|
||
{ schluessel: "namen-vorgelesen", titel: "Namen vorgelesen", text: "Neue in den ersten Minuten begrüßen, nicht erst wenn Zeit ist. Wer beim Namen genannt wird, bleibt spürbar länger.", stufe: "anfaenger" },
|
||
{ schluessel: "interaktion-eingefordert", titel: "Interaktion eingefordert", text: "Frage, Umfrage, Abstimmung. Ein Kommentar zählt mehr als stilles Zuschauen – und zieht den Stream zu neuen Leuten.", stufe: "fort" },
|
||
|
||
/* ===== PROFI UND MEISTER, AUSGEBAUT (09.09.2026) =================
|
||
Filipe: "ich will dass die 2 kategorien profi und meister überall
|
||
noch mehr perfektionniert werden. ich will dass da noch mehr
|
||
aufgeben und möglichkeiten sind."
|
||
|
||
Gezählt statt geschätzt: mitschrift hatte 2 Punkte fuer Profi und KEINEN einzigen fuer Meister.
|
||
Die oberen beiden Ränge waren die dünnsten von allen -- genau
|
||
verkehrt herum. Wer schon alles kann, was auf der Liste steht,
|
||
findet dort nichts mehr; und Meisterschaft ist der Rang, in dem
|
||
man am längsten bleibt. ================================== */
|
||
{ schluessel: "uhrzeit-statt-gefuehl-notiert", titel: "Uhrzeit statt Gefühl notiert", text: "Zu jedem Vermerk die Minute dazuschreiben. Ohne Zeitstempel sucht man hinterher eine halbe Stunde nach einer Stelle, die man in zehn Sekunden gefunden hätte.", stufe: "profi" },
|
||
{ schluessel: "namen-der-neuen-mitschreiben", titel: "Namen der Neuen mitschreiben", text: "Wer zum ersten Mal etwas schreibt, bekommt seinen Namen notiert. Beim nächsten Mal angesprochen zu werden ist der stärkste Grund wiederzukommen, den es gibt.", stufe: "profi" },
|
||
{ schluessel: "was-nicht-funktioniert-hat-sofort", titel: "Was nicht funktioniert hat, sofort", text: "Im Moment des Fehlers notieren, nicht danach. Nach der Sendung erinnert man sich an das Gefühl, nicht an die Ursache.", stufe: "profi" },
|
||
{ schluessel: "zwischenstand-zur-halbzeit", titel: "Zwischenstand zur Halbzeit", text: "Einmal mittendrin auf die Zahlen sehen: Wie viele sind da, wie viele waren es zum Start. Eine Sendung, die man erst hinterher auswertet, kann man nicht mehr retten.", stufe: "profi" },
|
||
{ schluessel: "mitschrift-nach-festen-spalten", titel: "Mitschrift nach festen Spalten", text: "Immer dieselben Felder: Zeit, was passiert ist, was daraus wird. Freie Notizen sind nach drei Monaten nicht mehr vergleichbar -- und Vergleichbarkeit ist der ganze Zweck.", stufe: "meister" },
|
||
{ schluessel: "mitschrift-geht-noch-am-abend-raus", titel: "Die Mitschrift geht noch am Abend raus", text: "An die Betreuung, in Stichworten, ohne Ausschmückung. Wer am nächsten Morgen schreibt, schreibt eine Erinnerung statt einer Beobachtung.", stufe: "meister" },
|
||
{ schluessel: "aufgaben-entstehen-aus-der-mitschrift", titel: "Aus jeder Mitschrift entsteht mindestens eine Aufgabe", text: "Sonst ist sie ein Tagebuch. Eine Beobachtung ohne Folge wird beim nächsten Mal noch einmal gemacht.", stufe: "meister" },
|
||
{ schluessel: "clip-marken-live-gesetzt", titel: "Clip-Marken schon während der Sendung", text: "Eine Taste, die den Zeitpunkt markiert, während es passiert. Wer erst danach sucht, findet die Hälfte nicht mehr.", stufe: "meister" },
|
||
{ schluessel: "gaeste-und-kooperationen-vermerkt", titel: "Gäste und Kooperationen mit Wirkung vermerkt", text: "Wer war da, was hat es gebracht -- Zuschauer, Folger, Stimmung. Ohne diese Notiz entscheidet man beim nächsten Mal nach Sympathie statt nach Wirkung.", stufe: "meister" },
|
||
],
|
||
auswertung: [
|
||
{ schluessel: "was-hat-diesmal-getragen", titel: "Was hat diesmal getragen?", text: "Ein Ding. Nicht drei. Das eine, das man wiederholen will.", stufe: "anfaenger" },
|
||
{ schluessel: "was-war-zaeh", titel: "Was war zäh?", text: "Ehrlich sein. Die zähen Stellen sind die, an denen man wächst.", stufe: "anfaenger" },
|
||
{ schluessel: "zahlen-im-vergleich", titel: "Zahlen im Vergleich", text: "Zuschauer, Verweildauer, Kommentare – gegen das letzte Mal, nicht gegen andere.", stufe: "fort" },
|
||
{ schluessel: "clips-gesichert", titel: "Clips gesichert", text: "Die guten Momente rausgeschnitten und abgelegt, solange man sie noch findet.", stufe: "fort" },
|
||
{ schluessel: "eine-sache-fuer-naechstes-mal", titel: "Eine Sache für nächstes Mal", text: "Genau eine. Wer sich fünf Dinge vornimmt, macht keins davon.", stufe: "anfaenger" },
|
||
{ schluessel: "braucht-besprechung", titel: "Braucht Besprechung", text: "Etwas, das man nicht allein lösen kann – geht an die Betreuung.", stufe: "anfaenger" },
|
||
{ schluessel: "verweildauer-gegen-die-letzten-fuenf", titel: "Verweildauer gegen die letzten fuenf", text: "Nicht gegen das letzte Mal -- ein einzelner Vergleich ist Zufall. Fuenf Sendungen zeigen eine Richtung.", stufe: "profi" },
|
||
{ schluessel: "ein-versuch-eine-aenderung", titel: "Ein Versuch, eine Aenderung", text: "Wer Titel, Uhrzeit und Aufbau zugleich aendert, weiss hinterher nicht, was gewirkt hat. Eine Sache je Sendung.", stufe: "profi" },
|
||
{ schluessel: "erkenntnis-zurueck-in-die-vorlage", titel: "Erkenntnis zurueck in die Vorlage", text: "Was sich bewaehrt hat, wird Teil des Ablaufs -- sonst muss man es sich jedes Mal neu merken.", stufe: "meister" },
|
||
{ schluessel: "verweildauer-abgelesen", titel: "Verweildauer abgelesen", text: "Über 15 Minuten im Schnitt heißt: Die Stimmung trägt. Darunter liegt es fast nie am Thema, sondern am Anfang.", stufe: "profi" },
|
||
{ schluessel: "anteil-neuer-zuschauer", titel: "Anteil neuer Zuschauer", text: "Wie viele waren noch nie da? Ohne neue wächst nichts, ohne alte trägt nichts. Beide Zahlen gehören nebeneinander.", stufe: "profi" },
|
||
{ schluessel: "wiederkehrer-ueber-vier-wochen", titel: "Wiederkehrer über vier Wochen", text: "Wie viele kommen ein zweites Mal? Diese eine Zahl sagt mehr über den Kanal als jeder Spitzenwert.", stufe: "meister" },
|
||
|
||
/* ===== PROFI UND MEISTER, AUSGEBAUT (09.09.2026) =================
|
||
Filipe: "ich will dass die 2 kategorien profi und meister überall
|
||
noch mehr perfektionniert werden. ich will dass da noch mehr
|
||
aufgeben und möglichkeiten sind."
|
||
|
||
Gezählt statt geschätzt: auswertung hatte 4 Punkte fuer Profi und 2 fuer Meister.
|
||
Die oberen beiden Ränge waren die dünnsten von allen -- genau
|
||
verkehrt herum. Wer schon alles kann, was auf der Liste steht,
|
||
findet dort nichts mehr; und Meisterschaft ist der Rang, in dem
|
||
man am längsten bleibt. ================================== */
|
||
{ schluessel: "verweildauer-gegen-den-eigenen-schnitt", titel: "Verweildauer gegen den eigenen Schnitt", text: "Nicht gegen fremde Zahlen, sondern gegen die letzten fünf eigenen Sendungen. Nur der eigene Verlauf sagt, ob etwas besser geworden ist.", stufe: "profi" },
|
||
{ schluessel: "abbruchstelle-im-verlauf-gesucht", titel: "Die Abbruchstelle im Verlauf gesucht", text: "Die Kurve zeigt eine Minute, in der viele gehen. Dorthin zurückspringen und ansehen, was genau in dem Moment lief -- das ist die einzige Stelle, an der Verbesserung anfängt.", stufe: "profi" },
|
||
{ schluessel: "wiederkehrer-getrennt-gezaehlt", titel: "Wiederkehrer getrennt gezählt", text: "Wie viele waren schon einmal da. Neue Zuschauer sind Reichweite, Wiederkehrer sind Publikum -- und nur das zweite trägt.", stufe: "profi" },
|
||
{ schluessel: "einnahmen-je-stunde-statt-je-sendung", titel: "Einnahmen je Stunde statt je Sendung", text: "Eine sechsstündige Sendung mit demselben Ergebnis wie eine dreistündige ist keine gute Sendung. Erst die Zahl je Stunde macht Abende vergleichbar.", stufe: "profi" },
|
||
{ schluessel: "bestes-und-schlechtestes-nebeneinander", titel: "Bestes und schlechtestes Ergebnis nebeneinander", text: "Nicht nur den Ausreißer nach oben ansehen. Der Vergleich der beiden Enden zeigt den Unterschied deutlicher als jeder Durchschnitt.", stufe: "profi" },
|
||
{ schluessel: "monatsbericht-mit-drei-zahlen", titel: "Monatsbericht mit drei Zahlen", text: "Immer dieselben drei, immer am selben Tag. Ein Bericht, der jedes Mal andere Zahlen zeigt, ist eine Erzählung und kein Bericht.", stufe: "meister" },
|
||
{ schluessel: "gruppen-nach-eintrittsmonat", titel: "Zuschauer nach Eintrittsmonat betrachtet", text: "Wer im Mai dazugekommen ist, wird als eigene Gruppe weiterverfolgt. So sieht man, ob Neue bleiben -- eine Gesamtzahl verdeckt genau das.", stufe: "meister" },
|
||
{ schluessel: "stammgeber-gesondert-betreut", titel: "Die verlässlichsten Unterstützer namentlich bekannt", text: "Die kleine Gruppe, die regelmäßig wiederkommt, trägt den größten Teil. Wer sie nicht beim Namen kennt, merkt ihren Wegfall erst, wenn er in der Summe steht.", stufe: "meister" },
|
||
{ schluessel: "eine-annahme-je-monat-geprueft", titel: "Eine Annahme je Monat wirklich geprüft", text: "Etwas ändern, alles andere gleich lassen, danach vergleichen. Zwei Änderungen gleichzeitig beantworten keine Frage.", stufe: "meister" },
|
||
{ schluessel: "auswertung-fuehrt-zu-einer-entscheidung", titel: "Jede Auswertung endet mit einer Entscheidung", text: "Beibehalten, ändern oder lassen -- aufgeschrieben, mit Datum. Eine Auswertung ohne Entscheidung ist Beschäftigung.", stufe: "meister" },
|
||
],
|
||
};
|
||
|
||
/* =====================================================================
|
||
CALL-LEITFÄDEN
|
||
|
||
Jeder Call endet mit To-dos -- das steht schon auf der Seite. Was
|
||
fehlte, ist der Weg dorthin. Diese Leitfäden sind bewusst kurz: Ein
|
||
Gespräch nach Fragebogen ist ein Verhör, kein Gespräch.
|
||
===================================================================== */
|
||
|
||
/* =====================================================================
|
||
COMMUNITY-PUNKTE
|
||
|
||
Moderation ist die Arbeit, die niemand sieht, solange sie
|
||
funktioniert. Die Punkte hier sind so gewaehlt, dass sie VOR dem
|
||
Ernstfall abgehakt werden koennen -- danach ist es zu spaet.
|
||
===================================================================== */
|
||
|
||
export const COMMUNITY_PUNKTE = {
|
||
moderation: [
|
||
{ schluessel: "regeln-stehen-sichtbar", titel: "Regeln stehen sichtbar", text: "Kurz, verstaendlich, an einer Stelle, die man findet. Drei Saetze reichen.", stufe: "anfaenger" },
|
||
{ schluessel: "jemand-kann-eingreifen", titel: "Jemand kann eingreifen", text: "Waehrend des Streams ist eine zweite Person mit Rechten da -- oder es ist klar, dass keine da ist.", stufe: "anfaenger" },
|
||
{ schluessel: "wortfilter-eingerichtet", titel: "Wortfilter eingerichtet", text: "Die offensichtlichen Sachen automatisch weg, damit man sich um den Rest kuemmern kann.", stufe: "fort" },
|
||
{ schluessel: "was-passiert-bei-einem-verstoss", titel: "Was passiert bei einem Verstoss?", text: "Verwarnen, stummschalten, sperren -- vorher entscheiden, nicht im Moment.", stufe: "fort" },
|
||
{ schluessel: "umgang-mit-minderjaehrigen", titel: "Umgang mit Minderjaehrigen", text: "Wie erkennt man sie, und was gilt dann? Das ist keine Ermessensfrage.", stufe: "anfaenger" },
|
||
{ schluessel: "eskalationsleiter-steht-schriftlich", titel: "Eskalationsleiter steht schriftlich", text: "Vier Stufen, in dieser Reihenfolge: ansprechen, Nachricht loeschen, kurze Auszeit, Sperre. Wer sie erst im Moment festlegt, entscheidet ungleich -- und Ungleichbehandlung ist das, was Communitys spaltet.", stufe: "profi" },
|
||
{ schluessel: "automatikfilter-stufe-begruendet", titel: "Automatikfilter: Stufe gewaehlt und begruendet", text: "Die Stufe des automatischen Filters ist eine Abwaegung, keine Voreinstellung: zu scharf loescht Harmloses, zu lasch laesst durch. Die Wahl gehoert aufgeschrieben.", stufe: "profi" },
|
||
{ schluessel: "wer-eskaliert-an-wen", titel: "Wer eskaliert an wen", text: "Ab wann entscheidet die Moderation nicht mehr selbst? Bei Bedrohung, Rechtsverstoss oder Unsicherheit geht es weiter -- und es muss klar sein, an wen.", stufe: "profi" },
|
||
{ schluessel: "moderatoren-eingewiesen-nicht-nur-ernannt", titel: "Moderatoren eingewiesen, nicht nur ernannt", text: "Rechte vergeben ist der kleinere Teil. Dazu gehoeren: die Regeln schriftlich, die Eskalationsleiter, die Werkzeuge einmal gezeigt.", stufe: "meister" },
|
||
{ schluessel: "ernstfall-einmal-geprobt", titel: "Ernstfall einmal geprobt", text: "Einmal durchspielen, wer was tut, wenn es kippt. Im Ernstfall zum ersten Mal darueber nachzudenken ist zu spaet.", stufe: "meister" },
|
||
|
||
/* --- Aus der Recherche vom 09.09.2026 --- */
|
||
{ schluessel: "erlaubte-woerter-gepflegt", titel: "Erlaubte Wörter gepflegt", text: "Der Filter fängt auch Wörter, die bei euch harmlos sind. Eine kurze Ausnahmeliste verhindert, dass die Stammleute verstummen.", stufe: "fort" },
|
||
{ schluessel: "eigener-kanal-fuers-mod-team", titel: "Eigener Kanal fürs Mod-Team", text: "Absprachen gehören nicht in den öffentlichen Chat. Ein eigener Raum, in dem gefragt werden darf, ohne dass alle mitlesen.", stufe: "profi" },
|
||
|
||
/* ===== PROFI UND MEISTER, AUSGEBAUT (09.09.2026) =================
|
||
Filipe: "ich will dass die 2 kategorien profi und meister überall
|
||
noch mehr perfektionniert werden. ich will dass da noch mehr
|
||
aufgeben und möglichkeiten sind."
|
||
|
||
Gezählt statt geschätzt: moderation hatte 4 Punkte fuer Profi und 2 fuer Meister.
|
||
Die oberen beiden Ränge waren die dünnsten von allen -- genau
|
||
verkehrt herum. Wer schon alles kann, was auf der Liste steht,
|
||
findet dort nichts mehr; und Meisterschaft ist der Rang, in dem
|
||
man am längsten bleibt. ================================== */
|
||
{ schluessel: "stufenfolge-steht-fest", titel: "Die Stufenfolge steht fest", text: "Hinweis, Löschen, Stummschalten, Zeitsperre, Ausschluss. Wer erst im Streitfall entscheidet, wie hart er reagiert, entscheidet nach Laune -- und wird unberechenbar.", stufe: "profi" },
|
||
{ schluessel: "moderatoren-haben-eigene-worte", titel: "Moderatoren haben eigene Worte", text: "Drei bis fünf fertige Sätze für die häufigsten Fälle. Ein Team, das jedes Mal neu formuliert, klingt jedes Mal anders streng.", stufe: "profi" },
|
||
{ schluessel: "stille-mitleser-mitgedacht", titel: "Die stillen Mitleser mitgedacht", text: "Die meisten schreiben nie. Eine Moderation, die nur auf Schreibende reagiert, übersieht neun von zehn Anwesenden.", stufe: "profi" },
|
||
{ schluessel: "wortfilter-regelmaessig-nachgezogen", titel: "Wortfilter regelmäßig nachgezogen", text: "Umgehungen ändern sich schneller als Filterlisten. Einmal im Monat die Fälle durchsehen, die durchgekommen sind.", stufe: "profi" },
|
||
{ schluessel: "keine-moderation-im-affekt", titel: "Keine Entscheidung im Affekt", text: "Wer gerade wütend ist, sperrt zu hart oder zu spät. Im Zweifel stummschalten und nach der Sendung entscheiden -- das lässt sich beides zurücknehmen.", stufe: "profi" },
|
||
{ schluessel: "moderationsteam-mit-schichten", titel: "Moderationsteam mit Schichten", text: "Niemand ist allein für eine Tageszeit zuständig. Was Moderatoren aufreibt, ist nicht die Menge, sondern das Alleinsein damit.", stufe: "meister" },
|
||
{ schluessel: "schwere-faelle-werden-weitergegeben", titel: "Schwere Fälle werden weitergegeben", text: "Drohungen, Minderjährige, rechtlich Heikles gehen sofort an die Betreuung. Ein Moderator, der so etwas allein entscheidet, wird damit auch allein gelassen.", stufe: "meister" },
|
||
{ schluessel: "moderationsbuch-mit-entscheidungen", titel: "Ein Buch mit den getroffenen Entscheidungen", text: "Wer wurde wann warum gesperrt. Bei einer Beschwerde ist das der Unterschied zwischen Erinnerung und Beleg.", stufe: "meister" },
|
||
{ schluessel: "moderatoren-bekommen-rueckmeldung", titel: "Moderatoren bekommen Rückmeldung", text: "Einmal im Monat kurz sprechen: Was war schwer, was war unklar. Ehrenamtliche hören sonst nur etwas, wenn etwas schiefging.", stufe: "meister" },
|
||
{ schluessel: "regeln-sind-oeffentlich-und-datiert", titel: "Die Regeln stehen öffentlich und tragen ein Datum", text: "Sichtbar, in einfachen Worten, mit dem Tag der letzten Änderung. Regeln, die niemand nachlesen kann, gelten als Willkür.", stufe: "meister" },
|
||
],
|
||
aktion: [
|
||
{ schluessel: "neue-begruessen", titel: "Neue begruessen", text: "Wer zum ersten Mal da ist, wird angesprochen. Kostet zwei Sekunden und entscheidet, ob jemand bleibt.", stufe: "anfaenger" },
|
||
{ schluessel: "stammleute-erkennen", titel: "Stammleute erkennen", text: "Namen merken oder notieren. Wiedererkannt zu werden ist der halbe Grund wiederzukommen.", stufe: "fort" },
|
||
{ schluessel: "etwas-geben-das-nur-hier-gibt", titel: "Etwas geben, das nur hier gibt", text: "Ein Insider, ein Ritual, ein Spitzname. Community entsteht aus Gemeinsamem.", stufe: "fort" },
|
||
{ schluessel: "ausserhalb-des-streams-antworten", titel: "Ausserhalb des Streams antworten", text: "Kommentare und Nachrichten -- die Community lebt auch zwischen den Sendungen.", stufe: "fort" },
|
||
{ schluessel: "wiederkehrende-rubrik-mit-festem-termin", titel: "Wiederkehrende Rubrik mit festem Termin", text: "Etwas, das immer am selben Tag stattfindet. Ein Termin, auf den man sich freuen kann, bindet staerker als guter Einzelinhalt.", stufe: "profi" },
|
||
{ schluessel: "uebergabe-an-einen-zweiten-geregelt", titel: "Uebergabe an einen Zweiten geregelt", text: "Was passiert mit der Community, wenn man zwei Wochen ausfaellt? Wer nicht ersetzbar ist, kann nicht krank werden.", stufe: "meister" },
|
||
{ schluessel: "begruessung-in-den-ersten-minuten", titel: "Begrüßung in den ersten Minuten", text: "Nicht wenn Zeit ist, sondern sofort. Wer in der ersten Minute angesprochen wird, bleibt deutlich länger.", stufe: "anfaenger" },
|
||
{ schluessel: "ein-ritual-das-jeder-kennt", titel: "Ein Ritual, das jeder kennt", text: "Derselbe Einstieg, dieselbe Verabschiedung. Wiedererkennung ist der halbe Grund wiederzukommen.", stufe: "fort" },
|
||
|
||
/* ===== PROFI UND MEISTER, AUSGEBAUT (09.09.2026) =================
|
||
Filipe: "ich will dass die 2 kategorien profi und meister überall
|
||
noch mehr perfektionniert werden. ich will dass da noch mehr
|
||
aufgeben und möglichkeiten sind."
|
||
|
||
Gezählt statt geschätzt: aktion hatte EINEN Punkt fuer Profi und EINEN fuer Meister.
|
||
Die oberen beiden Ränge waren die dünnsten von allen -- genau
|
||
verkehrt herum. Wer schon alles kann, was auf der Liste steht,
|
||
findet dort nichts mehr; und Meisterschaft ist der Rang, in dem
|
||
man am längsten bleibt. ================================== */
|
||
{ schluessel: "aktion-hat-ein-messbares-ziel", titel: "Jede Aktion hat ein messbares Ziel", text: "Vorher festlegen, woran man sieht, ob sie gewirkt hat. Ohne Zahl bleibt hinterher nur der Eindruck, und der ist immer gut.", stufe: "profi" },
|
||
{ schluessel: "mitmachen-ohne-geld-moeglich", titel: "Mitmachen ist auch ohne Geld möglich", text: "Jede Aktion braucht einen Weg für die, die nichts geben können. Sonst teilt sich die Gemeinschaft genau dort, wo sie zusammenwachsen sollte.", stufe: "profi" },
|
||
{ schluessel: "ergebnis-wird-oeffentlich-gezeigt", titel: "Das Ergebnis wird öffentlich gezeigt", text: "Was herausgekommen ist, mit Zahlen, für alle sichtbar. Eine Aktion ohne sichtbares Ergebnis nimmt beim nächsten Mal niemand mehr ernst.", stufe: "profi" },
|
||
{ schluessel: "aktion-braucht-einen-anlass", titel: "Jede Aktion braucht einen Anlass", text: "Ein Jubiläum, ein erreichtes Ziel, ein Datum. Ohne Anlass wirkt jede Aktion wie eine Bitte.", stufe: "profi" },
|
||
{ schluessel: "wiederholbare-aktion-statt-einfall", titel: "Wiederholbares Format statt Einfall", text: "Etwas, das jeden Monat stattfinden kann. Einmalige Einfälle kosten jedes Mal dieselbe Vorbereitung und bauen nichts auf.", stufe: "profi" },
|
||
{ schluessel: "jahresplan-mit-vier-hoehepunkten", titel: "Jahresplan mit vier Höhepunkten", text: "Vier große Anlässe über das Jahr verteilt, lange vorbereitet. Wer alles spontan macht, hat nie etwas, worauf sich jemand freuen kann.", stufe: "meister" },
|
||
{ schluessel: "community-uebernimmt-teile-selbst", titel: "Die Community übernimmt Teile selbst", text: "Wettbewerbe, Aufräumaktionen, Begrüßung von Neuen -- von Mitgliedern geführt. Was ohne dich läuft, hält auch dann, wenn du eine Woche fehlst.", stufe: "meister" },
|
||
{ schluessel: "aktion-wird-hinterher-ausgewertet", titel: "Nach jeder Aktion eine Auswertung", text: "Aufwand, Ergebnis, was beim nächsten Mal anders wird -- eine halbe Seite. Ohne sie macht man dieselbe Aktion in zwei Jahren genauso mühsam.", stufe: "meister" },
|
||
{ schluessel: "kooperation-mit-anderen-kanaelen", titel: "Feste Zusammenarbeit mit anderen Kanälen", text: "Nicht ein einmaliger Besuch, sondern eine wiederkehrende Verabredung. Zwei Gemeinschaften, die sich kennen, sind stabiler als zwei, die sich einmal gesehen haben.", stufe: "meister" },
|
||
{ schluessel: "spendenaktion-sauber-abgerechnet", titel: "Spendenaktionen sauber abgerechnet", text: "Beleg, Empfänger, Summe -- und öffentlich nachlesbar. An dieser Stelle verliert man Vertrauen nur einmal.", stufe: "meister" },
|
||
],
|
||
konflikt: [
|
||
{ schluessel: "ruhig-bleiben-und-nicht-oeffentlich-stre", titel: "Ruhig bleiben und nicht oeffentlich streiten", text: "Im Chat gewinnt niemand. Kurz ansagen, dann privat klaeren.", stufe: "anfaenger" },
|
||
{ schluessel: "was-ist-genau-passiert", titel: "Was ist genau passiert?", text: "Zeitpunkt, Beteiligte, Wortlaut. Ohne das ist jede Entscheidung angreifbar.", stufe: "anfaenger" },
|
||
{ schluessel: "beweise-sichern", titel: "Beweise sichern", text: "Bildschirmfoto oder Ausschnitt, solange es noch da ist. Chats verschwinden.", stufe: "fort" },
|
||
{ schluessel: "betreuung-einbeziehen", titel: "Betreuung einbeziehen", text: "Bei allem, was groesser ist als ein blöder Kommentar. Dafuer ist sie da.", stufe: "anfaenger" },
|
||
{ schluessel: "danach-was-hat-gefehlt", titel: "Danach: was hat gefehlt?", text: "Regel unklar, niemand zum Eingreifen da, zu spaet gemerkt -- daraus wird der naechste Punkt oben.", stufe: "fort" },
|
||
{ schluessel: "entscheidung-dokumentiert", titel: "Entscheidung dokumentiert, nicht nur getroffen", text: "Wer, wann, warum, welche Stufe. Beim zweiten Mal mit derselben Person ist das der Unterschied zwischen 'wir haben da was' und 'ich glaube'.", stufe: "profi" },
|
||
{ schluessel: "regel-nachgezogen", titel: "Regel nachgezogen, damit es nicht wiederkommt", text: "Ein Vorfall, der von keiner Regel gedeckt war, ist eine Luecke -- kein Einzelfall. Die Regel wird ergaenzt, nicht der Fall vergessen.", stufe: "meister" },
|
||
{ schluessel: "gleich-behandelt-nicht-nach-sympathie", titel: "Gleich behandelt, nicht nach Sympathie", text: "Dieselbe Regel für Stammgast und Fremden. Eine Ausnahme kostet mehr Vertrauen als zehn Sperren.", stufe: "fort" },
|
||
|
||
/* ===== PROFI UND MEISTER, AUSGEBAUT (09.09.2026) =================
|
||
Filipe: "ich will dass die 2 kategorien profi und meister überall
|
||
noch mehr perfektionniert werden. ich will dass da noch mehr
|
||
aufgeben und möglichkeiten sind."
|
||
|
||
Gezählt statt geschätzt: konflikt hatte EINEN Punkt fuer Profi und EINEN fuer Meister.
|
||
Die oberen beiden Ränge waren die dünnsten von allen -- genau
|
||
verkehrt herum. Wer schon alles kann, was auf der Liste steht,
|
||
findet dort nichts mehr; und Meisterschaft ist der Rang, in dem
|
||
man am längsten bleibt. ================================== */
|
||
{ schluessel: "erst-privat-dann-oeffentlich", titel: "Erst unter vier Augen, dann öffentlich", text: "Wer öffentlich zurechtgewiesen wird, verteidigt sich, statt zuzuhören. Öffentlich wird nur, was alle angeht.", stufe: "profi" },
|
||
{ schluessel: "zum-verhalten-nicht-zur-person", titel: "Zum Verhalten, nicht zur Person", text: "Gesagt wird, was der Satz anrichtet -- nicht, was für ein Mensch jemand ist. Das eine kann er ändern, das andere nur bestreiten.", stufe: "profi" },
|
||
{ schluessel: "beleg-vor-der-entscheidung", titel: "Beleg vor der Entscheidung", text: "Bildschirmfoto oder Ausschnitt sichern, bevor gelöscht wird. Nach dem Löschen steht Aussage gegen Aussage.", stufe: "profi" },
|
||
{ schluessel: "keine-diskussion-waehrend-der-sendung", titel: "Keine Aufarbeitung während der Sendung", text: "Der Streit gehört nicht in die Zeit, in der alle anderen zusehen. Vertagen ist keine Schwäche, sondern der einzige Weg, in dem es später gut ausgeht.", stufe: "profi" },
|
||
{ schluessel: "zweite-meinung-vor-dem-ausschluss", titel: "Zweite Meinung vor einem Ausschluss", text: "Ein dauerhafter Ausschluss wird von zwei Leuten getragen. Allein entscheidet man in dem Moment, in dem man am wenigsten ruhig ist.", stufe: "profi" },
|
||
{ schluessel: "weg-zurueck-ist-beschrieben", titel: "Es gibt einen beschriebenen Weg zurück", text: "Wer gesperrt wurde, weiß, wie er sich melden kann und was dann passiert. Eine Sperre ohne Weg zurück macht aus einem Streit einen Gegner.", stufe: "meister" },
|
||
{ schluessel: "konfliktfaelle-werden-nachbesprochen", titel: "Fälle werden im Team nachbesprochen", text: "Einmal im Monat die schwierigen Fälle durchgehen. Nicht um zu richten, sondern damit beim nächsten Mal alle gleich reagieren.", stufe: "meister" },
|
||
{ schluessel: "eigene-fehler-werden-eingeraeumt", titel: "Eigene Fehlentscheidungen werden eingeräumt", text: "Öffentlich, kurz, ohne Umschweife. Eine zurückgenommene Sperre kostet weniger Ansehen als eine verteidigte falsche.", stufe: "meister" },
|
||
{ schluessel: "grenze-zwischen-naehe-und-privat", titel: "Die Grenze zwischen Nähe und privat ist gezogen", text: "Was geteilt wird und was nicht, steht vorher fest -- für dich und für das Team. Wer diese Linie erst im Streit zieht, zieht sie zu spät.", stufe: "meister" },
|
||
{ schluessel: "ausstieg-ohne-drama-moeglich", titel: "Auch ein Abschied läuft geordnet", text: "Wenn ein Moderator aufhört, werden Rechte entzogen und es wird kurz etwas gesagt. Ein stilles Verschwinden erzeugt Gerüchte, die länger bleiben als die Person.", stufe: "meister" },
|
||
],
|
||
};
|
||
|
||
/* =====================================================================
|
||
TECHNIK-PUNKTE
|
||
|
||
Technik faellt immer im ungeeignetsten Moment aus. Die Punkte sind
|
||
deshalb danach sortiert, was am haeufigsten schiefgeht -- und Ton
|
||
steht vorn, weil schlechter Ton der Grund Nummer eins ist, warum
|
||
Leute einen Stream verlassen.
|
||
===================================================================== */
|
||
|
||
export const TECHNIK_PUNKTE = {
|
||
setup: [
|
||
{ schluessel: "mikrofon-richtig-eingestellt", titel: "Mikrofon richtig eingestellt", text: "Nicht uebersteuert, nicht zu leise, kein Rauschen. Einmal aufnehmen und anhoeren.", stufe: "anfaenger" },
|
||
{ schluessel: "kamera-scharf-und-gut-belichtet", titel: "Kamera scharf und gut belichtet", text: "Gesicht heller als der Hintergrund. Automatik oft abschalten -- sie pumpt.", stufe: "anfaenger" },
|
||
{ schluessel: "szenen-im-streaming-programm-angelegt", titel: "Szenen im Streaming-Programm angelegt", text: "Start, Vollbild, Pause, Ende. Wer waehrend der Sendung baut, sendet Chaos.", stufe: "fort" },
|
||
{ schluessel: "bitrate-zur-leitung-passend", titel: "Bitrate zur Leitung passend", text: "Lieber stabil und etwas weicher als scharf mit Aussetzern.", stufe: "fort" },
|
||
{ schluessel: "alles-einmal-komplett-getestet", titel: "Alles einmal komplett getestet", text: "Eine Probesendung von fuenf Minuten, aufgezeichnet und angesehen.", stufe: "anfaenger" },
|
||
{ schluessel: "tonfilter-in-der-richtigen-reihenfolge", titel: "Tonfilter in der richtigen Reihenfolge", text: "Erst Rauschunterdrueckung, dann Kompressor, dann Rauschsperre. Die Reihenfolge ist nicht beliebig: Ein Kompressor vor der Rauschunterdrueckung hebt das Rauschen mit an.", stufe: "profi" },
|
||
{ schluessel: "hardware-encoder-statt-prozessor", titel: "Hardware-Encoder statt Prozessor", text: "Wenn die Grafikkarte einen eigenen Encoder hat, uebernimmt der das Kodieren -- der Prozessor bleibt frei fuer alles andere. Das ist der groesste Einzelgewinn an Stabilitaet.", stufe: "profi" },
|
||
{ schluessel: "szenen-und-filter-gesichert", titel: "Szenen und Filter gesichert", text: "Die ganze Einrichtung als Sammlung exportiert und abgelegt. Nach einem Rechnerwechsel ist das der Unterschied zwischen zehn Minuten und einem Abend.", stufe: "meister" },
|
||
|
||
/* --- Aus der Recherche vom 09.09.2026 --- */
|
||
{ schluessel: "mikrofon-abstand-und-winkel", titel: "Abstand und Winkel des Mikrofons", text: "Fünf bis zehn Zentimeter, leicht seitlich gesprochen. Näher dran und leiser aufgedreht ist die beste Verbesserung, die nichts kostet.", stufe: "anfaenger" },
|
||
{ schluessel: "tonspur-mit-160-kbit", titel: "Tonspur mit 160 kbit/s", text: "Darunter klingt Sprache dumpf, darüber nimmt es dem Bild die Bandbreite. 160 ist der übliche Wert für Stimme.", stufe: "fort" },
|
||
{ schluessel: "bildrate-im-spiel-begrenzt", titel: "Bildrate im Spiel begrenzt", text: "Ein ungebremstes Spiel nimmt dem Encoder die Luft. Ein Deckel bei 60 oder 120 behebt die meisten Ruckler.", stufe: "fort" },
|
||
{ schluessel: "lautheit-gemessen", titel: "Lautheit gemessen, nicht geschätzt", text: "Zielbereich minus 20 bis minus 24 LUFS, Begrenzer bei minus 3. Wer nach Gefühl aussteuert, ist entweder leiser als alle anderen oder übersteuert.", stufe: "profi" },
|
||
|
||
/* ===== PROFI UND MEISTER, AUSGEBAUT (09.09.2026) =================
|
||
Filipe: "ich will dass die 2 kategorien profi und meister überall
|
||
noch mehr perfektionniert werden. ich will dass da noch mehr
|
||
aufgeben und möglichkeiten sind."
|
||
|
||
Gezählt statt geschätzt: setup hatte 3 Punkte fuer Profi und EINEN fuer Meister.
|
||
Die oberen beiden Ränge waren die dünnsten von allen -- genau
|
||
verkehrt herum. Wer schon alles kann, was auf der Liste steht,
|
||
findet dort nichts mehr; und Meisterschaft ist der Rang, in dem
|
||
man am längsten bleibt. ================================== */
|
||
{ schluessel: "kabel-statt-funk-zum-netz", titel: "Kabel statt Funk zum Netz", text: "Ein Netzwerkkabel ist kein Luxus, sondern der Unterschied zwischen gleichmäßig und manchmal. Funk teilt sich die Luft mit allem anderen im Haus.", stufe: "profi" },
|
||
{ schluessel: "bitrate-mit-reserve-gewaehlt", titel: "Bitrate mit Reserve gewählt", text: "Höchstens 70 bis 80 Prozent des gemessenen Uploads. Die Reserve fängt genau die Schwankungen ab, die sonst zu verworfenen Bildern werden.", stufe: "profi" },
|
||
{ schluessel: "ton-mit-160-kbit-uebertragen", titel: "Ton mit mindestens 160 kbit übertragen", text: "Beim Bild fällt eine Stufe weniger auf als beim Ton. Schlechten Ton schalten Zuschauer schneller weg als ein weiches Bild.", stufe: "profi" },
|
||
{ schluessel: "farben-und-weissabgleich-fest", titel: "Farben und Weißabgleich festgestellt", text: "Automatik ausschalten und Werte notieren. Eine Kamera, die selbst nachregelt, verändert die Farbe mitten im Satz, sobald sich das Licht ändert.", stufe: "profi" },
|
||
{ schluessel: "zwei-wege-ins-netz", titel: "Zwei Wege ins Netz, getrennte Anbieter", text: "Kabel als erster Weg, Mobilfunk als zweiter -- und der zweite ist getestet. Ein Ersatzweg, den man im Ausfall erst einrichtet, ist keiner.", stufe: "meister" },
|
||
{ schluessel: "ersatzgeraet-fuer-jedes-teil", titel: "Für jedes tragende Teil ein Ersatz", text: "Mikrofon, Kamera, Kabel. Nicht neu gekauft, sondern das ausrangierte behalten -- es muss nicht gut sein, es muss da sein.", stufe: "meister" },
|
||
{ schluessel: "stromausfall-ueberbrueckt", titel: "Kurze Stromunterbrechung überbrückt", text: "Eine kleine unterbrechungsfreie Versorgung für Rechner und Netzgerät. Zehn Minuten reichen, um die Sendung ordentlich zu beenden statt abzubrechen.", stufe: "meister" },
|
||
{ schluessel: "einstellungen-versioniert-abgelegt", titel: "Einstellungen mit Datum abgelegt", text: "Nicht nur gesichert, sondern in Ständen. Nach einer Änderung, die alles verschlimmert, will man auf gestern zurück und nicht auf irgendwann.", stufe: "meister" },
|
||
{ schluessel: "aufbau-ist-dokumentiert", titel: "Der Aufbau ist aufgezeichnet", text: "Ein Bild und eine Seite: Was hängt woran, welche Einstellung wo. Nach einem Umzug oder Rechnertausch spart das einen ganzen Abend.", stufe: "meister" },
|
||
],
|
||
problem: [
|
||
{ schluessel: "ton-weg-oder-verzerrt", titel: "Ton weg oder verzerrt", text: "Wann genau, welches Geraet, was lief gleichzeitig? Ohne das findet es niemand.", stufe: "anfaenger" },
|
||
{ schluessel: "bild-ruckelt-oder-friert-ein", titel: "Bild ruckelt oder friert ein", text: "Auslastung, Leitung, Aufloesung -- eins nach dem anderen ausschliessen.", stufe: "anfaenger" },
|
||
{ schluessel: "stream-bricht-ab", titel: "Stream bricht ab", text: "Zeitpunkt notieren und im Protokoll des Programms nachsehen.", stufe: "fort" },
|
||
{ schluessel: "ton-und-bild-laufen-auseinander", titel: "Ton und Bild laufen auseinander", text: "Meist ein Puffer. Wann faellt es auf, sofort oder erst spaeter?", stufe: "fort" },
|
||
{ schluessel: "verworfene-bilder-abgelesen", titel: "Verworfene Bilder abgelesen, nicht geraten", text: "Das Programm zeigt, ob Bilder wegen der Leitung oder wegen des Kodierens verloren gehen. Das sind zwei verschiedene Fehler mit zwei verschiedenen Loesungen.", stufe: "profi" },
|
||
{ schluessel: "ausfall-mit-datum-festgehalten", titel: "Ausfall mit Datum festgehalten", text: "Jeder Ausfall bekommt einen Eintrag. Erst die Liste zeigt, ob es dasselbe Problem ist oder drei verschiedene.", stufe: "meister" },
|
||
{ schluessel: "statistikfenster-offen-gehabt", titel: "Statistikfenster offen gehabt", text: "Verworfene Bilder und Renderverzögerung stehen dort in Echtzeit. Hinterher raten kostet mehr Zeit als vorher hinsehen.", stufe: "fort" },
|
||
{ schluessel: "netz-oder-rechner-unterschieden", titel: "Netz oder Rechner unterschieden", text: "Verworfene Bilder kommen vom Netz, ausgelassene vom Encoder. Verschiedene Ursachen, verschiedene Lösungen – erst trennen, dann handeln.", stufe: "profi" },
|
||
|
||
/* ===== PROFI UND MEISTER, AUSGEBAUT (09.09.2026) =================
|
||
Filipe: "ich will dass die 2 kategorien profi und meister überall
|
||
noch mehr perfektionniert werden. ich will dass da noch mehr
|
||
aufgeben und möglichkeiten sind."
|
||
|
||
Gezählt statt geschätzt: problem hatte 2 Punkte fuer Profi und EINEN fuer Meister.
|
||
Die oberen beiden Ränge waren die dünnsten von allen -- genau
|
||
verkehrt herum. Wer schon alles kann, was auf der Liste steht,
|
||
findet dort nichts mehr; und Meisterschaft ist der Rang, in dem
|
||
man am längsten bleibt. ================================== */
|
||
{ schluessel: "problem-eingekreist-statt-geraten", titel: "Das Problem eingekreist statt geraten", text: "Tritt es auch ohne Spiel auf? Auch mit anderem Mikrofon? Jede Antwort halbiert die Suche; Raten halbiert gar nichts.", stufe: "profi" },
|
||
{ schluessel: "zeitpunkt-des-fehlers-notiert", titel: "Zeitpunkt des Fehlers notiert", text: "Uhrzeit und was gerade lief. Protokolle sind nach Zeit sortiert -- ohne die Uhrzeit sucht man in einer Datei mit zehntausend Zeilen.", stufe: "profi" },
|
||
{ schluessel: "fehler-reproduzierbar-gemacht", titel: "Den Fehler absichtlich auslösen können", text: "Was sich nicht wiederholen lässt, kann man nicht prüfen -- und damit auch nicht als behoben melden.", stufe: "profi" },
|
||
{ schluessel: "schwelle-fuer-den-abbruch", titel: "Eine Schwelle, ab der abgebrochen wird", text: "Vorher festlegen, wann eine Sendung beendet statt gerettet wird. Im Moment selbst entscheidet man immer für Weitermachen, und meistens falsch.", stufe: "meister" },
|
||
{ schluessel: "fehler-werden-gesammelt", titel: "Fehler werden gesammelt, nicht nur behoben", text: "Eine Liste mit Datum, Ursache, Lösung. Erst die Sammlung zeigt, dass dasselbe Teil zum vierten Mal ausgefallen ist.", stufe: "meister" },
|
||
{ schluessel: "wiederkehrende-fehler-an-der-wurzel", titel: "Wiederkehrende Fehler an der Wurzel", text: "Beim dritten Mal wird nicht mehr repariert, sondern ersetzt oder umgebaut. Dreimal dieselbe Reparatur kostet mehr als der Umbau.", stufe: "meister" },
|
||
{ schluessel: "ausfall-wird-dem-publikum-gesagt", titel: "Ein Ausfall wird angesagt", text: "Ein Satz, was los ist und wann es weitergeht. Zuschauer verzeihen Technik; sie verzeihen nicht, wenn niemand etwas sagt.", stufe: "meister" },
|
||
],
|
||
loesung: [
|
||
{ schluessel: "was-hat-es-behoben", titel: "Was hat es behoben?", text: "Genau die eine Aenderung aufschreiben, nicht alles was probiert wurde.", stufe: "anfaenger" },
|
||
{ schluessel: "kommt-es-wieder", titel: "Kommt es wieder?", text: "Beim naechsten Mal nachsehen. Einmal weg ist nicht geloest.", stufe: "fort" },
|
||
{ schluessel: "einstellung-gesichert", titel: "Einstellung gesichert", text: "Damit sie nach einem Update nicht wieder weg ist.", stufe: "fort" },
|
||
{ schluessel: "genau-eine-aenderung-je-versuch", titel: "Genau eine Aenderung je Versuch", text: "Wer drei Dinge gleichzeitig aendert und es geht wieder, weiss nicht warum -- und beim naechsten Mal steht man wieder am Anfang.", stufe: "profi" },
|
||
{ schluessel: "loesung-als-anleitung-abgelegt", titel: "Loesung als Anleitung abgelegt", text: "So aufgeschrieben, dass jemand anderes sie nachvollziehen kann. Eine Loesung im Kopf einer Person ist keine Loesung des Teams.", stufe: "meister" },
|
||
{ schluessel: "profile-ausserhalb-gesichert", titel: "Profile außerhalb des Rechners gesichert", text: "Szenen, Filter und Profile auf einen zweiten Datenträger. Ein Rechnerschaden kostet sonst zwei Abende Wiederaufbau.", stufe: "meister" },
|
||
|
||
/* ===== PROFI UND MEISTER, AUSGEBAUT (09.09.2026) =================
|
||
Filipe: "ich will dass die 2 kategorien profi und meister überall
|
||
noch mehr perfektionniert werden. ich will dass da noch mehr
|
||
aufgeben und möglichkeiten sind."
|
||
|
||
Gezählt statt geschätzt: loesung hatte EINEN Punkt fuer Profi und 2 fuer Meister.
|
||
Die oberen beiden Ränge waren die dünnsten von allen -- genau
|
||
verkehrt herum. Wer schon alles kann, was auf der Liste steht,
|
||
findet dort nichts mehr; und Meisterschaft ist der Rang, in dem
|
||
man am längsten bleibt. ================================== */
|
||
{ schluessel: "loesung-nach-der-sendung-geprueft", titel: "Die Lösung nach der Sendung noch einmal geprüft", text: "Was mitten im Betrieb funktioniert hat, funktioniert nicht immer beim nächsten Start. Einmal kalt nachstellen.", stufe: "profi" },
|
||
{ schluessel: "zwischenloesung-als-solche-benannt", titel: "Zwischenlösung als solche benannt", text: "Wenn es nur ein Pflaster ist, wird das dazugeschrieben -- mit Frist. Ein vergessenes Pflaster ist die Ursache des übernächsten Ausfalls.", stufe: "profi" },
|
||
{ schluessel: "aenderung-nur-vor-der-sendung", titel: "Änderungen nur vor der Sendung, nie kurz davor", text: "Wer eine Stunde vor dem Start noch etwas umstellt, sendet mit einem ungetesteten Aufbau. Änderungen gehören an einen sendefreien Tag.", stufe: "profi" },
|
||
{ schluessel: "rueckweg-vorher-bedacht", titel: "Der Rückweg wird vorher bedacht", text: "Vor jeder Änderung notieren, wie man sie rückgängig macht. Ohne diesen Satz ist jede Änderung eine Wette.", stufe: "profi" },
|
||
{ schluessel: "hilfe-holen-hat-eine-frist", titel: "Hilfe holen hat eine Frist", text: "Nach dreißig Minuten ohne Fortschritt wird gefragt, nicht weiter probiert. Die halbe Stunde ist die Grenze, ab der Suchen teurer ist als Fragen.", stufe: "profi" },
|
||
{ schluessel: "anleitungen-liegen-zentral", titel: "Anleitungen liegen zentral, nicht im Kopf", text: "Auffindbar für alle, in einfachen Worten, mit Datum. Wissen, das nur eine Person hat, ist ein Ausfall mit Verzögerung.", stufe: "meister" },
|
||
{ schluessel: "wiederherstellung-einmal-geprobt", titel: "Die Wiederherstellung einmal geprobt", text: "Eine Sicherung, die nie zurückgespielt wurde, ist eine Hoffnung. Einmal auf einem zweiten Rechner aufsetzen -- dann weiß man, wie lange es dauert.", stufe: "meister" },
|
||
{ schluessel: "aenderungen-werden-mitgeschrieben", titel: "Änderungen werden mitgeschrieben", text: "Datum, was geändert, warum. Nach vier Wochen erinnert sich niemand, warum eine Einstellung so steht, wie sie steht.", stufe: "meister" },
|
||
{ schluessel: "jemand-anderes-kann-es-auch", titel: "Jemand anderes kann es auch", text: "Mindestens eine zweite Person kennt den Aufbau. Solange nur einer ihn beherrscht, ist der Kanal an einen Menschen gebunden statt an ein Verfahren.", stufe: "meister" },
|
||
],
|
||
};
|
||
export const CALL_LEITFAEDEN = [
|
||
{ schluessel: "erstgespraech", titel: "Erstgespräch",
|
||
text: "Wer bist du, was machst du, was willst du erreichen? · Was läuft schon gut? · "
|
||
+ "Was nervt dich gerade am meisten? · Wie viel Zeit hast du wirklich? · "
|
||
+ "Was erwartest du von uns – und was erwarten wir von dir?" },
|
||
{ schluessel: "wochen-call", titel: "Wochen-Call",
|
||
text: "Was ist seit dem letzten Mal passiert? · Was ist liegen geblieben und warum? · "
|
||
+ "Zahlen kurz ansehen – eine Auffälligkeit reicht · Was steht diese Woche an? · "
|
||
+ "Brauchst du irgendwo Hilfe?" },
|
||
{ schluessel: "wenn-es-gerade-nicht-laeuft", titel: "Wenn es gerade nicht läuft",
|
||
text: "Zuerst zuhören, nicht lösen · Seit wann geht es so? · Was hat sich geändert? · "
|
||
+ "Was war das letzte Mal, als es gut war? · Eine kleine Sache vereinbaren, "
|
||
+ "nicht fünf große" },
|
||
{ schluessel: "monats-review", titel: "Monats-Review",
|
||
text: "Die drei Ziele vom letzten Mal durchgehen · Was ist erreicht, was nicht? · "
|
||
+ "Woran lag es – Zeit, Können oder Motivation? · Drei neue Ziele, verbindlich · "
|
||
+ "Termin für das nächste Review festhalten" },
|
||
];
|
||
|
||
/* Erst hier gefuellt -- die Listen stehen weiter oben und muessen
|
||
definiert sein, bevor sie eingetragen werden. */
|
||
BEREICH_PUNKTE.live = LIVE_PUNKTE;
|
||
BEREICH_PUNKTE.community = COMMUNITY_PUNKTE;
|
||
BEREICH_PUNKTE.technik = TECHNIK_PUNKTE;
|
||
|
||
/* ---------- Schnittstelle ------------------------------------------------ */
|
||
|
||
function angemeldet(req, res, next) {
|
||
const person = sitzungLesen(req);
|
||
if (!person) return res.status(401).json({ fehler: "nicht_angemeldet" });
|
||
req.person = person;
|
||
next();
|
||
}
|
||
|
||
/* =====================================================================
|
||
AUFGABEN-VORLAGEN — vier Bereiche, vier Stufen, drei Aufgaben je Feld
|
||
|
||
Filipe (09.09.2026): "ich will dass du die vier klassen ueberall mit
|
||
aufgaben perfektionnierst ... die 4 kategorien ueberall perfekt
|
||
angepasst, mit perfekt kategorien und aufgaben."
|
||
|
||
WARUM ES DAS BRAUCHT. Die Checkliste sagt, WAS sitzen muss. Sie sagt
|
||
nicht, was jemand als Naechstes TUT. Zwischen "Ton ist der Grund
|
||
Nummer eins" und einem Abend, an dem der Ton wirklich besser wird,
|
||
liegt eine Aufgabe mit Frist und Verantwortlichem -- und die gab es
|
||
bisher nur, wenn jemand sie von Hand tippte.
|
||
|
||
WARUM DREI JE FELD UND NICHT ZEHN. Wer zehn Aufgaben bekommt, macht
|
||
keine. Drei sind ein Abend, eine Woche, ein Monat -- in dieser
|
||
Reihenfolge, und die Fristen sind entsprechend gestaffelt.
|
||
|
||
WIE DIE STUFEN GEMEINT SIND (Dreyfus-Modell, wie in der Checkliste):
|
||
anfaenger Was ohne Weiteres nicht geht. Meist an einem Abend zu tun.
|
||
fort Aus Zufall wird Routine. Braucht Wiederholung, also Wochen.
|
||
profi Gemessen statt geschaetzt: ein Wert, ein Versuch, ein Beleg.
|
||
meister Was ohne dich weiterlaeuft: Vorlage, Vertretung, Ablage.
|
||
|
||
`tage` ist der Vorschlag fuer die Frist, gerechnet ab dem Tag der
|
||
Uebernahme. Er ist kein Zierrat: Eine Aufgabe ohne Frist ist ein
|
||
Wunsch. Die Zahlen folgen der Stufe -- Anfaengeraufgaben in Tagen,
|
||
Meisteraufgaben in Wochen.
|
||
|
||
Die Sachaussagen stammen aus derselben Recherche wie die
|
||
Checklistenpunkte (siehe dort): Lautheit -20 bis -24 LUFS,
|
||
Tonspur 160 kbit/s, Ankuendigung 30 bis 60 Minuten vorher,
|
||
Verweildauer ueber 15 Minuten als Zeichen, dass die Stimmung traegt,
|
||
Eskalation in vier Stufen.
|
||
===================================================================== */
|
||
|
||
/* =====================================================================
|
||
DER AUFGABENKATALOG AUS TEIL 2 DES ANFORDERUNGSDOKUMENTS (10.09.2026)
|
||
|
||
60 fertig ausformulierte Aufgaben, sortiert nach den sechs Etappen des
|
||
Dokuments. Kapitel 14 sagt dazu: "Alle Aufgaben dieses Katalogs koennen
|
||
1:1 als Vorlagen in die App importiert werden -- inklusive Kategorie,
|
||
empfohlener Rolle und Frequenz. So ist das Aufgaben-Board ab dem
|
||
ersten Tag vollstaendig befuellt, statt leer zu starten."
|
||
|
||
NEUN GRUPPEN, NICHT SECHS. Das Dokument hat sechs Phasen, aber Phase 3
|
||
zerfaellt in Vor/Waehrend/Nach und Phase 5 in Woche/Monat -- und das
|
||
sind fuer den, der davorsitzt, verschiedene Momente. "Waehrend des
|
||
Lives" sucht man nicht in derselben Liste wie "einmal im Monat".
|
||
|
||
DIE KATEGORIEN SIND DIE DES DOKUMENTS, nicht meine. Beim ersten Anlauf
|
||
hatte ich sie auf acht zusammengefasst, mit der Begruendung, dreizehn
|
||
Knoepfe seien auf einem Handy unbedienbar. Das war eine plausible
|
||
Erklaerung fuer etwas Falsches: Gebaut ist ein AUSWAHLFELD, keine
|
||
Knopfleiste, und darin sind vierzehn Eintraege voellig unauffaellig.
|
||
Jetzt passt jede Aufgabe genau auf die Kategorie, die im Dokument
|
||
danebensteht -- ohne Uebersetzung, die spaeter niemand nachvollziehen
|
||
kann.
|
||
|
||
DIE TEXTE SIND NEU. Das Dokument nennt nur die Titel; ein Titel allein
|
||
("Eskalationsregeln definieren") sagt nicht, woran man erkennt, dass
|
||
man fertig ist. Jeder Satz hier nennt deshalb das eine, was zaehlt --
|
||
nicht drei, denn wer sich fuenf Dinge vornimmt, macht keines.
|
||
|
||
EINIGE AUFGABEN AUS PHASE 1 SIND LAENGST ERLEDIGT (die Subdomain
|
||
steht, das App-Symbol auch). Sie bleiben trotzdem drin: Der Katalog
|
||
ist eine Speisekarte, kein Auftrag. Wer ihn spaeter fuer ein zweites
|
||
Team benutzt, braucht sie wieder.
|
||
===================================================================== */
|
||
|
||
export const MODI_GRUPPEN = [
|
||
{ schluessel: "aufbau", name: "Aufbau & Einrichtung",
|
||
text: "Einmaliges, bevor das Team startklar ist." },
|
||
{ schluessel: "alltag", name: "Täglicher Betrieb",
|
||
text: "Was an (fast) jedem Tag anfällt." },
|
||
{ schluessel: "vor", name: "Vor dem Live",
|
||
text: "Die letzten 30 bis 60 Minuten davor." },
|
||
{ schluessel: "waehrend", name: "Während des Lives",
|
||
text: "Was jetzt passiert, lässt sich später nicht nachholen." },
|
||
{ schluessel: "nach", name: "Nach dem Live",
|
||
text: "Solange man es noch weiß." },
|
||
{ schluessel: "content", name: "Content & Reichweite",
|
||
text: "Aus einer Sendung werden viele Videos." },
|
||
{ schluessel: "woche", name: "Jede Woche",
|
||
text: "Der Rhythmus, der das Team zusammenhält." },
|
||
{ schluessel: "monat", name: "Jeden Monat",
|
||
text: "Der Blick, den der Alltag nicht hergibt." },
|
||
{ schluessel: "community", name: "Community & Wachstum",
|
||
text: "Wiedererkannt zu werden ist der halbe Grund wiederzukommen." },
|
||
];
|
||
|
||
export const MODI_KATALOG = [
|
||
/* ---------- Phase 1 — Aufbau & Einrichtung ------------------------- */
|
||
{ schluessel: "mk-domain", gruppe: "aufbau", kategorie: "technik", rolle: "DogFather", tage: 14,
|
||
titel: "Domain und Subdomain für die App einrichten",
|
||
text: "Eine eigene Subdomain, nicht ein Unterordner. Nur so lässt sich die App auf dem Handy wirklich installieren statt nur als Verknüpfung abzulegen." },
|
||
{ schluessel: "mk-symbol", gruppe: "aufbau", kategorie: "branding", rolle: "DogFather", tage: 14,
|
||
titel: "App-Symbol, Startbild und Farben aus dem Logo ableiten",
|
||
text: "Einmal auf einem echten Handy ansehen, nicht nur am großen Bildschirm. Ein Symbol, das bei 48 Pixeln zu Matsch wird, fällt sonst erst nach der Installation auf." },
|
||
{ schluessel: "mk-kategorien", gruppe: "aufbau", kategorie: "organisation", rolle: "DogFather", tage: 7,
|
||
titel: "Grundkategorien im Aufgaben-Board anlegen",
|
||
text: "Chat-Moderation, Clipping, Social Media, Events, Technik. Lieber mit wenigen anfangen und ergänzen als mit zwanzig, von denen zwölf leer bleiben." },
|
||
{ schluessel: "mk-rechte-hand", gruppe: "aufbau", kategorie: "team", rolle: "DogFather", tage: 7,
|
||
titel: "Die rechte Hand festlegen und einladen",
|
||
text: "Eine Person, nicht zwei. Wer vertreten soll, muss im Zweifel allein entscheiden dürfen – sonst ist es keine Vertretung." },
|
||
{ schluessel: "mk-erste-modis", gruppe: "aufbau", kategorie: "team", rolle: "DogFather & rechte Hand", tage: 14,
|
||
titel: "Den ersten Kreis an Modis einladen (Probezeit)",
|
||
text: "Lieber drei, die man kennt, als zehn, die man einschätzen muss. Erweitern geht immer, zurücknehmen kostet Vertrauen." },
|
||
{ schluessel: "mk-rulebook", gruppe: "aufbau", kategorie: "organisation", rolle: "DogFather & rechte Hand", tage: 14,
|
||
titel: "Team-Regeln und Erwartungen aufschreiben",
|
||
text: "Was schriftlich steht, muss man nicht dreimal erklären – und niemand muss raten, was gemeint war. Eine Seite reicht." },
|
||
{ schluessel: "mk-eskalation", gruppe: "aufbau", kategorie: "organisation", rolle: "DogFather & rechte Hand", tage: 7,
|
||
titel: "Eskalationsregeln festlegen",
|
||
text: "Ab wann entscheidet ein Modi nicht mehr allein? Wer das erst im Ernstfall klärt, klärt es zu spät und vor Publikum." },
|
||
{ schluessel: "mk-kanaele", gruppe: "aufbau", kategorie: "kommunikation", rolle: "DogFather", tage: 3,
|
||
titel: "Team-Gruppenchat und Kategorie-Kanäle anlegen",
|
||
text: "Ein Kanal je Zuständigkeit, nicht je Person. Wer wechselt, nimmt sonst das Gespräch mit." },
|
||
{ schluessel: "mk-kalender-start", gruppe: "aufbau", kategorie: "planung", rolle: "rechte Hand", tage: 3,
|
||
titel: "Team-Kalender mit den ersten Live-Terminen füllen",
|
||
text: "Zwei feste Tage schlagen fünf zufällige. Ein Termin, der im Kalender steht, lässt sich einteilen – einer im Kopf nicht." },
|
||
{ schluessel: "mk-automod", gruppe: "aufbau", kategorie: "chat", rolle: "Modi (Senior)", tage: 7,
|
||
titel: "Automatische Wortfilter für den Live-Chat einrichten",
|
||
text: "Erst die Liste, dann der Stream. Was der Filter wegnimmt, muss niemand von Hand wegnehmen – und niemand liest es." },
|
||
{ schluessel: "mk-checkliste-vorlage", gruppe: "aufbau", kategorie: "organisation", rolle: "DogFather & rechte Hand", tage: 7,
|
||
titel: "Vorlage für die Vor-/Während-/Nach-Live-Checkliste anlegen",
|
||
text: "Einmal geschrieben, bei jedem Live benutzt. Nach drei Sendungen anpassen – dann weiß man, was wirklich draufgehört." },
|
||
{ schluessel: "mk-social-verknuepfen", gruppe: "aufbau", kategorie: "social", rolle: "Modi (Social Media)", tage: 14,
|
||
titel: "Social-Media-Kanäle mit der App verknüpfen",
|
||
text: "TikTok, Instagram, YouTube. Ohne Verknüpfung trägt jemand die Zahlen von Hand ab – und irgendwann nicht mehr." },
|
||
|
||
/* ---------- Phase 2 — Täglicher Betrieb ---------------------------- */
|
||
{ schluessel: "mk-teamchat-lesen", gruppe: "alltag", kategorie: "kommunikation", rolle: "rechte Hand", tage: 1,
|
||
titel: "Team-Chat auf offene Fragen durchsehen",
|
||
text: "Einmal am Tag reicht, aber es muss wirklich einmal sein. Eine Frage, die zwei Tage steht, wird nicht mehr gestellt." },
|
||
{ schluessel: "mk-board-sichten", gruppe: "alltag", kategorie: "organisation", rolle: "DogFather & rechte Hand", tage: 1,
|
||
titel: "Aufgaben-Board sichten: offen, überfällig, erledigt",
|
||
text: "Die überfälligen zuerst. Eine Aufgabe, die dauerhaft rot steht, ist entweder zu groß oder gehört abgebrochen." },
|
||
{ schluessel: "mk-termin-bestaetigen", gruppe: "alltag", kategorie: "planung", rolle: "rechte Hand", tage: 1,
|
||
titel: "Den heutigen Live-Termin bestätigen",
|
||
text: "Bestätigen oder absagen – beides früh. Wer nichts sagt, lässt das halbe Team auf Verdacht bereitstehen." },
|
||
{ schluessel: "mk-ankuendigung", gruppe: "alltag", kategorie: "social", rolle: "Modi (Social Media)", tage: 1,
|
||
titel: "Ankündigung für das heutige Live posten",
|
||
text: "30 bis 60 Minuten vorher. Sie bündelt die, die ohnehin kommen wollten – und ein voller Start zieht neue nach." },
|
||
{ schluessel: "mk-kommentare", gruppe: "alltag", kategorie: "community", rolle: "Modi (Community)", tage: 1,
|
||
titel: "Kommentare und Nachrichten beantworten",
|
||
text: "Auch die kurzen. Eine Antwort nach drei Tagen liest sich wie keine." },
|
||
{ schluessel: "mk-begruessen", gruppe: "alltag", kategorie: "community", rolle: "Modi", tage: 1,
|
||
titel: "Neue Mitglieder im Chat begrüßen",
|
||
text: "Mit Namen. Wer beim ersten Mal angesprochen wird, kommt deutlich häufiger wieder." },
|
||
{ schluessel: "mk-technikcheck", gruppe: "alltag", kategorie: "technik", rolle: "DogFather", tage: 1,
|
||
titel: "Technik-Kurzcheck vor dem Live",
|
||
text: "Ton, Bild, Verbindung – in dieser Reihenfolge. Schlechter Ton ist der Grund Nummer eins, warum Leute wieder gehen." },
|
||
{ schluessel: "mk-clip-taeglich", gruppe: "alltag", kategorie: "clipping", rolle: "Modi (Clipping)", tage: 1,
|
||
titel: "Mindestens einen Clip vom Live des Vortags veröffentlichen",
|
||
text: "Einer täglich schlägt fünf am Sonntag. Der Feed hat mehr Reichweite als der Stream – er ist der Weg dorthin." },
|
||
{ schluessel: "mk-trial-beobachten", gruppe: "alltag", kategorie: "team", rolle: "rechte Hand", tage: 1,
|
||
titel: "Stand der Modis in der Probezeit kurz festhalten",
|
||
text: "Zwei Zeilen genügen. Am Ende der Probezeit will man nicht aus der Erinnerung entscheiden müssen." },
|
||
|
||
/* ---------- Phase 3 — Vor dem Live --------------------------------- */
|
||
{ schluessel: "mk-vor-technik", gruppe: "vor", kategorie: "technik", rolle: "DogFather", tage: 1,
|
||
titel: "Technik-Check: Ton, Bild, Verbindung",
|
||
text: "Eine Minute aufnehmen und mit Kopfhörern anhören. Während der Sendung hört man sich selbst nie." },
|
||
{ schluessel: "mk-vor-ankuendigung", gruppe: "vor", kategorie: "social", rolle: "Modi (Social Media)", tage: 1,
|
||
titel: "Ankündigung auf Social Media und in den Community-Kanälen",
|
||
text: "Überall dasselbe Bild, überall dieselbe Uhrzeit. Zwei verschiedene Zeiten kosten mehr Zuschauer als gar keine Ankündigung." },
|
||
{ schluessel: "mk-vor-ablauf", gruppe: "vor", kategorie: "planung", rolle: "DogFather & rechte Hand", tage: 1,
|
||
titel: "Themen- und Ablaufplan abstimmen",
|
||
text: "Anfang, Mitte, Schluss – je zwei Stichworte. Mehr hält beim Senden ohnehin niemand im Kopf." },
|
||
{ schluessel: "mk-vor-schicht", gruppe: "vor", kategorie: "team", rolle: "rechte Hand", tage: 1,
|
||
titel: "Moderatoren für die heutige Schicht einteilen",
|
||
text: "Namentlich, nicht \"wer Zeit hat\". Zuständig ist sonst niemand, und im Ernstfall schaut man sich gegenseitig an." },
|
||
{ schluessel: "mk-vor-ziel", gruppe: "vor", kategorie: "planung", rolle: "DogFather", tage: 1,
|
||
titel: "Ein Ziel für die heutige Sendung festlegen",
|
||
text: "Eine einzige Zahl. Zwei Ziele sind keines – man verfehlt beide und weiß hinterher nicht, woran es lag." },
|
||
|
||
/* ---------- Phase 3 — Während des Lives ---------------------------- */
|
||
{ schluessel: "mk-live-chat", gruppe: "waehrend", kategorie: "chat", rolle: "Modi (Chat-Moderation)", tage: 1,
|
||
titel: "Chat moderieren und neue Zuschauer begrüßen",
|
||
text: "Spam weg, bevor jemand antwortet. Eine Diskussion über einen gelöschten Beitrag kostet mehr als der Beitrag." },
|
||
{ schluessel: "mk-live-zeit", gruppe: "waehrend", kategorie: "planung", rolle: "rechte Hand", tage: 1,
|
||
titel: "Ablaufplan und Zeit im Blick behalten",
|
||
text: "Ein kurzes Zeichen genügt. Wer sendet, hat kein Gefühl für die Uhr – das ist normal und braucht jemanden daneben." },
|
||
{ schluessel: "mk-live-interaktion", gruppe: "waehrend", kategorie: "community", rolle: "Modi", tage: 1,
|
||
titel: "Umfragen anstoßen und auf das Ziel hinweisen",
|
||
text: "Lieber zweimal beiläufig als einmal ausführlich. Wer erst in Minute 40 dazukommt, hat den Hinweis sonst nie gehört." },
|
||
{ schluessel: "mk-live-clips-merken", gruppe: "waehrend", kategorie: "clipping", rolle: "Modi (Clipping)", tage: 1,
|
||
titel: "Besondere Momente für Clips markieren",
|
||
text: "Mit Uhrzeit, sofort. Am nächsten Tag findet niemand die Stelle wieder, an der alle gelacht haben." },
|
||
{ schluessel: "mk-live-eskalation", gruppe: "waehrend", kategorie: "chat", rolle: "Modi (Senior)", tage: 1,
|
||
titel: "Regelverstöße nach der Eskalationsregel behandeln",
|
||
text: "Nach der Regel, nicht nach Gefühl. Im Chat gewinnt niemand – und eine begründete Sperre diskutiert man hinterher." },
|
||
|
||
/* ---------- Phase 3 — Nach dem Live -------------------------------- */
|
||
{ schluessel: "mk-nach-aufzeichnung", gruppe: "nach", kategorie: "technik", rolle: "DogFather", tage: 1,
|
||
titel: "Aufzeichnung sichern und ablegen",
|
||
text: "Noch am selben Abend. Eine Aufzeichnung, die nur auf dem Sendegerät liegt, ist keine Sicherung." },
|
||
{ schluessel: "mk-nach-clips", gruppe: "nach", kategorie: "clipping", rolle: "Modi (Clipping)", tage: 2,
|
||
titel: "Clips schneiden und veröffentlichen",
|
||
text: "Unter 60 Sekunden, Untertitel drauf. Der größte Teil wird ohne Ton geschaut – was dann nicht ankommt, kommt gar nicht an." },
|
||
{ schluessel: "mk-nach-feedback", gruppe: "nach", kategorie: "kommunikation", rolle: "alle", tage: 1,
|
||
titel: "Kurzes Team-Feedback im Team-Chat",
|
||
text: "Eine Sache, die gut lief, eine, die man ändert. Wer sich fünf vornimmt, ändert keine." },
|
||
{ schluessel: "mk-nach-zahlen", gruppe: "nach", kategorie: "analyse", rolle: "DogFather & rechte Hand", tage: 2,
|
||
titel: "Statistiken und Reichweite durchsehen",
|
||
text: "Vor allem die Verweildauer. Über 15 Minuten heißt: Die Stimmung trägt. Darunter liegt es fast nie am Thema, sondern am Anfang." },
|
||
|
||
/* ---------- Phase 4 — Content & Reichweite ------------------------- */
|
||
{ schluessel: "mk-momente-sichten", gruppe: "content", kategorie: "clipping", rolle: "Modi (Clipping)", tage: 1,
|
||
titel: "Beste Live-Momente sichten und auswählen",
|
||
text: "Nach jedem Live, solange man noch weiß, wo es gut war. Drei Kandidaten reichen." },
|
||
{ schluessel: "mk-clips-schneiden", gruppe: "content", kategorie: "clipping", rolle: "Modi (Clipping)", tage: 3,
|
||
titel: "Clips schneiden, Untertitel und Cover hinzufügen",
|
||
text: "Der erste Satz entscheidet. Über 70 Prozent steigen in den ersten drei Sekunden aus oder bleiben." },
|
||
{ schluessel: "mk-redaktionsplan", gruppe: "content", kategorie: "planung", rolle: "rechte Hand", tage: 7,
|
||
titel: "Redaktionsplan für die Woche befüllen",
|
||
text: "Thema, Kanal, Zeitpunkt – je Eintrag eine Zeile. Eine Idee ohne Termin ist eine Notiz." },
|
||
{ schluessel: "mk-veroeffentlichung-planen", gruppe: "content", kategorie: "social", rolle: "Modi (Social Media)", tage: 3,
|
||
titel: "Veröffentlichung auf den Plattformen planen",
|
||
text: "TikTok, Instagram, YouTube Shorts – nicht alle zur selben Minute. Dieselbe Sache dreimal gleichzeitig konkurriert mit sich selbst." },
|
||
{ schluessel: "mk-kennzahlen", gruppe: "content", kategorie: "analyse", rolle: "rechte Hand", tage: 7,
|
||
titel: "Reichweiten-Kennzahlen je Plattform erfassen",
|
||
text: "Immer dieselben Zahlen, immer am selben Wochentag. Wechselnde Zahlen ergeben eine Erzählung, keinen Vergleich." },
|
||
{ schluessel: "mk-bestformate", gruppe: "content", kategorie: "analyse", rolle: "DogFather & rechte Hand", tage: 30,
|
||
titel: "Bestlaufende Formate und Zeiten heraussuchen",
|
||
text: "Die drei besten und die drei schlechtesten nebeneinanderlegen. Der Unterschied steht meistens in den ersten Sekunden." },
|
||
{ schluessel: "mk-ideen-uebernehmen", gruppe: "content", kategorie: "planung", rolle: "rechte Hand", tage: 7,
|
||
titel: "Ideen aus dem Ideen-Board in den Redaktionsplan überführen",
|
||
text: "Wöchentlich zwei. Ein Ideen-Board, aus dem nie etwas herausgeht, ist ein Friedhof." },
|
||
{ schluessel: "mk-crosspromo", gruppe: "content", kategorie: "social", rolle: "Modi (Social Media)", tage: 30,
|
||
titel: "Cross-Promotion zwischen den Kanälen prüfen",
|
||
text: "Von TikTok zu YouTube, nicht umgekehrt. Wer kurz schaut, klickt weiter; wer lang schaut, ist schon da." },
|
||
|
||
/* ---------- Phase 5 — Jede Woche ----------------------------------- */
|
||
{ schluessel: "mk-woche-kalender", gruppe: "woche", kategorie: "planung", rolle: "rechte Hand", tage: 7,
|
||
titel: "Wochenübersicht der Live-Termine aktualisieren",
|
||
text: "Am selben Wochentag, bevor die Woche anfängt. Ein Kalender, der der Woche hinterherläuft, wird nicht mehr gelesen." },
|
||
{ schluessel: "mk-woche-meeting", gruppe: "woche", kategorie: "team", rolle: "DogFather & rechte Hand", tage: 7,
|
||
titel: "Kurze Abstimmung mit allen aktiven Modis",
|
||
text: "Fünfzehn Minuten, feste Uhrzeit. Ein Termin, der jede Woche verschoben wird, findet nicht statt." },
|
||
{ schluessel: "mk-woche-offene", gruppe: "woche", kategorie: "organisation", rolle: "rechte Hand", tage: 7,
|
||
titel: "Offene Aufgaben aus der Vorwoche nachverfolgen",
|
||
text: "Erledigen, verschieben oder abbrechen – aber entscheiden. Eine Aufgabe, die dreimal mitwandert, wird nie gemacht." },
|
||
{ schluessel: "mk-woche-trial", gruppe: "woche", kategorie: "team", rolle: "DogFather & rechte Hand", tage: 7,
|
||
titel: "Modis in der Probezeit bewerten",
|
||
text: "Verlängern, aufnehmen oder absagen. Eine Probezeit ohne Ende ist keine, und beide Seiten wissen es." },
|
||
{ schluessel: "mk-woche-redaktion", gruppe: "woche", kategorie: "planung", rolle: "rechte Hand", tage: 7,
|
||
titel: "Redaktionsplan für die kommende Woche abschließen",
|
||
text: "Vor dem Wochenende fertig. Wer montags plant, dreht mittwochs." },
|
||
|
||
/* ---------- Phase 5 — Jeden Monat ---------------------------------- */
|
||
{ schluessel: "mk-monat-bericht", gruppe: "monat", kategorie: "analyse", rolle: "DogFather & rechte Hand", tage: 30,
|
||
titel: "Reichweiten- und Wachstumsbericht erstellen",
|
||
text: "Follower, Aufrufe, Beteiligung – dieselben drei, jeden Monat am selben Tag. Ein Bericht mit wechselnden Zahlen ist eine Erzählung." },
|
||
{ schluessel: "mk-monat-feedback", gruppe: "monat", kategorie: "team", rolle: "DogFather", tage: 30,
|
||
titel: "Rückmeldung der Modis einholen",
|
||
text: "Einzeln fragen, nicht in der Runde. In der Runde sagt niemand, was ihn stört." },
|
||
{ schluessel: "mk-monat-regeln", gruppe: "monat", kategorie: "organisation", rolle: "DogFather", tage: 30,
|
||
titel: "Regeln und Eskalationsregeln nachziehen",
|
||
text: "Nur, wenn ein Fall dazu Anlass gab. Regeln, die sich monatlich ändern, kennt niemand auswendig." },
|
||
{ schluessel: "mk-monat-shoutouts", gruppe: "monat", kategorie: "team", rolle: "DogFather", tage: 30,
|
||
titel: "Wertschätzung für besonders aktive Modis planen",
|
||
text: "Öffentlich und konkret. \"Danke euch allen\" erreicht niemanden." },
|
||
{ schluessel: "mk-monat-formate", gruppe: "monat", kategorie: "planung", rolle: "DogFather & rechte Hand", tage: 30,
|
||
titel: "Große Content-Formate für den nächsten Monat planen",
|
||
text: "Eines, nicht drei. Ein großes Format, das stattfindet, schlägt drei, die verschoben werden." },
|
||
|
||
/* ---------- Phase 6 — Community & Wachstum ------------------------- */
|
||
{ schluessel: "mk-umfrage", gruppe: "community", kategorie: "community", rolle: "Modi (Community)", tage: 30,
|
||
titel: "Community-Umfrage zu neuen Formaten starten",
|
||
text: "Höchstens drei Antwortmöglichkeiten. Bei acht entscheidet die Reihenfolge, nicht die Meinung." },
|
||
{ schluessel: "mk-event", gruppe: "community", kategorie: "events", rolle: "rechte Hand", tage: 30,
|
||
titel: "Community-Event planen",
|
||
text: "Zuschauer-Challenge, Q&A-Live, gemeinsamer Abend. Termin zuerst, Inhalt danach – sonst wird nie einer daraus." },
|
||
{ schluessel: "mk-stammzuschauer", gruppe: "community", kategorie: "community", rolle: "Modi", tage: 7,
|
||
titel: "Stammzuschauer erkennen und wertschätzen",
|
||
text: "Eine kurze Liste führen. Wiedererkannt zu werden ist der halbe Grund wiederzukommen." },
|
||
{ schluessel: "mk-willkommen", gruppe: "community", kategorie: "community", rolle: "Modi", tage: 7,
|
||
titel: "Willkommens-Routine für neue Mitglieder pflegen",
|
||
text: "Ein Satz, der nicht nach Textbaustein klingt. Wer merkt, dass ein Automat schreibt, antwortet nicht." },
|
||
{ schluessel: "mk-feedbackkanal", gruppe: "community", kategorie: "community", rolle: "rechte Hand", tage: 7,
|
||
titel: "Feedback-Kanal für Community-Wünsche auswerten",
|
||
text: "Und zurückmelden, was daraus wurde – auch ein Nein. Ein Wunschkanal ohne Antwort verstummt." },
|
||
{ schluessel: "mk-kooperation", gruppe: "community", kategorie: "wachstum", rolle: "DogFather", tage: 30,
|
||
titel: "Zusammenarbeit mit anderen Creators prüfen",
|
||
text: "Ähnliche Größe, andere Community. Wer viel größer ist, bringt Zuschauer, die nicht bleiben." },
|
||
{ schluessel: "mk-richtlinien", gruppe: "community", kategorie: "community", rolle: "Modi (Senior)", tage: 7,
|
||
titel: "Community-Richtlinien verständlich kommunizieren",
|
||
text: "In eigenen Worten, nicht als Rechtstext. Regeln, die man erklären muss, werden nicht befolgt." },
|
||
];
|
||
|
||
export const AUFGABEN_VORLAGEN = {
|
||
live: {
|
||
anfaenger: [
|
||
{ schluessel: "live-ton-aufnehmen-und-anhoeren", titel: "Ton aufnehmen und anhören", tage: 2,
|
||
text: "Eine Minute mit dem echten Aufbau aufnehmen und mit Kopfhörern anhören. Nicht während des Streams – da hört man sich selbst nie." },
|
||
{ schluessel: "live-licht-einmal-richtig-stellen", titel: "Licht einmal richtig stellen", tage: 2,
|
||
text: "Gesicht heller als der Hintergrund, kein Fenster im Rücken. Ein Foto vorher und nachher machen – der Unterschied ist größer, als man denkt." },
|
||
{ schluessel: "live-titel-und-thema-vorher", titel: "Titel und Thema vorher aufschreiben", tage: 3,
|
||
text: "Für die nächsten drei Streams je eine Zeile. Wer den Titel liest, muss wissen, ob es für ihn ist." },
|
||
],
|
||
fort: [
|
||
{ schluessel: "live-sendeplan-vier-wochen", titel: "Sendeplan für vier Wochen festlegen", tage: 7,
|
||
text: "Zwei feste Tage schlagen fünf zufällige. In den Kalender eintragen, damit die Betreuung mitplanen kann." },
|
||
{ schluessel: "live-ankuendigung-zur-routine", titel: "Ankündigung zur Routine machen", tage: 7,
|
||
text: "30 bis 60 Minuten vor jedem Stream ein kurzes Video. Es bündelt die, die ohnehin kommen wollten – und ein voller Start zieht neue nach." },
|
||
{ schluessel: "live-ablauf-in-drei-bloecken", titel: "Ablauf in drei Blöcken", tage: 5,
|
||
text: "Anfang, Mitte, Schluss – je zwei Stichworte. Einmal danach senden und hinterher notieren, wo es gehakt hat." },
|
||
],
|
||
profi: [
|
||
{ schluessel: "live-upload-messen-bitrate-setzen", titel: "Upload messen, Bitrate setzen", tage: 3,
|
||
text: "Upload messen und höchstens 75 Prozent davon als Bitrate einstellen. Darüber verwirft die Leitung Bilder, sobald sonst noch etwas läuft." },
|
||
{ schluessel: "live-erste-dreissig-sekunden", titel: "Die ersten dreißig Sekunden ausformulieren", tage: 5,
|
||
text: "Wörtlich aufschreiben, nicht stichwortartig. In den ersten Sekunden entscheidet sich, ob jemand bleibt – das ist der einzige Teil, den man auswendig können sollte." },
|
||
{ schluessel: "live-verweildauer-vergleichen", titel: "Verweildauer der letzten fünf Streams vergleichen", tage: 7,
|
||
text: "Durchschnittliche Verweildauer nebeneinanderlegen. Über 15 Minuten heißt: Die Stimmung trägt. Darunter liegt es fast nie am Thema, sondern am Anfang." },
|
||
|
||
/* ===== AUSGEBAUT (09.09.2026) ==============================
|
||
Filipe: "ich will dass die 2 kategorien profi und meister
|
||
ueberall noch mehr perfektionniert werden. ich will dass da
|
||
noch mehr aufgeben und moeglichkeiten sind."
|
||
|
||
Drei Aufgaben je Stufe reichen nicht, um jemanden ueber
|
||
Monate zu begleiten -- und Profi und Meister sind genau die
|
||
Raenge, in denen jemand am laengsten bleibt. Fristen nach
|
||
Hausregel: Profi drei bis sieben Tage, Meister mindestens
|
||
eine Woche, weil dort nichts an einem Abend fertig wird. */
|
||
{ schluessel: "live-tonkette-einrichten", titel: "Tonkette einrichten und abhören", tage: 4,
|
||
text: "Hochpass 80 Hertz, dann Gate, dann Kompressor, zuletzt Begrenzer. Danach eine Minute aufnehmen und mit Kopfhörern gegen die alte Aufnahme hören." },
|
||
{ schluessel: "live-abbruchstelle-finden", titel: "Die Abbruchstelle im letzten Stream finden", tage: 5,
|
||
text: "Den Verlauf ansehen, die Minute mit dem größten Abfall heraussuchen und dort hineinhören. Eine Zeile aufschreiben, was in dem Moment lief." },
|
||
{ schluessel: "live-probelauf-zur-sendezeit", titel: "Probelauf zur echten Sendezeit", tage: 4,
|
||
text: "Ein privater Stream zur gewohnten Uhrzeit, nicht am Vormittag. Verworfene Bilder ablesen und die Zahl notieren." },
|
||
{ schluessel: "live-einnahmen-je-stunde", titel: "Einnahmen je Stunde ausrechnen", tage: 6,
|
||
text: "Für die letzten sechs Sendungen: Ergebnis geteilt durch Stunden. Erst diese Zahl macht einen langen Abend mit einem kurzen vergleichbar." },
|
||
],
|
||
meister: [
|
||
{ schluessel: "live-ablauf-als-vorlage", titel: "Ablauf als Vorlage ablegen", tage: 14,
|
||
text: "So aufschreiben, dass eine Vertretung den Stream fahren könnte. Wer nicht ersetzbar ist, kann nicht krank werden." },
|
||
{ schluessel: "live-ein-ziel-vier-wochen", titel: "Ein Ziel in einer Zahl, vier Wochen verfolgen", tage: 28,
|
||
text: "Eine einzige Zahl je Stream – Verweildauer, neue Zuschauer oder Wiederkehrer. Vier Wochen dieselbe, sonst vergleicht man nichts." },
|
||
{ schluessel: "live-ausweichweg-proben", titel: "Ausweichweg einrichten und proben", tage: 14,
|
||
text: "Zweites Gerät, zweite Leitung oder ein Ersatzstream. Einmal wirklich umschalten – ein ungeprobter Ausweichweg ist keiner." },
|
||
|
||
/* ===== AUSGEBAUT (09.09.2026) ==============================
|
||
Filipe: "ich will dass die 2 kategorien profi und meister
|
||
ueberall noch mehr perfektionniert werden. ich will dass da
|
||
noch mehr aufgeben und moeglichkeiten sind."
|
||
|
||
Drei Aufgaben je Stufe reichen nicht, um jemanden ueber
|
||
Monate zu begleiten -- und Profi und Meister sind genau die
|
||
Raenge, in denen jemand am laengsten bleibt. Fristen nach
|
||
Hausregel: Profi drei bis sieben Tage, Meister mindestens
|
||
eine Woche, weil dort nichts an einem Abend fertig wird. */
|
||
{ schluessel: "live-zweite-leitung-einrichten", titel: "Zweiten Weg ins Netz einrichten und testen", tage: 10,
|
||
text: "Mobilfunk als Ausweichweg, eingerichtet und einmal wirklich damit gesendet. Ein Ersatz, den man erst im Ausfall einrichtet, ist keiner." },
|
||
{ schluessel: "live-startcheck-als-liste", titel: "Startcheck als Liste anlegen", tage: 7,
|
||
text: "Alles, was vor einer Sendung stimmen muss, in fester Reihenfolge. Bei den nächsten drei Sendungen abhaken und danach anpassen." },
|
||
{ schluessel: "live-ablauf-uebergeben", titel: "Den Ablauf übergabefähig aufschreiben", tage: 12,
|
||
text: "So, dass jemand anderes die Sendung fahren könnte. Danach jemanden gegenlesen lassen und die Stellen streichen, die er nicht versteht." },
|
||
{ schluessel: "live-monatsbericht-drei-zahlen", titel: "Monatsbericht mit drei festen Zahlen", tage: 14,
|
||
text: "Dieselben drei Zahlen, jeden Monat am selben Tag, an die Betreuung. Ein Bericht mit wechselnden Zahlen ist eine Erzählung." },
|
||
],
|
||
},
|
||
|
||
content: {
|
||
anfaenger: [
|
||
{ schluessel: "content-drei-ideen-mit-termin", titel: "Drei Ideen übernehmen und terminieren", tage: 3,
|
||
text: "Aus der Ideenliste drei aussuchen und jeder ein Datum geben. Eine Idee ohne Termin ist eine Notiz." },
|
||
{ schluessel: "content-ein-video-mit-haken", titel: "Ein Video mit Haken in Sekunde eins", tage: 5,
|
||
text: "Der erste Satz ist eine Frage, eine Behauptung oder eine Zahl – kein „Hey Leute“. Über 70 Prozent entscheiden in den ersten drei Sekunden." },
|
||
{ schluessel: "content-bester-moment-als-clip", titel: "Den besten Moment als Clip schneiden", tage: 3,
|
||
text: "Aus dem letzten LIVE einen Ausschnitt unter 60 Sekunden. Der Feed hat mehr Reichweite als der Stream – er ist der Weg dorthin." },
|
||
],
|
||
fort: [
|
||
{ schluessel: "content-saeulen-anlegen", titel: "Content-Säulen anlegen und drei Wochen halten", tage: 14,
|
||
text: "Rund 70 Prozent Wert, 20 Prozent Community, 10 Prozent eigene Sache. Drei Wochen danach planen und dann nachsehen, was es verändert hat." },
|
||
{ schluessel: "content-fuenf-haken-vorher", titel: "Fünf Haken schreiben, bevor gedreht wird", tage: 5,
|
||
text: "Erst die ersten Sätze, dann die Kamera. Wer beim Drehen nach dem Einstieg sucht, findet ihn nicht." },
|
||
{ schluessel: "content-format-zweimal-wiederholen", titel: "Ein Format zweimal wiederholen", tage: 14,
|
||
text: "Dasselbe Format, andere Sache. Erst beim zweiten Mal sieht man, ob das Format trägt oder nur das Thema getragen hat." },
|
||
],
|
||
profi: [
|
||
{ schluessel: "content-intro-retention-ablesen", titel: "Intro-Retention der letzten zehn Videos ablesen", tage: 7,
|
||
text: "Wie viele bleiben über die ersten drei Sekunden hinaus? Gute Werte liegen bei 70 Prozent und mehr. Die drei schlechtesten nebeneinanderlegen und den Haken vergleichen." },
|
||
{ schluessel: "content-zwei-haken-gegeneinander", titel: "Zwei Haken gegeneinander testen", tage: 10,
|
||
text: "Gleiches Video, gleicher Schnitt, gleiche Zeit – nur der erste Satz anders. Ein Versuch, eine Änderung, sonst weiß man hinterher nichts." },
|
||
{ schluessel: "content-untertitel-ohne-ton", titel: "Untertitel prüfen: ohne Ton lesbar", tage: 5,
|
||
text: "Alle Videos einmal stumm durchsehen. Der größte Teil wird ohne Ton geschaut – was dann nicht ankommt, kommt gar nicht an." },
|
||
|
||
/* ===== AUSGEBAUT (09.09.2026) ==============================
|
||
Filipe: "ich will dass die 2 kategorien profi und meister
|
||
ueberall noch mehr perfektionniert werden. ich will dass da
|
||
noch mehr aufgeben und moeglichkeiten sind."
|
||
|
||
Drei Aufgaben je Stufe reichen nicht, um jemanden ueber
|
||
Monate zu begleiten -- und Profi und Meister sind genau die
|
||
Raenge, in denen jemand am laengsten bleibt. Fristen nach
|
||
Hausregel: Profi drei bis sieben Tage, Meister mindestens
|
||
eine Woche, weil dort nichts an einem Abend fertig wird. */
|
||
{ schluessel: "content-zwei-anfaenge-testen", titel: "Zwei Anfänge gegeneinander testen", tage: 7,
|
||
text: "Derselbe Inhalt, zwei verschiedene erste Sätze. Alles andere gleich lassen und vergleichen, wie viele nach drei Sekunden noch da sind." },
|
||
{ schluessel: "content-saeulen-nachrechnen", titel: "Die eigenen Säulen nachrechnen", tage: 5,
|
||
text: "Die letzten zwanzig Beiträge den Säulen zuordnen und zählen. Fast immer liegt eine bei null -- und meistens ist es die, die etwas bringen würde." },
|
||
{ schluessel: "content-ein-beitrag-vier-formate", titel: "Einen Beitrag in vier Formate bringen", tage: 6,
|
||
text: "Aus einem Stream: ein Kurzclip, ein Bild mit Text, eine Frage an die Community, ein längeres Video. Dieselbe Arbeit, vierfache Reichweite." },
|
||
{ schluessel: "content-zwoelf-wochen-planen", titel: "Zwölf Wochen im Voraus planen", tage: 7,
|
||
text: "Termin, Thema, Säule, Format -- je eine Zeile. Ein Plan, der weiter reicht als bis nächste Woche, ist auch das, wonach Partner fragen." },
|
||
],
|
||
meister: [
|
||
{ schluessel: "content-redaktionsplan-vier-wochen", titel: "Redaktionsplan für vier Wochen", tage: 21,
|
||
text: "So geschrieben, dass jemand anderes ihn fahren könnte: Thema, Format, Säule, Termin. Das ist der Unterschied zwischen einem Plan und einer Liste." },
|
||
{ schluessel: "content-vorlagensammlung", titel: "Vorlagensammlung anlegen", tage: 21,
|
||
text: "Haken, Schnittfolge, Endkarte, Beschreibungstext. Einmal gut gemacht und danach zehnmal benutzt – das ist der ganze Unterschied zwischen Fleiß und System." },
|
||
{ schluessel: "content-zweiten-einweisen", titel: "Einen Zweiten einweisen", tage: 28,
|
||
text: "Jemand, der Clips schneiden kann, ohne jedes Mal zu fragen. Dafür braucht es die Vorlagensammlung – deshalb steht sie davor." },
|
||
|
||
/* ===== AUSGEBAUT (09.09.2026) ==============================
|
||
Filipe: "ich will dass die 2 kategorien profi und meister
|
||
ueberall noch mehr perfektionniert werden. ich will dass da
|
||
noch mehr aufgeben und moeglichkeiten sind."
|
||
|
||
Drei Aufgaben je Stufe reichen nicht, um jemanden ueber
|
||
Monate zu begleiten -- und Profi und Meister sind genau die
|
||
Raenge, in denen jemand am laengsten bleibt. Fristen nach
|
||
Hausregel: Profi drei bis sieben Tage, Meister mindestens
|
||
eine Woche, weil dort nichts an einem Abend fertig wird. */
|
||
{ schluessel: "content-jahr-in-zahlen", titel: "Das Jahr in Zahlen aufbereiten", tage: 14,
|
||
text: "Reichweite, Verweildauer, Einnahmen, Kosten -- zwölf Monate nebeneinander. Daraus einen Beitrag machen, der die Zahlen wirklich zeigt." },
|
||
{ schluessel: "content-eigene-vorlage-herausgeben", titel: "Eine eigene Vorlage veröffentlichen", tage: 10,
|
||
text: "Der eigene Ablauf, die eigene Liste, so aufbereitet, dass jemand anderes sie benutzen kann. Was nachgebaut wird, wird weitererzählt." },
|
||
{ schluessel: "content-reihe-ueber-vier-folgen", titel: "Eine Reihe über vier Folgen anlegen", tage: 14,
|
||
text: "Vier Beiträge mit gemeinsamem Faden und festem Abstand. Eine Reihe bindet, ein Einzelstück wird angesehen und vergessen." },
|
||
{ schluessel: "content-unterlagen-fuer-partner", titel: "Unterlagen für Partner zusammenstellen", tage: 12,
|
||
text: "Zahlen, zwei Beispiele, was du anbietest. Ohne diese Seite wird jede Anfrage zu einer neuen Erklärung." },
|
||
],
|
||
},
|
||
|
||
technik: {
|
||
anfaenger: [
|
||
{ schluessel: "technik-mikrofon-abstand", titel: "Mikrofon auf fünf bis zehn Zentimeter", tage: 1,
|
||
text: "Näher heran und die Verstärkung herunter, leicht seitlich gesprochen. Das ist die wirksamste Verbesserung, die nichts kostet." },
|
||
{ schluessel: "technik-kamera-einmal-einstellen", titel: "Kamera scharf stellen und belichten", tage: 2,
|
||
text: "Automatik aus, einmal von Hand einstellen. Eine Kamera, die während des Streams nachregelt, pumpt im Bild." },
|
||
{ schluessel: "technik-kompletter-durchlauf", titel: "Einen kompletten Durchlauf testen", tage: 3,
|
||
text: "Ton, Bild, Verbindung, Szenenwechsel – zehn Minuten privat aufnehmen und ansehen. Nicht kurz vor dem Stream." },
|
||
],
|
||
fort: [
|
||
{ schluessel: "technik-szenen-anlegen", titel: "Vier Szenen anlegen", tage: 5,
|
||
text: "Start, Haupt, Pause, Ende. Wer während des Streams Fenster sucht, ist für zwei Minuten weg – und die Zuschauer auch." },
|
||
{ schluessel: "technik-tonspur-160", titel: "Tonspur auf 160 kbit/s stellen", tage: 2,
|
||
text: "Darunter klingt Sprache dumpf, darüber nimmt es dem Bild die Bandbreite. 160 ist der übliche Wert für Stimme." },
|
||
{ schluessel: "technik-bildrate-begrenzen", titel: "Bildrate im Spiel begrenzen", tage: 2,
|
||
text: "Deckel bei 60 oder 120 Bildern. Ein ungebremstes Spiel nimmt dem Encoder die Luft – das behebt die meisten Ruckler." },
|
||
],
|
||
profi: [
|
||
{ schluessel: "technik-lautheit-messen", titel: "Lautheit messen und einstellen", tage: 5,
|
||
text: "Zielbereich minus 20 bis minus 24 LUFS, Begrenzer bei minus 3. Wer nach Gefühl aussteuert, ist entweder leiser als alle anderen oder übersteuert." },
|
||
{ schluessel: "technik-filterkette-pruefen", titel: "Filterkette prüfen", tage: 5,
|
||
text: "Reihenfolge: Rauschsperre, Entrauschen, Kompressor, Begrenzer. Falsch sortiert arbeiten sie gegeneinander – und man hört nur, dass etwas nicht stimmt." },
|
||
{ schluessel: "technik-statistik-eine-woche", titel: "Eine Woche Statistikfenster mitlaufen lassen", tage: 7,
|
||
text: "Verworfene Bilder und Renderverzögerung nach jedem Stream notieren. Verworfen kommt vom Netz, ausgelassen vom Encoder – verschiedene Ursachen, verschiedene Lösungen." },
|
||
|
||
/* ===== AUSGEBAUT (09.09.2026) ==============================
|
||
Filipe: "ich will dass die 2 kategorien profi und meister
|
||
ueberall noch mehr perfektionniert werden. ich will dass da
|
||
noch mehr aufgeben und moeglichkeiten sind."
|
||
|
||
Drei Aufgaben je Stufe reichen nicht, um jemanden ueber
|
||
Monate zu begleiten -- und Profi und Meister sind genau die
|
||
Raenge, in denen jemand am laengsten bleibt. Fristen nach
|
||
Hausregel: Profi drei bis sieben Tage, Meister mindestens
|
||
eine Woche, weil dort nichts an einem Abend fertig wird. */
|
||
{ schluessel: "technik-auf-grafikkarte-umstellen", titel: "Kodierung auf die Grafikkarte umstellen", tage: 3,
|
||
text: "Umstellen, eine Sendung damit fahren, verworfene Bilder vorher und nachher vergleichen. Der größte Einzelgewinn an Stabilität, den es gibt." },
|
||
{ schluessel: "technik-farben-festsetzen", titel: "Kameraautomatik abschalten und Werte festhalten", tage: 4,
|
||
text: "Weißabgleich, Belichtung, Fokus von Hand einstellen und die Werte aufschreiben. Eine Kamera, die selbst nachregelt, ändert die Farbe mitten im Satz." },
|
||
{ schluessel: "technik-fehlerbuch-anlegen", titel: "Ein Fehlerbuch anlegen", tage: 5,
|
||
text: "Datum, was war, was geholfen hat. Ab dem dritten Eintrag sieht man Muster, die man vorher für Zufall gehalten hat." },
|
||
{ schluessel: "technik-einstellungen-mit-datum", titel: "Einstellungen mit Datum sichern", tage: 4,
|
||
text: "Nicht nur sichern, sondern in Ständen. Nach einer Änderung, die alles verschlimmert, will man auf gestern zurück und nicht auf irgendwann." },
|
||
],
|
||
meister: [
|
||
{ schluessel: "technik-profile-sichern", titel: "Szenen, Filter und Profile sichern", tage: 7,
|
||
text: "Auf einen zweiten Datenträger, nicht auf denselben Rechner. Ein Rechnerschaden kostet sonst zwei Abende Wiederaufbau." },
|
||
{ schluessel: "technik-ersatzweg-einrichten", titel: "Ersatzweg einrichten", tage: 21,
|
||
text: "Zweites Gerät oder zweite Leitung, die übernehmen kann. Einmal wirklich umschalten – sonst weiß man nicht, ob es geht." },
|
||
{ schluessel: "technik-stoerungsliste", titel: "Störungsliste anlegen", tage: 14,
|
||
text: "Symptom, Ursache, Lösung – drei Spalten. Beim zweiten Mal ist derselbe Ausfall dann kein Abend mehr, sondern fünf Minuten." },
|
||
|
||
/* ===== AUSGEBAUT (09.09.2026) ==============================
|
||
Filipe: "ich will dass die 2 kategorien profi und meister
|
||
ueberall noch mehr perfektionniert werden. ich will dass da
|
||
noch mehr aufgeben und moeglichkeiten sind."
|
||
|
||
Drei Aufgaben je Stufe reichen nicht, um jemanden ueber
|
||
Monate zu begleiten -- und Profi und Meister sind genau die
|
||
Raenge, in denen jemand am laengsten bleibt. Fristen nach
|
||
Hausregel: Profi drei bis sieben Tage, Meister mindestens
|
||
eine Woche, weil dort nichts an einem Abend fertig wird. */
|
||
{ schluessel: "technik-aufbau-dokumentieren", titel: "Den Aufbau aufzeichnen", tage: 10,
|
||
text: "Ein Bild und eine Seite: Was hängt woran, welche Einstellung wo. Nach einem Rechnertausch spart das einen ganzen Abend." },
|
||
{ schluessel: "technik-wiederherstellung-proben", titel: "Die Wiederherstellung einmal proben", tage: 12,
|
||
text: "Auf einem zweiten Rechner aus der Sicherung aufsetzen und die Zeit stoppen. Eine Sicherung, die nie zurückgespielt wurde, ist eine Hoffnung." },
|
||
{ schluessel: "technik-ersatz-bereitlegen", titel: "Für jedes tragende Teil einen Ersatz bereitlegen", tage: 7,
|
||
text: "Mikrofon, Kamera, Kabel -- das alte behalten statt neu kaufen. Es muss nicht gut sein, es muss da sein." },
|
||
{ schluessel: "technik-zweiten-einarbeiten", titel: "Eine zweite Person einarbeiten", tage: 14,
|
||
text: "Jemand aus dem Team fährt einmal den ganzen Aufbau hoch, während du danebensitzt und nichts sagst. Erst dann weißt du, ob die Anleitung taugt." },
|
||
],
|
||
},
|
||
|
||
community: {
|
||
anfaenger: [
|
||
{ schluessel: "community-drei-regeln", titel: "Drei Regeln aufschreiben und sichtbar machen", tage: 2,
|
||
text: "Kurz, verständlich, an einer Stelle, die man findet. Drei Sätze reichen – wer zehn Regeln schreibt, hat keine." },
|
||
{ schluessel: "community-erste-minute-begruessen", titel: "In der ersten Minute begrüßen", tage: 1,
|
||
text: "Neue beim Namen ansprechen, sobald sie da sind – nicht wenn Zeit ist. Wer angesprochen wird, bleibt deutlich länger." },
|
||
{ schluessel: "community-wer-greift-ein", titel: "Klären, wer eingreifen kann", tage: 3,
|
||
text: "Eine zweite Person mit Rechten während des Streams – oder die ausdrückliche Feststellung, dass keine da ist. Beides ist besser als Unklarheit." },
|
||
],
|
||
fort: [
|
||
{ schluessel: "community-wortfilter-einrichten", titel: "Wortfilter einrichten und beobachten", tage: 7,
|
||
text: "Mittlere Stufe, eine Woche mitlesen, dann nachjustieren. Zu scharf löscht Harmloses, zu lasch lässt durch – beides merkt man erst im Betrieb." },
|
||
{ schluessel: "community-erlaubte-woerter", titel: "Ausnahmeliste erlaubter Wörter pflegen", tage: 7,
|
||
text: "Der Filter fängt auch Wörter, die bei euch harmlos sind. Ohne Ausnahmeliste verstummen ausgerechnet die Stammleute." },
|
||
{ schluessel: "community-feste-rubrik", titel: "Eine feste Rubrik mit Termin einführen", tage: 14,
|
||
text: "Etwas, das immer am selben Tag stattfindet. Ein Termin, auf den man sich freuen kann, bindet stärker als guter Einzelinhalt." },
|
||
],
|
||
profi: [
|
||
{ schluessel: "community-eskalationsleiter", titel: "Eskalationsleiter schriftlich festlegen", tage: 7,
|
||
text: "Vier Stufen in dieser Reihenfolge: ansprechen, Nachricht löschen, kurze Auszeit, Sperre. Wer sie erst im Moment festlegt, entscheidet ungleich." },
|
||
{ schluessel: "community-mod-kanal", titel: "Eigenen Kanal fürs Mod-Team einrichten", tage: 5,
|
||
text: "Absprachen gehören nicht in den öffentlichen Chat. Ein Raum, in dem gefragt werden darf, ohne dass alle mitlesen." },
|
||
{ schluessel: "community-entscheidungen-dokumentieren", titel: "Entscheidungen dokumentieren", tage: 14,
|
||
text: "Wer, wann, warum, welche Stufe. Beim zweiten Mal mit derselben Person ist das der Unterschied zwischen „wir haben da was“ und „ich glaube“." },
|
||
|
||
/* ===== AUSGEBAUT (09.09.2026) ==============================
|
||
Filipe: "ich will dass die 2 kategorien profi und meister
|
||
ueberall noch mehr perfektionniert werden. ich will dass da
|
||
noch mehr aufgeben und moeglichkeiten sind."
|
||
|
||
Drei Aufgaben je Stufe reichen nicht, um jemanden ueber
|
||
Monate zu begleiten -- und Profi und Meister sind genau die
|
||
Raenge, in denen jemand am laengsten bleibt. Fristen nach
|
||
Hausregel: Profi drei bis sieben Tage, Meister mindestens
|
||
eine Woche, weil dort nichts an einem Abend fertig wird. */
|
||
{ schluessel: "community-stufenfolge-festlegen", titel: "Die Stufenfolge festlegen", tage: 4,
|
||
text: "Hinweis, Löschen, Stummschalten, Zeitsperre, Ausschluss -- und wann welche Stufe gilt. Wer erst im Streitfall entscheidet, entscheidet nach Laune." },
|
||
{ schluessel: "community-saetze-fuer-die-moderation", titel: "Fertige Sätze für die Moderation schreiben", tage: 5,
|
||
text: "Fünf Formulierungen für die häufigsten Fälle. Ein Team, das jedes Mal neu formuliert, klingt jedes Mal anders streng." },
|
||
{ schluessel: "community-wortfilter-nachziehen", titel: "Wortfilter an den echten Fällen nachziehen", tage: 4,
|
||
text: "Die letzten vier Wochen durchsehen: Was ist durchgekommen? Umgehungen ändern sich schneller als Filterlisten." },
|
||
{ schluessel: "community-aktion-mit-ziel", titel: "Eine Aktion mit messbarem Ziel fahren", tage: 7,
|
||
text: "Vorher aufschreiben, woran man sieht, dass sie gewirkt hat. Hinterher die Zahl daneben schreiben -- auch wenn sie enttäuscht." },
|
||
],
|
||
meister: [
|
||
{ schluessel: "community-moderatoren-einweisen", titel: "Moderatoren einweisen", tage: 14,
|
||
text: "Regeln schriftlich, Eskalationsleiter, Werkzeuge einmal gezeigt. Rechte zu vergeben ist der kleinere Teil." },
|
||
{ schluessel: "community-ernstfall-proben", titel: "Ernstfall einmal durchspielen", tage: 21,
|
||
text: "Wer tut was, wenn es kippt? Im Ernstfall zum ersten Mal darüber nachzudenken ist zu spät." },
|
||
{ schluessel: "community-uebergabe-regeln", titel: "Übergabe regeln", tage: 21,
|
||
text: "Wer führt die Community, wenn du zwei Wochen ausfällst? Schriftlich, mit Zugängen – sonst ist es kein Plan, sondern eine Hoffnung." },
|
||
|
||
/* ===== AUSGEBAUT (09.09.2026) ==============================
|
||
Filipe: "ich will dass die 2 kategorien profi und meister
|
||
ueberall noch mehr perfektionniert werden. ich will dass da
|
||
noch mehr aufgeben und moeglichkeiten sind."
|
||
|
||
Drei Aufgaben je Stufe reichen nicht, um jemanden ueber
|
||
Monate zu begleiten -- und Profi und Meister sind genau die
|
||
Raenge, in denen jemand am laengsten bleibt. Fristen nach
|
||
Hausregel: Profi drei bis sieben Tage, Meister mindestens
|
||
eine Woche, weil dort nichts an einem Abend fertig wird. */
|
||
{ schluessel: "community-schichten-einteilen", titel: "Moderationsschichten einteilen", tage: 10,
|
||
text: "Keine Tageszeit, für die nur einer zuständig ist. Was Moderatoren aufreibt, ist nicht die Menge, sondern das Alleinsein damit." },
|
||
{ schluessel: "community-weg-fuer-schwere-faelle", titel: "Den Weg für schwere Fälle festlegen", tage: 7,
|
||
text: "Drohungen, Minderjährige, rechtlich Heikles: wer wird wann informiert. Ein Moderator, der so etwas allein entscheidet, wird auch allein gelassen." },
|
||
{ schluessel: "community-jahresplan-hoehepunkte", titel: "Jahresplan mit vier Höhepunkten", tage: 14,
|
||
text: "Vier große Anlässe über das Jahr, lange vorbereitet. Wer alles spontan macht, hat nie etwas, worauf sich jemand freuen kann." },
|
||
{ schluessel: "community-monatsgespraech", titel: "Monatsgespräch mit dem Team einführen", tage: 12,
|
||
text: "Einmal im Monat eine halbe Stunde: Was war schwer, was war unklar. Ehrenamtliche hören sonst nur etwas, wenn etwas schiefging." },
|
||
],
|
||
},
|
||
};
|
||
|
||
/* Alle Aufgabenvorlagen in einer flachen Liste -- fuer Pruefungen und
|
||
fuer das Nachschlagen eines einzelnen Schluessels. */
|
||
export const AUFGABEN_VORLAGEN_FLACH = Object.entries(AUFGABEN_VORLAGEN)
|
||
.flatMap(([bereich, stufen]) => Object.entries(stufen)
|
||
.flatMap(([stufe, liste]) => liste.map((v) => ({ ...v, bereich, stufe }))));
|
||
|
||
vorlagenRouter.use("/workspace/api/vorlagen", angemeldet);
|
||
|
||
vorlagenRouter.get("/workspace/api/vorlagen", (req, res) => {
|
||
/* =====================================================================
|
||
WER DIESEN KATALOG NICHT BEKOMMT (10.09.2026)
|
||
|
||
`AUFGABEN_VORLAGEN` sind 80 Aufgaben fuer den Aufbau eines KANALS --
|
||
Ton einstellen, Sendeplan festlegen, Verweildauer vergleichen. Wer
|
||
moderiert, statt zu senden, kann damit nichts anfangen; ein
|
||
Vorschlag, der nicht passt, ist schlimmer als keiner.
|
||
|
||
WARUM DIE ENTSCHEIDUNG HIER FAELLT UND NICHT IM BROWSER: Beim
|
||
ersten Anlauf stand im Browser `if (ich.rolle === 'modi')`. Das ist
|
||
zwar richtig gedacht, steht aber in assets/js/aufgaben.js -- einer
|
||
Datei, die JEDER bekommt, der die Seite oeffnet. Ein Blick in den
|
||
Quelltext, und die verborgene Rolle waere gefunden gewesen. Ich
|
||
habe mir das selbst eingebaut und beim Nachsehen gefunden; seither
|
||
wacht pruef-modi-wortleck darueber, dass das Wort in keiner
|
||
ausgelieferten Datei steht.
|
||
|
||
`null` statt einer leeren Liste: Die Oberflaeche prueft `if
|
||
(!vorlagen) return;` und laesst das Brett dann verborgen -- ohne
|
||
eine einzige Zeile, die verraet, fuer wen. */
|
||
const ohneKatalog = req.person?.rolle === "modi";
|
||
res.json({
|
||
content: CONTENT_IDEEN,
|
||
live: LIVE_PUNKTE,
|
||
community: COMMUNITY_PUNKTE,
|
||
technik: TECHNIK_PUNKTE,
|
||
calls: CALL_LEITFAEDEN,
|
||
aufgaben: ohneKatalog ? null : AUFGABEN_VORLAGEN,
|
||
/* DER KATALOG AUS TEIL 2 DES ANFORDERUNGSDOKUMENTS.
|
||
|
||
"katalog" und nicht der Rollenname -- weder hier noch im Browser
|
||
darf stehen, fuer wen er gedacht ist. Wer ihn nicht bekommt, sieht
|
||
`null`, und die Oberflaeche baut dann nichts. Ein leeres Feld sagt
|
||
nichts; ein Feld namens "modi_katalog" saehe jeder im
|
||
Netzwerk-Protokoll seines eigenen Browsers.
|
||
|
||
An denselben Personenkreis wie die Kategorien -- es ist dieselbe
|
||
Frage, und zwei Abfragen dafuer waeren zwei Gelegenheiten, dass
|
||
sie auseinanderlaufen. */
|
||
/* SEIT DEM 16.09.2026 NACH KATEGORIE UND STUFE.
|
||
|
||
Vorher standen hier neun PHASEN (Aufbau, Alltag, Vor dem Live
|
||
…). Nachgezaehlt, wem die 60 Eintraege darin gehoerten:
|
||
39 davon DogFather und der rechten Hand -- es war ein
|
||
Aufbauplan, kein Arbeitskatalog. Und die Verteilung ueber die
|
||
vierzehn Kategorien war schief: Planung 10, Events 1, Wachstum
|
||
1, Branding 1, Sonstiges 0.
|
||
|
||
Jetzt dieselbe Form wie bei den Creator-Vorlagen: Kategorie mal
|
||
Stufe. Wer eine Aufgabe vergibt, denkt "Frida macht Chat" und
|
||
nicht "wir sind in Phase 3".
|
||
|
||
`gruppe` heisst weiter `gruppe` und nicht `kategorie`: Die
|
||
Oberflaeche zeichnet damit schon, und ein zweiter Name fuer
|
||
dasselbe waere eine Gelegenheit, dass beide auseinanderlaufen. */
|
||
katalog: kategorienFuer(req.person).length
|
||
? {
|
||
gruppen: MODI_KATEGORIEN.map((k) => ({
|
||
schluessel: k.wert, name: k.name, text: k.text,
|
||
})),
|
||
stufen: MODI_STUFEN.map((s) => ({
|
||
schluessel: s.wert, name: s.name, text: s.text,
|
||
})),
|
||
aufgaben: MODI_AUFGABEN_FLACH.map((a) => ({
|
||
schluessel: a.schluessel, titel: a.titel, text: a.text, tage: a.tage,
|
||
gruppe: a.kategorie, stufe: a.stufe,
|
||
})),
|
||
}
|
||
: null,
|
||
/* DER AUFBAUPLAN BLEIBT -- er ist nicht falsch, nur etwas anderes:
|
||
die Liste dessen, was EINMAL zu tun ist, bis der Laden steht.
|
||
Ihn zu loeschen hiesse, 60 durchdachte Schritte wegzuwerfen,
|
||
weil sie am falschen Platz standen. */
|
||
aufbauplan: kategorienFuer(req.person).length
|
||
? { gruppen: MODI_GRUPPEN, aufgaben: MODI_KATALOG }
|
||
: null,
|
||
/* ==== DIE BEWERBUNGEN KOMMEN MIT (23.09.2026) =================
|
||
|
||
Sie stehen in DERSELBEN Antwort wie der Katalog und nicht in
|
||
einer zweiten Abfrage. Das Brett zeichnet sich bei jedem
|
||
Kategoriewechsel neu; eine eigene Abfrage daneben waere ein
|
||
zweiter Weg, auf dem die beiden auseinanderlaufen koennen --
|
||
und man saehe eine Karte als "beworben", die es nicht mehr ist.
|
||
|
||
WER WAS SIEHT, entscheidet vorlagenBewerbungenFuer(): Wer
|
||
entscheidet, bekommt alle offenen; alle anderen nur ihre
|
||
eigenen. Im Browser zu filtern hiesse, die fremden Namen
|
||
trotzdem auszuliefern.
|
||
|
||
UND OB ICH ENTSCHEIDEN DARF, sagt ebenfalls der Server. Die
|
||
Oberflaeche vergleicht keine Rollennamen -- assets/js/aufgaben.js
|
||
bekommt jeder, der die Seite oeffnet. */
|
||
bewerbungen: kategorienFuer(req.person).length
|
||
? vorlagenBewerbungenFuer(req.person) : null,
|
||
/* ==== UND WAS SCHON BEANTWORTET IST (30.09.2026) =============
|
||
|
||
ZWEI NEUE FELDER UND NICHT `bewerbungen` ERWEITERT. Dort heisst
|
||
eine Zeile im Browser „wartet auf Antwort" -- daraus wird ein
|
||
Schild und ein Zurueckziehen-Knopf. Beantwortete Zeilen
|
||
hineinzumischen hiesse, bei einer Absage „wartet auf Antwort"
|
||
zu zeigen. Ein Feld, dessen Bedeutung sich aendert, bricht
|
||
seine Leser lautlos. */
|
||
antworten: kategorienFuer(req.person).length
|
||
? vorlagenAntwortenFuer(req.person) : null,
|
||
absagen: kategorienFuer(req.person).length
|
||
? absagenUebersicht(req.person) : null,
|
||
darf_entscheiden: entscheidetUeberAufgaben(req.person),
|
||
darf_verteilen: darfAufgabenVerteilen(req.person),
|
||
});
|
||
});
|
||
|
||
/* ---------- Übernehmen ---------------------------------------------------
|
||
|
||
Aus einer Vorlage wird ein ganz normaler Eintrag: änderbar, löschbar,
|
||
und ab dann unabhängig von der Vorlage. Wer die Vorlage später
|
||
ändert, ändert damit NICHT, was schon übernommen wurde -- das wäre
|
||
eine böse Überraschung.
|
||
|
||
Creator dürfen ausdrücklich selbst übernehmen. Es ist ihre Arbeit;
|
||
sie sollen nicht darauf warten müssen, dass ein Betreuer für sie eine
|
||
Idee anlegt. */
|
||
|
||
function gleicheHerkunft(req, res, next) {
|
||
const herkunft = req.get("origin");
|
||
if (!herkunft) return next();
|
||
let erlaubt;
|
||
try { erlaubt = new URL(herkunft).host === req.get("host"); } catch { erlaubt = false; }
|
||
if (!erlaubt) return res.status(403).json({ fehler: "fremde_herkunft" });
|
||
next();
|
||
}
|
||
|
||
/* =====================================================================
|
||
AUS EINER VORLAGE WIRD EINE AUFGABE -- an EINER Stelle (23.09.2026)
|
||
|
||
Dieselben acht Zeilen standen im Zweig "katalog" der Uebernehmen-
|
||
Route. Seit eine Zusage auf eine Bewerbung dasselbe tut, braucht es
|
||
sie zweimal -- und zwei Fassungen desselben INSERT sind zwei
|
||
Gelegenheiten, dass eine davon beim naechsten Feld nicht mitgeht.
|
||
|
||
DIE FRIST WIRD IN ORTSZEIT GERECHNET. Ueber toISOString kaeme
|
||
zwischen Mitternacht und zwei Uhr der Vortag heraus -- derselbe
|
||
Fehler, der im Haus schon einmal eine Pruefung falsch rot gemacht
|
||
hat.
|
||
|
||
DIE KENNUNG DER VORLAGE WANDERT MIT. Nur so kann das Brett spaeter
|
||
zeigen, was schon uebernommen ist -- der Titel taugt dafuer nicht,
|
||
er darf geaendert werden. */
|
||
/** Legt eine Aufgabe aus einer Vorlage an -- MIT Zuteilungszeile.
|
||
*
|
||
* ==== DIE ZUTEILUNG HAT GEFEHLT (berichtigt 30.09.2026) ==========
|
||
*
|
||
* VanVan im Support: „Wenn ein Modi sich auf eine Aufgabe beworben
|
||
* hat und die von uns angenommen wurde, dann steht beim Modi unter
|
||
* der Aufgabe immer noch ich bewerbe mich."
|
||
*
|
||
* Hier stand nur das `INSERT INTO aufgaben` mit `verantwortlich_id`.
|
||
* Fuer das Aufgabenbrett war damit NIEMAND zugeteilt: Es liest
|
||
* `aufgaben_zuteilung`, findet nichts, und liefert
|
||
* `meine_zuteilung: null`. Die Bedingung im Browser beginnt mit
|
||
* `!mein` -- also bot sie dem Menschen an, sich auf eine Aufgabe zu
|
||
* bewerben, die ihm laengst gehoert.
|
||
*
|
||
* ES WAR NICHT NUR EIN FALSCHER KNOPF. „Ich fange an" und „Fertig"
|
||
* haengen ebenfalls an `mein.zustand`. Ohne Zuteilungszeile konnte
|
||
* er auf der Karte das Falsche tun und das Richtige nicht.
|
||
*
|
||
* GEMESSEN an den echten Daten: 8 von 11 Aufgaben mit einem
|
||
* Verantwortlichen hatten keine Zuteilungszeile.
|
||
*
|
||
* @param {string} zustand `angenommen`, wenn die Person darum
|
||
* gebeten hat und die Bitte angenommen wurde. `offen`, wenn die
|
||
* Leitung sie zutraegt -- dann steht bei ihr Annehmen/Ablehnen,
|
||
* und das ist richtig so: Sie hat noch nicht ja gesagt.
|
||
*/
|
||
/* ==== WAS BEIM UEBERNEHMEN ANDERS SEIN DARF (02.10.2026) ============
|
||
|
||
VanVan im Support, Meldung #6, zweite Haelfte: „Bei den Vorlagen
|
||
laesst sich weder die Frist anpassen noch ‚dauerhaft' einstellen,
|
||
und eine Anmerkung fehlt auch."
|
||
|
||
DREI WUENSCHE, EINE STELLE. Sie reisen als `wunsch`-Objekt durch
|
||
beide Zweige, die aus einer Vorlage eine Aufgabe machen -- der
|
||
Katalog hier und die Creator-Vorlagen weiter unten. Drei einzelne
|
||
Parameter waeren an der naechsten Aufrufstelle drei Gelegenheiten,
|
||
einen zu vergessen.
|
||
|
||
NICHTS IST PFLICHT. Ohne Angabe bleibt alles, wie es war: Frist
|
||
aus `tage`, nicht dauerhaft, keine Notiz. Der schnelle Weg
|
||
(„An alle", zwoelf Aufgaben mit einem Druck) darf durch diesen
|
||
Umbau nicht laenger werden.
|
||
|
||
DIE ANMERKUNG WIRD EINE NOTIZ, kein Anhaengsel an der
|
||
Beschreibung. `aufgaben_notizen` gibt es seit Langem, die Aufgabe
|
||
zeigt sie ohnehin an, und sie traegt, von wem sie stammt. In die
|
||
Beschreibung geschrieben waere sie nicht mehr von der Vorlage zu
|
||
unterscheiden -- und beim naechsten Mal haette dieselbe Vorlage
|
||
einen anderen Text. */
|
||
function fristAusWunsch(v, wunsch) {
|
||
/* EINE DAUERHAFTE AUFGABE HAT KEINE FRIST. Sie waere ab dem
|
||
naechsten Tag fuer immer ueberfaellig -- und eine Warnung, die
|
||
immer kommt, ist keine mehr. Dieselbe Regel steht seit Langem im
|
||
Aenderungsweg (workspace-aufgaben.js, `if (aus.dauerhaft)
|
||
aus.frist = null`); haette sie hier gefehlt, gaebe es zwei
|
||
Antworten auf dieselbe Frage, und die hiesige waere die falsche. */
|
||
if (wunsch?.dauerhaft) return null;
|
||
if (wunsch?.frist) return wunsch.frist;
|
||
/* Die Frist wird aus `tage` gerechnet, in ORTSZEIT. Ueber
|
||
toISOString kaeme zwischen Mitternacht und zwei Uhr der Vortag
|
||
heraus -- derselbe Fehler, der im Haus schon einmal eine
|
||
Pruefung falsch rot gemacht hat. */
|
||
const d = new Date(Date.now() + (v.tage || 7) * 86400_000);
|
||
return `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, "0")}`
|
||
+ `-${String(d.getDate()).padStart(2, "0")}`;
|
||
}
|
||
|
||
/** Die Anmerkung als erste Notiz an der frischen Aufgabe. */
|
||
function anmerkungAnlegen(aufgabeId, wunsch, vonId) {
|
||
if (!wunsch?.anmerkung) return;
|
||
db().prepare(`INSERT INTO aufgaben_notizen (aufgabe_id, person_id, text, erstellt)
|
||
VALUES (?,?,?,?)`).run(aufgabeId, vonId ?? null, wunsch.anmerkung, jetzt());
|
||
}
|
||
|
||
function katalogAufgabeAnlegen(v, zielId, vonId, zustand = "offen", wunsch = null) {
|
||
const frist = fristAusWunsch(v, wunsch);
|
||
db().prepare(`INSERT INTO aufgaben
|
||
(titel, beschreibung, status, prioritaet, verantwortlich_id, frist,
|
||
kategorie, vorlage, dauerhaft, erstellt, erstellt_von)
|
||
VALUES (?,?,'offen',?,?,?,?,?,?,?,?)`)
|
||
.run(v.titel, v.text, v.tage <= 1 ? "hoch" : "mittel",
|
||
zielId, frist, v.kategorie, v.schluessel, wunsch?.dauerhaft ? 1 : 0,
|
||
jetzt(), vonId);
|
||
const id = db().prepare("SELECT last_insert_rowid() AS id").get().id;
|
||
anmerkungAnlegen(id, wunsch, vonId);
|
||
const nun = jetzt();
|
||
db().prepare(`INSERT INTO aufgaben_zuteilung
|
||
(aufgabe_id, person_id, zustand, zugeteilt_am, zugeteilt_von, geantwortet_am)
|
||
VALUES (?,?,?,?,?,?)`)
|
||
.run(id, zielId, zustand, nun, vonId ?? null,
|
||
/* „Wann geantwortet" nur, wenn schon geantwortet wurde. Bei
|
||
`offen` steht die Frage noch aus. */
|
||
zustand === "offen" ? null : nun);
|
||
return id;
|
||
}
|
||
|
||
/* Wie lang darf ein Wort zu einer Bewerbung sein? Dieselbe Groesse wie
|
||
drueben bei den Aufgaben -- ein Satz, kein Aufsatz. */
|
||
const BEWERBUNG_TEXT_MAX = 600;
|
||
|
||
/* Wie lang darf die Anmerkung beim Uebernehmen sein? Dieselbe Zahl wie
|
||
`NOTIZ_MAX` in workspace-aufgaben.js -- sie WIRD eine Notiz, und
|
||
zwei verschiedene Grenzen fuer dieselbe Zeile waeren die Sorte
|
||
Unterschied, die man erst bemerkt, wenn etwas abgeschnitten ist. */
|
||
const ANMERKUNG_MAX = 2000;
|
||
|
||
/* =====================================================================
|
||
WAS NACH EINER ANTWORT UEBRIG BLEIBT (30.09.2026)
|
||
|
||
VanVan im Support: „dann bekommt der Modi keine Benachrichtigung
|
||
darüber, dass die Aufgabe abgelehnt wurde und sieht somit auch eine
|
||
eventuelle Begründung nicht. Außerdem haben auch wir nirgendwo eine
|
||
Übersicht, bei wem wir welche Aufgaben schon abgelehnt haben."
|
||
|
||
Gemessen, bevor gebaut wurde: Frida sah nach der Absage NULL
|
||
beantwortete Bewerbungen, die Leitung NULL Absagen.
|
||
|
||
Der Grund steht eine Funktion weiter unten: `WHERE zustand =
|
||
'beworben'`. Sobald jemand antwortet, faellt die Zeile aus jeder
|
||
Ansicht heraus -- mitsamt der Begruendung, die man ausdruecklich
|
||
verlangt hat.
|
||
|
||
Bei einer ZUSAGE fiel das nicht auf: Dort entsteht eine Aufgabe,
|
||
und an ihrer Karte steht die Antwort. Bei einer ABSAGE entsteht
|
||
nichts.
|
||
===================================================================== */
|
||
|
||
/** Wie lange eine beantwortete Bewerbung beim Bewerber stehen bleibt.
|
||
* Zwei Wochen: lang genug, dass man sie sieht, kurz genug, dass das
|
||
* Brett nicht zur Ablage wird. */
|
||
const ANTWORT_TAGE = 14;
|
||
|
||
/** Wie weit die Absagen-Uebersicht zurueckreicht.
|
||
* Drei Monate -- VanVans Frage ist „bewirbt sich jemand immer wieder
|
||
* auf etwas, das wir immer wieder ablehnen?", und die beantwortet
|
||
* eine Woche nicht. */
|
||
const ABSAGEN_TAGE = 90;
|
||
|
||
const vorTagen = (n) => new Date(Date.now() - n * 86400_000).toISOString();
|
||
|
||
/** Meine eigenen beantworteten Bewerbungen -- mit der Begruendung.
|
||
*
|
||
* NUR DIE EIGENEN, ausdruecklich. Wer entscheidet, sieht die Absagen
|
||
* in der Uebersicht darunter; hier geht es um die Antwort, auf die
|
||
* man selbst gewartet hat.
|
||
*/
|
||
function vorlagenAntwortenFuer(person) {
|
||
try {
|
||
return db().prepare(`
|
||
SELECT b.id, b.vorlage, b.zustand, b.text, b.entscheid_text,
|
||
b.entschieden_am, b.aufgabe_id, e.name AS von_name
|
||
FROM vorlagen_bewerbungen b
|
||
LEFT JOIN personen e ON e.id = b.entschieden_von
|
||
WHERE b.person_id = ?
|
||
AND b.zustand IN ('angenommen','abgelehnt')
|
||
AND COALESCE(b.entschieden_am, '') >= ?
|
||
ORDER BY b.entschieden_am DESC`)
|
||
.all(person.id, vorTagen(ANTWORT_TAGE))
|
||
.map((z) => ({ ...z, titel: vorlageZuSchluessel(z.vorlage)?.titel || z.vorlage }));
|
||
} catch (fehler) {
|
||
console.error("[vorlagen] Antworten:", fehler?.message);
|
||
return [];
|
||
}
|
||
}
|
||
|
||
/** Was die Leitung schon abgelehnt hat -- aus BEIDEN Wegen.
|
||
*
|
||
* AUS BEIDEN, und das ist der Punkt. Man kann sich auf eine Vorlage
|
||
* bewerben und auf eine Aufgabe, die es schon gibt. Eine Uebersicht,
|
||
* die nur die Haelfte zeigt, ist schlimmer als keine: „Frida wurde
|
||
* nie abgelehnt" waere dann eine Auskunft, die stimmt und taeuscht.
|
||
*
|
||
* `entschieden_von IS NOT NULL` TRENNT ZWEI DINGE, die beide
|
||
* `abgelehnt` heissen:
|
||
* · die Leitung hat eine Bewerbung abgelehnt <- das hier
|
||
* · die Person hat eine Zuteilung abgelehnt <- ihre Entscheidung
|
||
* · „Von jemand anderem uebernommen" <- gar keine Absage
|
||
* Die letzten beiden tragen keinen Entscheider und fallen heraus.
|
||
*
|
||
* UND DIE HAUSTRENNUNG GILT: `darfSchreibenMit` -- wer den Menschen
|
||
* gar nicht sehen darf, sieht auch nicht, dass ihm abgesagt wurde.
|
||
*/
|
||
function absagenUebersicht(person) {
|
||
if (!entscheidetUeberAufgaben(person)) return null;
|
||
try {
|
||
const seit = vorTagen(ABSAGEN_TAGE);
|
||
const zeilen = db().prepare(`
|
||
SELECT 'vorlage' AS quelle, b.person_id, p.name AS person_name,
|
||
b.vorlage AS kennung, NULL AS aufgabe_id,
|
||
b.text AS wort, b.entscheid_text, b.entschieden_am,
|
||
e.name AS von_name
|
||
FROM vorlagen_bewerbungen b
|
||
LEFT JOIN personen p ON p.id = b.person_id
|
||
LEFT JOIN personen e ON e.id = b.entschieden_von
|
||
WHERE b.zustand = 'abgelehnt'
|
||
AND b.entschieden_von IS NOT NULL
|
||
AND COALESCE(b.entschieden_am, '') >= ?
|
||
UNION ALL
|
||
SELECT 'aufgabe', z.person_id, p.name,
|
||
a.titel, a.id,
|
||
z.grund, z.entscheid_text, z.entschieden_am,
|
||
e.name
|
||
FROM aufgaben_zuteilung z
|
||
JOIN aufgaben a ON a.id = z.aufgabe_id
|
||
LEFT JOIN personen p ON p.id = z.person_id
|
||
LEFT JOIN personen e ON e.id = z.entschieden_von
|
||
WHERE z.zustand = 'abgelehnt'
|
||
AND z.entschieden_von IS NOT NULL
|
||
AND COALESCE(z.entschieden_am, '') >= ?
|
||
ORDER BY entschieden_am DESC`).all(seit, seit);
|
||
|
||
const sichtbar = zeilen
|
||
.filter((z) => z.person_id && darfSchreibenMit(person, z.person_id))
|
||
.map((z) => ({
|
||
...z,
|
||
titel: z.quelle === "vorlage"
|
||
? (vorlageZuSchluessel(z.kennung)?.titel || z.kennung)
|
||
: z.kennung,
|
||
}));
|
||
|
||
/* WIE OFT JE MENSCH -- das ist VanVans eigentliche Frage. Eine
|
||
Liste von zwanzig Zeilen beantwortet „bewirbt sich jemand immer
|
||
wieder auf etwas, das wir immer wieder ablehnen?" nicht; eine
|
||
Zahl je Person schon.
|
||
|
||
ABGELEITET AUS DERSELBEN LISTE und nicht zweitgezaehlt: Zwei
|
||
Rechnungen fuer dieselbe Frage laufen auseinander. */
|
||
const jeMensch = new Map();
|
||
for (const z of sichtbar) {
|
||
const t = jeMensch.get(z.person_id)
|
||
|| { person_id: z.person_id, name: z.person_name, anzahl: 0, zuletzt: null };
|
||
t.anzahl += 1;
|
||
if (!t.zuletzt || String(z.entschieden_am) > t.zuletzt) t.zuletzt = z.entschieden_am;
|
||
jeMensch.set(z.person_id, t);
|
||
}
|
||
return {
|
||
seit_tagen: ABSAGEN_TAGE,
|
||
liste: sichtbar,
|
||
je_mensch: [...jeMensch.values()].sort((a, b) => b.anzahl - a.anzahl),
|
||
};
|
||
} catch (fehler) {
|
||
console.error("[vorlagen] Absagen:", fehler?.message);
|
||
return null;
|
||
}
|
||
}
|
||
|
||
/** Die offenen Bewerbungen, so wie sie die Seite braucht.
|
||
*
|
||
* WER WAS SIEHT, ENTSCHEIDET HIER DER SERVER: Wer entscheidet, sieht
|
||
* alle offenen; alle anderen sehen nur die eigenen. Im Browser zu
|
||
* filtern hiesse, die fremden Namen trotzdem auszuliefern -- und
|
||
* assets/js/aufgaben.js bekommt jeder, der die Seite oeffnet.
|
||
*/
|
||
function vorlagenBewerbungenFuer(person) {
|
||
const darf = entscheidetUeberAufgaben(person);
|
||
const zeilen = db().prepare(`
|
||
SELECT b.id, b.vorlage, b.kategorie, b.person_id, b.text, b.zustand,
|
||
b.entscheid_text, b.entschieden_am, b.erstellt, p.name AS person_name
|
||
FROM vorlagen_bewerbungen b
|
||
LEFT JOIN personen p ON p.id = b.person_id
|
||
WHERE b.zustand = 'beworben' ${darf ? "" : "AND b.person_id = ?"}
|
||
ORDER BY b.id`).all(...(darf ? [] : [person.id]));
|
||
return zeilen.map((z) => {
|
||
/* DER TITEL KOMMT MIT (25.09.2026).
|
||
|
||
Bis heute reichte der Schluessel: Die Bewerbung stand auf dem
|
||
Vorlagenbrett AN der Karte, und die Karte trug den Titel. Seit
|
||
sie auch im Aufgabenbrett steht (Filipes Wunsch, eigene
|
||
Kategorie), gibt es dort keine Karte daneben -- und ein
|
||
Schluessel wie "regeln_lesen" ist kein Satz, den jemand liest.
|
||
|
||
NACHGESCHLAGEN, NICHT MITGESPEICHERT: Der Titel gehoert dem
|
||
Katalog. Wuerde er in der Bewerbungszeile stehen, haette man
|
||
zwei Wahrheiten, und die aeltere gewinnt still, sobald jemand
|
||
eine Vorlage umbenennt. */
|
||
const v = vorlageZuSchluessel(z.vorlage);
|
||
return {
|
||
id: z.id, vorlage: z.vorlage, kategorie: z.kategorie,
|
||
titel: v?.titel || z.vorlage,
|
||
text_vorlage: v?.text || null,
|
||
tage: v?.tage ?? null,
|
||
person_id: z.person_id, person_name: z.person_name || "Jemand",
|
||
text: z.text || null, erstellt: z.erstellt,
|
||
selbst: z.person_id === person.id,
|
||
};
|
||
});
|
||
}
|
||
|
||
/* =====================================================================
|
||
SICH AUF EINE VORLAGE BEWERBEN (23.09.2026)
|
||
|
||
Filipe: "die modis sollen bei all diesen voschlaegen auch nur
|
||
bewerben koennen. die aufgaben aus der vorlage, da sollen die modis
|
||
sich nur bewerben koennen und nur dogfather und die rechte hand
|
||
sollen annehmen oder ablehnen koennen, mit einem text als notiz."
|
||
|
||
WER DARF WAS -- und die zweite Zeile ist die, die er ausdruecklich
|
||
gesagt hat:
|
||
|
||
bewerben wer NICHT verteilen darf (die Modis)
|
||
entscheiden DogFather und die rechte Hand
|
||
uebernehmen wer verteilen darf, wie bisher
|
||
|
||
DIE LINKE HAND STEHT ABSICHTLICH NICHT BEI DEN ENTSCHEIDERN. Sie
|
||
gehoert sonst ueberall dazu (Auftrag vom 22.09.: "ich will dass die
|
||
linke hand auch ueberall zu sehen ist"), hier hat Filipe genau zwei
|
||
genannt. Das ist keine Vergesslichkeit von mir, sondern seine
|
||
Aufzaehlung -- und dieselbe Grenze zieht das Haus schon bei den
|
||
Aufgaben-Bewerbungen (entscheidetUeberAufgaben).
|
||
|
||
DER TEXT IST FREIWILLIG BEIM BEWERBEN und freiwillig beim
|
||
Entscheiden. Beim ABLEHNEN einer zugeteilten Aufgabe ist eine
|
||
Begruendung Pflicht -- dort sagt jemand ab, der gefragt wurde. Hier
|
||
bittet jemand; ein "bitte" braucht keine Begruendung. Filipes Wort
|
||
ist "mit einem text als notiz", also eine Moeglichkeit, keine Huerde.
|
||
===================================================================== */
|
||
|
||
/** Die Vorlage zu einer Kennung -- oder null.
|
||
* Gesucht wird ueber den SCHLUESSEL und nicht ueber die Nummer in der
|
||
* Liste: Die Nummer verschiebt sich, sobald jemand eine Vorlage
|
||
* einfuegt, und dann bewirbt man sich auf etwas anderes, als man
|
||
* gesehen hat. Genau dieser Fehler ist am 16.09. schon einmal
|
||
* passiert. */
|
||
function vorlageZuSchluessel(schluessel) {
|
||
return MODI_AUFGABEN_FLACH.find((v) => v.schluessel === schluessel) || null;
|
||
}
|
||
|
||
/* ==== NUR DIE BEWERBUNGEN, OHNE DEN GANZEN KATALOG (25.09.2026) ====
|
||
|
||
Filipe: „ich will in dieser seite auch eine eigene kategorie fuer
|
||
die aufgaben wo die modis sich selbst bewerben. ich will dass man
|
||
die getrennt sieht."
|
||
|
||
Das Aufgabenbrett braucht die Bewerbungen -- aber nicht den Katalog
|
||
mit allen Vorlagen, der an `/workspace/api/vorlagen` haengt. Ein
|
||
eigener, kleiner Weg statt eines Mitschleppens: Das Brett laedt bei
|
||
jedem Zeichnen, und der Katalog ist um ein Vielfaches groesser als
|
||
die Handvoll Bewerbungen.
|
||
|
||
WER WAS SIEHT, ENTSCHEIDET UNVERAENDERT `vorlagenBewerbungenFuer`:
|
||
Wer entscheidet, sieht alle offenen; alle anderen nur die eigenen.
|
||
Diese Route waehlt nichts selbst aus -- sonst gaebe es eine zweite
|
||
Stelle, an der die Sichtbarkeit falsch werden kann. */
|
||
vorlagenRouter.get("/workspace/api/vorlagen/bewerbungen", (req, res) => {
|
||
try {
|
||
/* WER ENTSCHEIDET, KOMMT MIT. Die Oberflaeche soll die zwei
|
||
Knoepfe nur dort zeigen, wo der Server sie auch annimmt -- und
|
||
sie darf es nicht am Rollennamen ausrechnen: `assets/js` bekommt
|
||
jeder, der die Seite oeffnet, und ein Rollenvergleich im Browser
|
||
ist in diesem Haus diese Woche dreimal veraltet. */
|
||
res.json({
|
||
bewerbungen: vorlagenBewerbungenFuer(req.person),
|
||
darf_entscheiden: entscheidetUeberAufgaben(req.person),
|
||
});
|
||
} catch (f) {
|
||
console.error("[vorlagen] Bewerbungen lesen:", f?.message);
|
||
res.status(503).json({ fehler: "nicht_verfuegbar" });
|
||
}
|
||
});
|
||
|
||
vorlagenRouter.post("/workspace/api/vorlagen/bewerben", gleicheHerkunft,
|
||
express.json({ limit: "4kb" }), (req, res) => {
|
||
try {
|
||
if (!kategorienFuer(req.person).length) {
|
||
/* Wortgleich mit einer erfundenen Vorlage -- wer den Katalog
|
||
nicht bekommt, soll nicht erfahren, dass es ihn gibt. */
|
||
return res.status(400).json({ fehler: "Unbekannte Vorlage." });
|
||
}
|
||
/* WER VERTEILEN DARF, BEWIRBT SICH NICHT. Er traegt sich ein --
|
||
eine Bitte an sich selbst waere ein Vorgang ohne Gegenueber,
|
||
und im schlimmsten Fall entscheidet jemand ueber die eigene
|
||
Bewerbung. */
|
||
if (darfAufgabenVerteilen(req.person)) {
|
||
return res.status(403).json({ fehler: "du_entscheidest_selbst" });
|
||
}
|
||
const v = vorlageZuSchluessel(String(req.body?.vorlage || ""));
|
||
if (!v) return res.status(400).json({ fehler: "Unbekannte Vorlage." });
|
||
|
||
const text = String(req.body?.text ?? "").trim().slice(0, BEWERBUNG_TEXT_MAX) || null;
|
||
const d = db();
|
||
|
||
/* SCHON BEWORBEN? Die Datenbank sagt es ohnehin (der Index ist
|
||
eindeutig) -- aber eine saubere Antwort ist besser als ein
|
||
Fehler aus der Tiefe. */
|
||
const schon = d.prepare(`SELECT id FROM vorlagen_bewerbungen
|
||
WHERE vorlage = ? AND person_id = ? AND zustand = 'beworben'`)
|
||
.get(v.schluessel, req.person.id);
|
||
if (schon) return res.status(409).json({ fehler: "schon_beworben" });
|
||
|
||
/* UND LIEGT SIE SCHON AUF DEM BRETT? Sich auf etwas zu bewerben,
|
||
das man bereits hat, ist eine Bitte ins Leere. */
|
||
const liegtSchon = d.prepare(`SELECT id FROM aufgaben
|
||
WHERE vorlage = ? AND verantwortlich_id = ? AND status <> 'erledigt'`)
|
||
.get(v.schluessel, req.person.id);
|
||
if (liegtSchon) return res.status(409).json({ fehler: "liegt_schon_bei_dir" });
|
||
|
||
d.prepare(`INSERT INTO vorlagen_bewerbungen
|
||
(vorlage, kategorie, person_id, text, zustand, erstellt)
|
||
VALUES (?,?,?,?,'beworben',?)`)
|
||
.run(v.schluessel, v.kategorie, req.person.id, text, jetzt());
|
||
|
||
/* ES ERFAEHRT JEMAND (23.09.2026) -- siehe die Begruendung in
|
||
workspace-bewerbung-melden.js. Ohne diese Zeile waere die
|
||
Bewerbung ein Zettel in einer Schublade, die niemand oeffnet. */
|
||
void meldeBewerbung({
|
||
bewerber: { id: req.person.id, name: req.person.name },
|
||
titel: v.titel,
|
||
wort: text,
|
||
ziel: "/workspace/aufgaben.html",
|
||
});
|
||
|
||
protokolliere("vorlage_beworben", {
|
||
personId: req.person.id, rolle: req.person.rolle, ip: echteIp(req),
|
||
detail: `${v.schluessel} ${v.titel}`.slice(0, 120),
|
||
});
|
||
res.status(201).json({ ok: true, bewerbungen: vorlagenBewerbungenFuer(req.person) });
|
||
} catch (f) {
|
||
console.error("[vorlagen] bewerben:", f?.message);
|
||
res.status(503).json({ fehler: "nicht_verfuegbar" });
|
||
}
|
||
});
|
||
|
||
/* ---- Die eigene Bewerbung zuruecknehmen ------------------------------
|
||
Sie wird GELOESCHT und nicht auf "zurueckgezogen" gesetzt: Wer sich
|
||
nicht mehr bewirbt, hat nichts getan, was jemand nachlesen muesste --
|
||
und eine Zeile, die nur noch sagt "hier stand mal eine Bewerbung",
|
||
waere in der Liste der Leitung Laerm. Dieselbe Entscheidung wie bei
|
||
den Aufgaben-Bewerbungen. */
|
||
vorlagenRouter.post("/workspace/api/vorlagen/bewerbung-zurueck", gleicheHerkunft,
|
||
express.json({ limit: "2kb" }), (req, res) => {
|
||
try {
|
||
const id = Number(req.body?.id);
|
||
if (!Number.isInteger(id)) return res.status(400).json({ fehler: "ungueltig" });
|
||
const b = db().prepare("SELECT * FROM vorlagen_bewerbungen WHERE id = ?").get(id);
|
||
/* NICHT MEINE = GIBT ES NICHT. Ein 403 verriete, dass es sie
|
||
gibt und wem sie gehoert. */
|
||
if (!b || b.person_id !== req.person.id || b.zustand !== "beworben") {
|
||
return res.status(404).json({ fehler: "nicht_gefunden" });
|
||
}
|
||
db().prepare("DELETE FROM vorlagen_bewerbungen WHERE id = ?").run(id);
|
||
protokolliere("vorlage_bewerbung_zurueck", {
|
||
personId: req.person.id, rolle: req.person.rolle, ip: echteIp(req),
|
||
detail: String(b.vorlage).slice(0, 120),
|
||
});
|
||
res.json({ ok: true, bewerbungen: vorlagenBewerbungenFuer(req.person) });
|
||
} catch (f) {
|
||
console.error("[vorlagen] bewerbung-zurueck:", f?.message);
|
||
res.status(503).json({ fehler: "nicht_verfuegbar" });
|
||
}
|
||
});
|
||
|
||
/* ---- Entscheiden: annehmen oder ablehnen ------------------------------
|
||
|
||
EINE SCHLEIFE FUER BEIDE WEGE. Zwei fast gleiche Routen waeren zwei
|
||
Gelegenheiten, dass eine die Rechtepruefung oder das Protokoll
|
||
vergisst -- und es ist immer die zweite.
|
||
|
||
BEI DER ZUSAGE ENTSTEHT DIE AUFGABE, und zwar ueber dieselbe
|
||
Funktion wie beim Uebernehmen (katalogAufgabeAnlegen). Damit sieht
|
||
eine erbetene Aufgabe genauso aus wie eine verteilte: gleiche Frist,
|
||
gleiche Kategorie, gleiche Kennung. Ein zweiter Weg waere ein
|
||
zweiter Satz Regeln. */
|
||
for (const [weg, ja] of [["annehmen", true], ["ablehnen", false]]) {
|
||
vorlagenRouter.post(`/workspace/api/vorlagen/bewerbung/${weg}`, gleicheHerkunft,
|
||
express.json({ limit: "4kb" }), (req, res) => {
|
||
try {
|
||
/* NUR DOGFATHER UND DIE RECHTE HAND -- woertlich nach Filipes
|
||
Aufzaehlung, und dieselbe Schranke wie bei den
|
||
Aufgaben-Bewerbungen. */
|
||
if (!entscheidetUeberAufgaben(req.person)) {
|
||
return res.status(403).json({ fehler: "nicht_erlaubt" });
|
||
}
|
||
const id = Number(req.body?.id);
|
||
if (!Number.isInteger(id)) return res.status(400).json({ fehler: "ungueltig" });
|
||
|
||
const d = db();
|
||
const b = d.prepare("SELECT * FROM vorlagen_bewerbungen WHERE id = ?").get(id);
|
||
if (!b || b.zustand !== "beworben") {
|
||
return res.status(409).json({ fehler: "keine_bewerbung" });
|
||
}
|
||
const v = vorlageZuSchluessel(b.vorlage);
|
||
if (!v) return res.status(409).json({ fehler: "vorlage_weg" });
|
||
|
||
/* GIBT ES DIE PERSON NOCH? Zwischen Bewerbung und Antwort
|
||
koennen Tage liegen. Eine Aufgabe an einen abgeschalteten
|
||
Zugang waere Arbeit, die nie jemand sieht. */
|
||
const wer = d.prepare(
|
||
"SELECT id, name FROM personen WHERE id = ? AND aktiv = 1").get(b.person_id);
|
||
if (!wer) return res.status(409).json({ fehler: "person_weg" });
|
||
|
||
const kommentar = String(req.body?.kommentar ?? "").trim()
|
||
.slice(0, BEWERBUNG_TEXT_MAX) || null;
|
||
const nun = jetzt();
|
||
let aufgabeId = null;
|
||
|
||
if (ja) {
|
||
/* `angenommen`: Er hat darum gebeten, und die Bitte wurde
|
||
angenommen. Ihn danach noch einmal „Annehmen" druecken zu
|
||
lassen waere dieselbe Frage zweimal. */
|
||
aufgabeId = katalogAufgabeAnlegen(v, wer.id, req.person.id, "angenommen");
|
||
}
|
||
d.prepare(`UPDATE vorlagen_bewerbungen
|
||
SET zustand = ?, entscheid_text = ?, entschieden_von = ?,
|
||
entschieden_am = ?, aufgabe_id = ?
|
||
WHERE id = ?`)
|
||
.run(ja ? "angenommen" : "abgelehnt", kommentar, req.person.id,
|
||
nun, aufgabeId, id);
|
||
|
||
/* DIE ANTWORT AN DEN, DER GEWARTET HAT -- mit der Notiz.
|
||
Bei einer Zusage fuehrt das Antippen auf die neue Aufgabe,
|
||
bei einer Absage auf das Brett: Dort steht die Vorlage
|
||
wieder offen, und man kann sich spaeter erneut bewerben. */
|
||
void meldeBewerbungsantwort({
|
||
anWen: wer.id,
|
||
titel: v.titel,
|
||
ja,
|
||
notiz: kommentar,
|
||
ziel: aufgabeId
|
||
? `/workspace/aufgaben.html?aufgabe=${aufgabeId}`
|
||
: "/workspace/aufgaben.html",
|
||
});
|
||
|
||
protokolliere(ja ? "vorlage_bewerbung_angenommen" : "vorlage_bewerbung_abgelehnt", {
|
||
personId: req.person.id, rolle: req.person.rolle, ip: echteIp(req),
|
||
detail: `${b.vorlage} fuer ${wer.name}`.slice(0, 120),
|
||
});
|
||
res.json({
|
||
ok: true, zustand: ja ? "angenommen" : "abgelehnt",
|
||
aufgabe_id: aufgabeId,
|
||
bewerbungen: vorlagenBewerbungenFuer(req.person),
|
||
});
|
||
} catch (f) {
|
||
console.error(`[vorlagen] bewerbung/${weg}:`, f?.message);
|
||
res.status(503).json({ fehler: "nicht_verfuegbar" });
|
||
}
|
||
});
|
||
}
|
||
|
||
vorlagenRouter.post("/workspace/api/vorlagen/uebernehmen", gleicheHerkunft,
|
||
express.json({ limit: "16kb" }), (req, res) => {
|
||
try {
|
||
const art = String(req.body.art || "");
|
||
const nr = Number(req.body.nr);
|
||
|
||
/* ==== DIE DREI WUENSCHE AUS DEM FENSTER (02.10.2026) ========
|
||
|
||
VanVan, Meldung #6: „Bei den Vorlagen laesst sich weder die
|
||
Frist anpassen noch ‚dauerhaft' einstellen, und eine
|
||
Anmerkung fehlt auch."
|
||
|
||
GEPRUEFT WIRD HIER, nicht im Browser. Das Fenster bietet ein
|
||
Datumsfeld an; was ankommt, ist trotzdem eine Zeichenkette
|
||
aus dem Netz. Ein `frist` wie „morgen" oder „2026-13-45"
|
||
stuende sonst in der Datenbank und waere beim Sortieren
|
||
stiller Unsinn.
|
||
|
||
NICHT IN DIE VERGANGENHEIT. Eine Frist, die schon vorbei
|
||
ist, macht die Aufgabe in dem Moment rot, in dem sie
|
||
entsteht -- und „ueberfaellig" verliert seine Bedeutung,
|
||
wenn es auch frisch Verteiltes trifft.
|
||
|
||
„DAUERHAFT" DARF NUR, WER VERTEILEN DARF. Eine dauerhafte
|
||
Aufgabe laesst sich nicht abhaken (siehe den Commit vom
|
||
02.10. frueh) -- wer sie sich selbst anlegen koennte, haette
|
||
etwas, das er nie wieder loswird. Die Entscheidung gehoert
|
||
zur Leitung, genau wie das Beenden.
|
||
|
||
DIE PRUEFUNG STEHT VOR ALLEN ZWEIGEN, weil beide, die
|
||
Aufgaben anlegen, sie brauchen -- zweimal dasselbe waere
|
||
zweimal zu pflegen. */
|
||
const wunsch = (() => {
|
||
const roh = req.body || {};
|
||
const w = { frist: null, dauerhaft: false, anmerkung: null };
|
||
if (typeof roh.frist === "string" && roh.frist) {
|
||
if (!/^\d{4}-\d{2}-\d{2}$/.test(roh.frist)) return { fehler: "frist_ungueltig" };
|
||
const d = new Date(roh.frist + "T12:00:00");
|
||
if (Number.isNaN(d.getTime())
|
||
|| d.toISOString().slice(0, 10) !== roh.frist) {
|
||
return { fehler: "frist_ungueltig" };
|
||
}
|
||
if (roh.frist < heuteLokal()) return { fehler: "frist_vergangen" };
|
||
w.frist = roh.frist;
|
||
}
|
||
if (roh.dauerhaft === true) {
|
||
if (!darfAufgabenVerteilen(req.person)) return { fehler: "dauerhaft_nicht_erlaubt" };
|
||
w.dauerhaft = true;
|
||
}
|
||
if (typeof roh.anmerkung === "string" && roh.anmerkung.trim()) {
|
||
w.anmerkung = roh.anmerkung.replace(/\r\n/g, "\n").trim().slice(0, ANMERKUNG_MAX);
|
||
}
|
||
return w;
|
||
})();
|
||
if (wunsch.fehler) {
|
||
const saetze = {
|
||
frist_ungueltig: "Diese Frist versteht der Server nicht – bitte ein Datum wählen.",
|
||
frist_vergangen: "Diese Frist liegt in der Vergangenheit.",
|
||
dauerhaft_nicht_erlaubt:
|
||
"„Dauerhaft“ dürfen nur DogFather und die rechte Hand setzen – "
|
||
+ "eine dauerhafte Aufgabe lässt sich nicht abhaken.",
|
||
};
|
||
return res.status(wunsch.fehler === "dauerhaft_nicht_erlaubt" ? 403 : 400)
|
||
.json({ fehler: saetze[wunsch.fehler] });
|
||
}
|
||
/* Für wen? Ein Creator immer für sich; Betreuer für den Creator,
|
||
den sie gerade ansehen. */
|
||
let creatorId = req.person.rolle === "creator"
|
||
? req.person.id
|
||
: Number(req.body.creator_id) || null;
|
||
|
||
if (req.person.rolle !== "creator" && creatorId && !darfCreator(req.person, creatorId)) {
|
||
return res.status(404).json({ fehler: "nicht_gefunden" });
|
||
}
|
||
|
||
const angelegt = [];
|
||
/* Was nicht angelegt wurde, WEIL es schon offen liegt. Getrennt
|
||
von "angelegt", damit die Oberflaeche beides sagen kann --
|
||
eine Zahl allein liesse offen, ob etwas schiefging. */
|
||
const uebersprungen = [];
|
||
const einfuegen = (bereich, unterart, titel, text, zusatz = {}) => {
|
||
db().prepare(`INSERT INTO eintraege
|
||
(bereich, art, titel, text, datum, status, creator_id, hook, format,
|
||
erstellt, erstellt_von)
|
||
VALUES (?,?,?,?,?,?,?,?,?,?,?)`)
|
||
/* Der TAG in Ortszeit (01.10.2026), der Zeitstempel weiter
|
||
unten in UTC. Aus dem Startkatalog angelegte Eintraege
|
||
trugen sonst nachts das Datum von gestern. */
|
||
.run(bereich, unterart, titel, text, heuteLokal(), "offen",
|
||
creatorId, zusatz.hook || null, zusatz.format || null,
|
||
jetzt(), req.person.id);
|
||
angelegt.push(titel);
|
||
};
|
||
|
||
if (art === "content") {
|
||
const v = CONTENT_IDEEN[nr];
|
||
if (!v) return res.status(400).json({ fehler: "Unbekannte Vorlage." });
|
||
einfuegen("content", "idee", v.titel, v.text, { hook: v.hook, format: v.format });
|
||
|
||
} else if (art === "content_alle") {
|
||
for (const v of CONTENT_IDEEN) {
|
||
einfuegen("content", "idee", v.titel, v.text, { hook: v.hook, format: v.format });
|
||
}
|
||
|
||
} else if (BEREICH_PUNKTE[art]) {
|
||
/* live, community, technik -- alle drei funktionieren gleich.
|
||
Drei fast gleiche Bloecke waeren der sichere Weg dazu, dass
|
||
der dritte irgendwann anders reagiert als die ersten beiden. */
|
||
const unterart = String(req.body.unterart || "");
|
||
const liste = BEREICH_PUNKTE[art][unterart];
|
||
if (!liste) return res.status(400).json({ fehler: "Unbekannter Abschnitt." });
|
||
const v = liste[nr];
|
||
if (!v) return res.status(400).json({ fehler: "Unbekannte Vorlage." });
|
||
einfuegen(art, unterart, v.titel, v.text);
|
||
|
||
} else if (BEREICH_PUNKTE[art.replace(/_alle$/, "")] && art.endsWith("_alle")) {
|
||
const bereich = art.replace(/_alle$/, "");
|
||
const unterart = String(req.body.unterart || "");
|
||
const liste = BEREICH_PUNKTE[bereich][unterart];
|
||
if (!liste) return res.status(400).json({ fehler: "Unbekannter Abschnitt." });
|
||
for (const v of liste) einfuegen(bereich, unterart, v.titel, v.text);
|
||
|
||
} else if (art === "aufgabe" || art === "aufgaben_alle") {
|
||
/* ECHTE AUFGABEN, KEINE EINTRAEGE.
|
||
|
||
Alles darueber legt Eintraege an (Ideen, Notizen, Befunde).
|
||
Eine Aufgabe ist etwas anderes: Sie hat einen
|
||
Verantwortlichen, eine Frist und einen Status, der sich
|
||
bewegt. Deshalb eine eigene Zeile in `aufgaben` und nicht
|
||
noch eine Art in `eintraege` -- sonst stuende dieselbe Sache
|
||
an zwei Orten, und die beiden liefen auseinander.
|
||
|
||
OHNE CREATOR KEINE AUFGABE. Eine Aufgabe ohne Adressaten ist
|
||
ein Zettel. Der Server lehnt sie deshalb ab, statt sie
|
||
herrenlos anzulegen. */
|
||
const bereich = String(req.body.bereich || "");
|
||
const stufe = String(req.body.stufe || "");
|
||
const feld = (AUFGABEN_VORLAGEN[bereich] || {})[stufe];
|
||
if (!feld) return res.status(400).json({ fehler: "Unbekannter Bereich oder unbekannte Stufe." });
|
||
if (!creatorId) return res.status(400).json({ fehler: "Bitte zuerst einen Creator wählen." });
|
||
const auswahl = art === "aufgaben_alle" ? feld : [feld[nr]];
|
||
if (auswahl.some((v) => !v)) return res.status(400).json({ fehler: "Unbekannte Vorlage." });
|
||
for (const v of auswahl) {
|
||
/* Frist, „dauerhaft" und die Anmerkung kommen aus demselben
|
||
`wunsch` wie im Katalogzweig -- und aus derselben
|
||
Funktion. Zwei Rechnungen fuer dieselbe Frist waeren die
|
||
zweite, die beim naechsten Mal nicht mitgeaendert wird. */
|
||
const frist = fristAusWunsch(v, wunsch);
|
||
/* Die Kennung der Vorlage wandert mit (09.09.2026). Nur so
|
||
kann das Brett spaeter zeigen, was schon uebernommen ist --
|
||
und der Titel taugt dafuer nicht: Er darf geaendert werden. */
|
||
db().prepare(`INSERT INTO aufgaben
|
||
(titel, beschreibung, status, prioritaet, creator_id, frist,
|
||
vorlage, dauerhaft, erstellt, erstellt_von)
|
||
VALUES (?,?,'offen',?,?,?,?,?,?,?)`)
|
||
.run(v.titel, v.text, stufe === "anfaenger" ? "hoch" : "mittel",
|
||
creatorId, frist, v.schluessel, wunsch.dauerhaft ? 1 : 0,
|
||
jetzt(), req.person.id);
|
||
anmerkungAnlegen(
|
||
db().prepare("SELECT last_insert_rowid() AS id").get().id,
|
||
wunsch, req.person.id);
|
||
angelegt.push(v.titel);
|
||
}
|
||
|
||
} else if (art === "katalog" || art === "katalog_alle") {
|
||
/* =============================================================
|
||
DER KATALOG AUS TEIL 2 (10.09.2026)
|
||
|
||
Wie der Zweig darueber legt er echte Aufgaben an, nicht
|
||
Eintraege. Zwei Unterschiede, und beide haben einen Grund:
|
||
|
||
WER DIE AUFGABE BEKOMMT. Bei den Creator-Vorlagen ist es der
|
||
gewaehlte Creator. Hier ist es die Person selbst, wenn sie an
|
||
eigenen Aufgaben arbeitet -- sonst muesste sie sich in einer
|
||
Auswahl selbst heraussuchen, um sich etwas vorzunehmen. Traegt
|
||
jemand fuer einen anderen ein (das kann nur die
|
||
DogFather-Rolle), muss dieser andere ausdruecklich genannt
|
||
werden.
|
||
|
||
DIE KATEGORIE WANDERT MIT. Sie steht am Katalogeintrag und ist
|
||
der halbe Wert der Vorlage: Ohne sie muesste man 60-mal von
|
||
Hand einsortieren, was im Dokument bereits danebensteht. */
|
||
if (!kategorienFuer(req.person).length) {
|
||
/* Wortgleich mit einer erfundenen Art -- wer den Katalog nicht
|
||
bekommt, soll nicht erfahren, dass es ihn gibt. */
|
||
return res.status(400).json({ fehler: "Unbekannte Art." });
|
||
}
|
||
/* ==== WER SICH HIER SELBST ETWAS NIMMT (23.09.2026) ======
|
||
|
||
Filipe: "die modis sollen bei all diesen voschlaegen auch
|
||
nur bewerben koennen."
|
||
|
||
Bis heute stand hier: Ein Modi nimmt sich die Aufgabe
|
||
selbst. Jetzt geht das ueber eine Bewerbung -- und zwar
|
||
HIER abgelehnt und nicht nur im Browser ausgeblendet. Ein
|
||
ausgeblendeter Knopf ist eine Bitte; abgelehnt wird an
|
||
dieser Stelle.
|
||
|
||
GEPRUEFT WIRD "DARF VERTEILEN" UND NICHT "IST MODI": Die
|
||
Frage ist nicht, wer jemand IST, sondern was er darf. So
|
||
gilt die Regel auch fuer jede Rolle, die morgen dazukommt --
|
||
und in dieser Datei steht kein Rollenname, der nicht
|
||
hineingehoert. */
|
||
if (!darfAufgabenVerteilen(req.person)) {
|
||
return res.status(403).json({ fehler: "erst_bewerben" });
|
||
}
|
||
/* ==== „AN ALLE" (24.09.2026) ================================
|
||
|
||
Filipe: „bei an ween fehlt noch die option alle neben den
|
||
namen allen."
|
||
|
||
EINE ANFRAGE, NICHT SECHS. Der Browser koennte fuer jede
|
||
Person einzeln anfragen -- und beim dritten von sechs
|
||
Aufrufen die Verbindung verlieren. Dann haette die Haelfte
|
||
des Teams die Aufgabe und die andere nicht, und niemand
|
||
saehe, wo es abgebrochen ist. Hier laeuft alles in einem
|
||
Durchgang.
|
||
|
||
DER DUPLIKAT-SCHUTZ GILT JE PERSON. Er steht weiter unten
|
||
und fragt, was diese eine Person schon hat -- bei „alle"
|
||
wird er deshalb pro Person neu gestellt. Wer die Vorlage
|
||
schon liegen hat, bekommt sie nicht doppelt; genau so
|
||
entstanden am 22.09. die 112 Aufgaben aus zwei Klicks. */
|
||
const anAlle = String(req.body.person_id) === "alle";
|
||
const zielId = anAlle ? null : (Number(req.body.person_id) || null);
|
||
if (!anAlle && !zielId) {
|
||
return res.status(400).json({ fehler: "Bitte zuerst eine Person wählen." });
|
||
}
|
||
/* Nur an jemanden, fuer den die Kategorien ueberhaupt gelten --
|
||
sonst landete eine Modi-Aufgabe samt Kategorie an einem
|
||
Creator, und die Trennung waere von innen aufgeweicht. */
|
||
const platzE = KATALOG_EMPFAENGER_SQL.map(() => "?").join(", ");
|
||
const zielListe = anAlle
|
||
? db().prepare(
|
||
`SELECT id, rolle FROM personen
|
||
WHERE aktiv = 1 AND rolle IN (${platzE}) ORDER BY id`)
|
||
.all(...KATALOG_EMPFAENGER_SQL)
|
||
: [db().prepare(
|
||
"SELECT id, rolle FROM personen WHERE id = ? AND aktiv = 1").get(zielId)]
|
||
.filter(Boolean);
|
||
if (!zielListe.length) {
|
||
return res.status(404).json({ fehler: "nicht_gefunden" });
|
||
}
|
||
/* EINE EIGENE ANTWORT FUER „DIE ROLLE BEKOMMT HIER NICHTS".
|
||
Vorher lief das ueber dieselbe 404 wie „die Person gibt es
|
||
nicht" -- und auf dem Bildschirm stand „lade die Seite neu",
|
||
was an einer Person, die sehr wohl existiert, nur ratlos
|
||
macht. Der Unterschied ist keine Feinheit: Das eine repariert
|
||
ein Neuladen, das andere nie. */
|
||
if (zielListe.some((z) => !KATALOG_EMPFAENGER.has(z.rolle))) {
|
||
return res.status(400).json({ fehler: "rolle_ohne_katalog" });
|
||
}
|
||
/* Nur noch als Beleg, dass die Liste nicht leer ist -- gelesen
|
||
wird sie in der Schleife weiter unten. Ein ungenutzter Wert
|
||
waere Rauschen; dieser sagt etwas. */
|
||
if (!zielListe[0]) return res.status(404).json({ fehler: "nicht_gefunden" });
|
||
|
||
/* AUS DEM KATALOG, DEN DIE SEITE AUCH BEKOMMEN HAT (16.09.2026).
|
||
|
||
Hier stand `MODI_KATALOG` -- die neun Phasen. Seit der Umbau
|
||
auf Kategorie mal Stufe liefert /api/vorlagen etwas anderes
|
||
aus, und der Browser schickt die Nummer aus DIESER Liste
|
||
zurueck. Waere es so geblieben, haette ein Klick auf
|
||
"Uebernehmen" eine voellig andere Aufgabe angelegt -- und
|
||
zwar eine, die es gibt, also ohne Fehlermeldung.
|
||
|
||
Gefunden hat das pruef-modi-katalog, nicht das Lesen: Die
|
||
Pruefung suchte eine Phase, die es nicht mehr gibt, und
|
||
stuerzte ab. */
|
||
const gruppe = String(req.body.gruppe || "");
|
||
const stufe = String(req.body.stufe || "");
|
||
const auswahl = art === "katalog_alle"
|
||
? MODI_AUFGABEN_FLACH.filter((v) => v.kategorie === gruppe
|
||
&& (!stufe || v.stufe === stufe))
|
||
: [MODI_AUFGABEN_FLACH[nr]];
|
||
if (!auswahl.length || auswahl.some((v) => !v)) {
|
||
return res.status(400).json({ fehler: "Unbekannte Vorlage." });
|
||
}
|
||
/* ==== WAS SCHON OFFEN LIEGT, KOMMT NICHT NOCH EINMAL ========
|
||
|
||
AM 22.09.2026 UM 16:05 IST GENAU DAS PASSIERT: 56 Aufgaben
|
||
um 16:05:24, dieselben 56 um 16:05:53. Ein zweiter Druck auf
|
||
"Alle uebernehmen", 29 Sekunden spaeter -- und nichts hat
|
||
ihn aufgehalten. Vier Menschen fanden danach je 28 Aufgaben
|
||
vor, jede doppelt. Filipe hat sie nicht verteilt und wusste
|
||
nicht, woher sie kamen.
|
||
|
||
NUR BEIM MASSENKNOPF, NICHT BEIM EINZELNEN. Ein "Nochmal"
|
||
an einer einzelnen Karte ist eine bewusste Entscheidung --
|
||
manches macht man jede Woche neu, und der Knopf sagt es
|
||
sogar. Ein Griff, der zwoelf Aufgaben auf einmal holt, ist
|
||
etwas anderes: Ob er schon gedrueckt wurde, sieht man ihm
|
||
nicht an, und beim zweiten Mal richtet er zwoelffachen
|
||
Schaden an.
|
||
|
||
"OFFEN" HEISST OFFEN. Was erledigt oder abgebrochen ist,
|
||
darf wiederkommen -- sonst koennte man eine Aufgabe, die
|
||
jede Woche ansteht, nach dem ersten Abhaken nie wieder
|
||
holen. Gefragt wird also nicht "gab es die schon mal",
|
||
sondern "liegt die gerade noch da".
|
||
|
||
Dieselbe Sperre steht seit dem 10.09. im Termin-Zweig weiter
|
||
unten. Dass sie hier fehlte, ist nicht aufgefallen, weil
|
||
niemand zweimal drueckt -- bis es jemand tat. */
|
||
/* JE PERSON EINMAL (24.09.2026, fuer „An alle").
|
||
|
||
Die Duplikatsperre fragt, was DIESE Person schon liegen
|
||
hat -- deshalb steht sie INNERHALB der Schleife. Waere sie
|
||
davor, bekaeme bei „alle" nur die erste Person ihre
|
||
Pruefung, und alle anderen haetten die Vorlage doppelt.
|
||
|
||
Bei einer einzelnen Person aendert sich nichts: Die
|
||
Schleife laeuft dann genau einmal. */
|
||
/* ==== "AN ALLE" FUELLT LUECKEN, ES DOPPELT NICHT (24.09.2026)
|
||
|
||
Filipe, zur Frage "3 von 5 haben sie schon": „Nur die 2
|
||
Fehlenden bekommen sie."
|
||
|
||
GEMESSEN, NICHT GEGLAUBT. Der Kommentar zwei Absaetze
|
||
hoeher behauptete, die Sperre werde "bei alle pro Person neu
|
||
gestellt". Er beschreibt nur, WO sie steht -- aktiv war sie
|
||
allein bei `katalog_alle`. Zweimal "An alle" auf dieselbe
|
||
Karte ergab deshalb VIER Aufgaben statt zwei. Gefunden hat
|
||
das keine Ueberlegung, sondern eine Pruefung, die nachzaehlt.
|
||
|
||
UND DIE BEWUSSTE WIEDERHOLUNG BLEIBT MOEGLICH. Manches steht
|
||
jede Woche an; wer es erneut verteilen will, drueckt einen
|
||
Knopf, der dann auch "Nochmal" heisst -- und der Browser sagt
|
||
das hier ausdruecklich (`nochmal`). Nicht die Sperre
|
||
verschwindet, sondern es wird gesagt, dass man sie meint.
|
||
Ein stillschweigendes Doppeln waere das, was am 22.09. aus
|
||
zwei Klicks 112 Aufgaben gemacht hat.
|
||
|
||
EINE EINZELNE PERSON BLEIBT UNBERUEHRT: Dort ist ein zweiter
|
||
Druck ohnehin eine Entscheidung, und der Knopf sagt es. */
|
||
const luecken = anAlle && req.body.nochmal !== true;
|
||
const lagSchonDa = [];
|
||
for (const ziel of zielListe) {
|
||
const liegtSchon = (art === "katalog_alle" || luecken)
|
||
? new Set(db().prepare(
|
||
`SELECT vorlage FROM aufgaben
|
||
WHERE verantwortlich_id = ?
|
||
AND vorlage IS NOT NULL
|
||
AND status NOT IN ('erledigt', 'abgebrochen')`)
|
||
.all(ziel.id).map((z) => z.vorlage))
|
||
: new Set();
|
||
for (const v of auswahl) {
|
||
if (liegtSchon.has(v.schluessel)) { lagSchonDa.push(v.titel); continue; }
|
||
katalogAufgabeAnlegen(v, ziel.id, req.person.id, "offen", wunsch);
|
||
angelegt.push(v.titel);
|
||
}
|
||
}
|
||
/* DIE ZAHL GEHOERT IN DIE ANTWORT, nicht nur in die Datenbank.
|
||
Ein Knopf, der "12 uebernehmen" heisst und dann schweigend
|
||
drei anlegt, sieht aus wie ein Fehler. */
|
||
if (lagSchonDa.length) uebersprungen.push(...lagSchonDa);
|
||
|
||
} else if (art === "katalog_termin") {
|
||
/* =============================================================
|
||
DIE LIVE-CHECKLISTE ZU EINEM TERMIN (10.09.2026, Kap. 5.7/11)
|
||
|
||
"Wird pro Live-Termin als Checkliste erzeugt und den
|
||
eingeteilten Modis zugewiesen." Genau das: die vierzehn
|
||
Punkte aus Vor / Waehrend / Nach, mit Frist auf den Tag des
|
||
Termins.
|
||
|
||
DIE KENNUNG TRAEGT DIE TERMINNUMMER (`mk-vor-technik#42`).
|
||
Ohne sie stuende beim ZWEITEN Live alles als "schon
|
||
uebernommen" da -- die Kennung wird naemlich benutzt, um
|
||
genau das anzuzeigen. Mit ihr hat jedes Live seine eigene
|
||
Liste, und der Knopf kann sagen, ob es sie schon gibt.
|
||
|
||
DIE FRIST IST DER TERMINTAG, nicht "in n Tagen". Eine
|
||
Vorbereitung, die nach dem Live faellig wird, ist keine. */
|
||
if (!kategorienFuer(req.person).length) {
|
||
return res.status(400).json({ fehler: "Unbekannte Art." });
|
||
}
|
||
const terminId = Number(req.body.termin_id);
|
||
if (!Number.isInteger(terminId) || terminId < 1) {
|
||
return res.status(400).json({ fehler: "Kein Termin angegeben." });
|
||
}
|
||
/* Ueber dieselbe Sichtbarkeitsregel wie der Kalender -- wer den
|
||
Termin nicht sehen darf, soll auch nicht erfahren, dass es
|
||
ihn gibt. */
|
||
const sicht = termineSichtbar(req.person, "t");
|
||
const termin = db().prepare(
|
||
`SELECT t.id, t.beginn FROM termine t WHERE ${sicht.wo} AND t.id = ?`)
|
||
.get(...sicht.werte, terminId);
|
||
if (!termin) return res.status(404).json({ fehler: "nicht_gefunden" });
|
||
|
||
/* WEM sie gehoert: den Modis, die an diesem Termin eingeteilt
|
||
sind. Ist keiner eingetragen, bekommt sie der, der drueckt --
|
||
sonst entstuenden vierzehn herrenlose Aufgaben. */
|
||
let leute = db().prepare(
|
||
`SELECT p.id FROM termin_teilnehmer tt JOIN personen p ON p.id = tt.person_id
|
||
WHERE tt.termin_id = ? AND p.rolle = 'modi' AND p.aktiv = 1`).all(terminId)
|
||
.map((z) => z.id);
|
||
if (!leute.length && req.person.rolle === "modi") leute = [req.person.id];
|
||
if (!leute.length) {
|
||
return res.status(400).json({
|
||
fehler: "Für dieses Live ist noch niemand eingeteilt.",
|
||
});
|
||
}
|
||
|
||
const tag = String(termin.beginn).slice(0, 10);
|
||
const punkte = MODI_KATALOG.filter((v) =>
|
||
v.gruppe === "vor" || v.gruppe === "waehrend" || v.gruppe === "nach");
|
||
/* Was es schon gibt, wird nicht doppelt angelegt. Ein zweiter
|
||
Druck soll nichts kaputtmachen -- und "nochmal" waere hier
|
||
anders als beim uebrigen Katalog eine Falle: Vierzehn Punkte
|
||
doppelt auf einem Live-Tag sind nicht zu gebrauchen. */
|
||
const schon = new Set(db().prepare(
|
||
"SELECT vorlage FROM aufgaben WHERE vorlage LIKE ?")
|
||
.all(`mk-%#${terminId}`).map((z) => z.vorlage));
|
||
for (const v of punkte) {
|
||
for (const wer of leute) {
|
||
const kennung = `${v.schluessel}#${terminId}`;
|
||
if (schon.has(kennung) && leute.length === 1) continue;
|
||
db().prepare(`INSERT INTO aufgaben
|
||
(titel, beschreibung, status, prioritaet, verantwortlich_id, frist,
|
||
kategorie, vorlage, erstellt, erstellt_von)
|
||
VALUES (?,?,'offen','hoch',?,?,?,?,?,?)`)
|
||
.run(v.titel, v.text, wer, tag, v.kategorie, kennung, jetzt(), req.person.id);
|
||
angelegt.push(v.titel);
|
||
}
|
||
}
|
||
if (!angelegt.length) {
|
||
return res.json({ angelegt: 0, titel: [], hinweis: "schon vorhanden" });
|
||
}
|
||
|
||
} else {
|
||
return res.status(400).json({ fehler: "Unbekannte Art." });
|
||
}
|
||
|
||
protokolliere("vorlage_uebernommen", req.person, echteIp(req),
|
||
`${art}: ${angelegt.length} Eintrag/Einträge`
|
||
+ (uebersprungen.length ? `, ${uebersprungen.length} lagen schon da` : ""));
|
||
res.json({ angelegt: angelegt.length, titel: angelegt,
|
||
uebersprungen: uebersprungen.length });
|
||
} catch (fehler) {
|
||
console.error("[workspace] Vorlage übernehmen:", fehler?.message);
|
||
res.status(503).json({ fehler: "nicht_verfuegbar" });
|
||
}
|
||
});
|
||
|
||
/* Die frühere Route /vorlagen/hilfe ist am 01.09.2026 entfallen.
|
||
Sie machte aus einer Bitte eine Aufgabe. Das war gut gemeint, aber
|
||
es gab damit zwei Wege, dasselbe zu sagen -- und Antworten landeten
|
||
mal als Aufgabe, mal als Nachricht. Geblieben ist die Rückmeldung an
|
||
jedem Punkt (workspace-checkliste.js).
|
||
|
||
Entfernt statt auskommentiert: Eine Route, die niemand mehr aufruft,
|
||
wird beim nächsten Mal für lebenden Code gehalten und mitgepflegt. */
|
||
|
||
/* =====================================================================
|
||
DER AUFGABENKATALOG FÜR DAS TEAM (16.09.2026)
|
||
|
||
Filipe: „perfektionniere die kategorien wo ich aufgaben an die modis
|
||
verteile und so, ich will dass du alles was es gibt auf der welt
|
||
durch gehst und wie bei den aufgaben wo sie für mich haben auch mit
|
||
kategorien und vielen aufgaben will ich das genau für sie genau so
|
||
perfektioniert und hochwertig geil."
|
||
|
||
---------------------------------------------------------------------
|
||
WAS DIE MESSUNG ERGEBEN HAT, BEVOR ICH ANGEFANGEN HABE
|
||
|
||
Es gab schon einen Katalog: MODI_KATALOG, 60 Einträge in neun
|
||
Phasen. Nachgezählt, wem sie gehören:
|
||
|
||
DogFather 13
|
||
DogFather & rechte Hand 12
|
||
rechte Hand 14
|
||
---------------------------------
|
||
zusammen 39 von 60
|
||
|
||
Zwei Drittel des „Modi-Katalogs" waren Aufbauarbeiten für Filipe
|
||
selbst. Nur 20 Einträge waren wirklich Arbeit für einen Menschen im
|
||
Team. Und die Verteilung über die vierzehn Kategorien war schief:
|
||
Planung 10, Events 1, Wachstum 1, Branding 1, Sonstiges 0.
|
||
|
||
MODI_KATALOG bleibt, was er ist — der Aufbauplan. Hier steht etwas
|
||
anderes: was ein Mensch im Team TUT, wenn der Laden läuft.
|
||
|
||
---------------------------------------------------------------------
|
||
KATEGORIE × STUFE — dieselbe Form wie bei den Creator-Vorlagen
|
||
|
||
Nicht nach Phasen, sondern nach Kategorie: Wer eine Aufgabe vergibt,
|
||
denkt „Frida macht Chat" und nicht „wir sind in Phase 3". Und je
|
||
Kategorie drei Stufen, weil dieselbe Kategorie für einen Neuen etwas
|
||
anderes bedeutet als für jemanden, der einarbeitet.
|
||
|
||
---------------------------------------------------------------------
|
||
WORAUF DIE INHALTE BERUHEN
|
||
|
||
Twitch und Discord (was ein Moderator tatsächlich tut): Chat in
|
||
Echtzeit beobachten, Spam und Regelbrüche entfernen, Auszeiten und
|
||
Sperren aussprechen, Neue begrüßen, Regeln erklären statt nur
|
||
durchzusetzen, die Energie tragen, ohne den Sendenden zu übertönen.
|
||
Lead-Moderatoren verwalten zusätzlich das Team selbst.
|
||
https://help.twitch.tv/s/article/Managing-Roles-for-your-Channel
|
||
https://discord.com/safety/training-and-onboarding-new-moderators
|
||
https://discord.com/safety/developing-moderator-guidelines
|
||
|
||
TikTok LIVE im Besonderen: gefilterte Kommentare durchsehen, Konten
|
||
stummschalten und sperren, GÄSTE verwalten (bis zu 20), Regeln zu
|
||
Beginn sichtbar machen, bei Matches („PK", offiziell LIVE Match) den
|
||
Gegenüber respektieren und den Chat mitnehmen, und Geschenke
|
||
bedanken, ohne darum zu betteln.
|
||
https://www.tiktok.com/discover/what-can-tiktok-live-moderators-do
|
||
https://ondigitals.com/how-to-battle-on-tiktok-live/
|
||
|
||
Community-Arbeit: ein bis zwei eigene Beiträge je Woche, monatlich
|
||
ein Rückblick darauf, welche Formate und Zeiten getragen haben,
|
||
Vertretung für Abwesenheiten, und Routinearbeit an vertraute Leute
|
||
abgeben statt alles selbst zu machen.
|
||
https://www.higherlogic.com/blog/community-management-checklist/
|
||
https://blog.hubspot.com/marketing/great-community-management-tips
|
||
|
||
Und aus der Burnout-Forschung, die schon in „Wie geht's dir?" steht:
|
||
Die zwei meistgenannten Gründe fürs Aufhören sind zu wenig Zeit und
|
||
Streit im Team — deshalb stehen in der Kategorie „Team" Aufgaben, die
|
||
genau das früh sichtbar machen.
|
||
|
||
---------------------------------------------------------------------
|
||
JEDE AUFGABE SAGT, WARUM
|
||
|
||
`text` ist keine Wiederholung des Titels. Wer eine Aufgabe bekommt,
|
||
ohne den Grund zu kennen, macht sie einmal und danach nicht mehr.
|
||
`tage` ist ein Vorschlag für die Frist, kein Gesetz.
|
||
===================================================================== */
|
||
|
||
export const MODI_AUFGABEN = {
|
||
chat: {
|
||
neu: [
|
||
{ schluessel: "ma-chat-regeln-lesen", titel: "Die Regeln des Rudels einmal ganz lesen", tage: 2,
|
||
text: "Nicht überfliegen. Wer sie kennt, kann sie erklären – und Erklären ist in neun von zehn Fällen wirksamer als Löschen." },
|
||
{ schluessel: "ma-chat-begruessen", titel: "Eine Sendung lang jeden Neuen begrüßen", tage: 3,
|
||
text: "Der erste Satz an einen Neuen entscheidet, ob er wiederkommt. Kostet nichts und passiert trotzdem selten." },
|
||
{ schluessel: "ma-chat-werkzeuge-ueben", titel: "Löschen, Stummschalten und Sperren einmal ausprobieren", tage: 2,
|
||
text: "In einer ruhigen Minute, nicht im Ernstfall. Wer den Knopf erst sucht, während es eskaliert, findet ihn zu spät." },
|
||
{ schluessel: "ma-chat-gefiltert-durchsehen", titel: "Die gefilterten Kommentare einmal durchgehen", tage: 3,
|
||
text: "TikTok hält Beiträge zurück, die es für problematisch hält. Dort steht beides: echter Müll und zu Unrecht Gefiltertes – das zweite kostet sonst einen Zuschauer." },
|
||
],
|
||
dabei: [
|
||
{ schluessel: "ma-chat-regeln-ansage", titel: "Die Regeln zu Beginn jeder Sendung sichtbar machen", tage: 7,
|
||
text: "Ein angehefteter Satz am Anfang. Regeln, die niemand gesehen hat, wirken beim Durchsetzen wie Willkür." },
|
||
{ schluessel: "ma-chat-eskalation-ueben", titel: "Hinweis, Pause, Ausschluss – einmal bewusst in dieser Reihenfolge", tage: 7,
|
||
text: "Wer sofort sperrt, hat einen Gegner statt eines Mitglieds. Die Reihenfolge ist die eigentliche Arbeit." },
|
||
{ schluessel: "ma-chat-stille-phasen", titel: "Bei Stille eine Frage in den Chat stellen", tage: 5,
|
||
text: "Ein Chat, in dem nichts steht, füllt sich nicht von allein. Eine Frage, die man mit einem Wort beantworten kann, bringt ihn zurück." },
|
||
{ schluessel: "ma-chat-uebergabe-notieren", titel: "Nach der Schicht drei Zeilen hinterlassen", tage: 5,
|
||
text: "Was auffiel, wer auffiel, was offen ist. Am nächsten Tag weiß es niemand mehr – auch du nicht." },
|
||
],
|
||
erfahren: [
|
||
{ schluessel: "ma-te-schnittfaehig-aufnehmen", titel: "Die Aufnahme so einrichten, dass Ausschnitte ohne Nacharbeit brauchbar sind", tage: 14,
|
||
text: "Getrennte Spuren und sauberer Pegel kosten einmal eine Stunde und sparen sie danach bei jedem einzelnen Ausschnitt wieder ein." },
|
||
{ schluessel: "ma-chat-faelle-sammeln", titel: "Fünf echte Fälle aufschreiben, wie sie entschieden wurden", tage: 14,
|
||
text: "Aus Entscheidungen wird erst dann eine Linie, wenn sie irgendwo steht. Sonst entscheidet jeder nach Bauchgefühl – und das unterscheidet sich." },
|
||
{ schluessel: "ma-chat-zweitmeinung", titel: "Bei jedem dauerhaften Ausschluss eine zweite Meinung einholen", tage: 10,
|
||
text: "Nicht, weil du falsch liegst. Sondern damit niemand allein dasteht, wenn jemand sich beschwert." },
|
||
{ schluessel: "ma-chat-neue-einarbeiten", titel: "Eine ganze Sendung neben einem Neuen sitzen", tage: 14,
|
||
text: "Nicht erklären, sondern danebensitzen und im Zweifel eingreifen. Ein fester Ansprechpartner in den ersten Wochen ist die am besten belegte Maßnahme gegen frühes Aufhören." },
|
||
],
|
||
},
|
||
|
||
community: {
|
||
neu: [
|
||
{ schluessel: "ma-com-stammnamen", titel: "Zehn Namen lernen, die immer da sind", tage: 5,
|
||
text: "Wiedererkannt zu werden ist der halbe Grund wiederzukommen. Zehn reichen für den Anfang." },
|
||
{ schluessel: "ma-com-erste-frage", titel: "Jemanden, der zum ersten Mal schreibt, mit Namen ansprechen", tage: 3,
|
||
text: "Einmal am Abend genügt. Es ist der Unterschied zwischen einem Publikum und einer Runde." },
|
||
],
|
||
dabei: [
|
||
{ schluessel: "ma-com-lange-weg", titel: "Wer lange nicht da war, bekommt eine Nachricht", tage: 7,
|
||
text: "Keine Werbung, eine Frage. Die meisten kommen nicht wieder, weil sie sich gestritten haben, sondern weil es niemandem aufgefallen ist." },
|
||
{ schluessel: "ma-com-geburtstage", titel: "Eine Liste der Geburtstage anlegen und pflegen", tage: 10,
|
||
text: "Ein Satz am richtigen Tag wirkt stärker als jede Aktion. Aber nur, wenn ihn jemand aufschreibt." },
|
||
{ schluessel: "ma-com-stimmung-melden", titel: "Nach jeder Sendung die Stimmung in einem Wort festhalten", tage: 7,
|
||
text: "Über Wochen sieht man daran mehr als an den Zahlen – und es dauert fünf Sekunden." },
|
||
],
|
||
erfahren: [
|
||
{ schluessel: "ma-com-kuemmerer", titel: "Für drei Stammleute die Zuständigkeit übernehmen", tage: 14,
|
||
text: "Feste Zuständigkeit statt „irgendwer“. Wer weiß, an wen er sich wendet, meldet sich, bevor er wegbleibt." },
|
||
{ schluessel: "ma-com-konflikt-frueh", titel: "Einen schwelenden Streit ansprechen, bevor er eskaliert", tage: 10,
|
||
text: "Streit in der Runde ist der zweithäufigste Grund, warum Leute gehen – und der, über den am wenigsten geredet wird." },
|
||
],
|
||
},
|
||
|
||
events: {
|
||
neu: [
|
||
{ schluessel: "ma-ev-termin-eintragen", titel: "Einen Termin vollständig in den Kalender eintragen", tage: 2,
|
||
text: "Titel, Beginn, wer dabei ist. Ein Termin, den nur einer im Kopf hat, findet ohne ihn nicht statt." },
|
||
{ schluessel: "ma-ev-erinnerung", titel: "Am Vortag an den Termin erinnern", tage: 3,
|
||
text: "Nicht am selben Tag – dann ist der Abend schon verplant." },
|
||
],
|
||
dabei: [
|
||
{ schluessel: "ma-ev-match-vorbereiten", titel: "Ein Match vorbereiten: Gegenüber, Zeit, Regeln", tage: 7,
|
||
text: "Fünf Minuten laufen schnell ab. Wer vorher weiß, worum es geht, verliert sie nicht mit Erklären." },
|
||
{ schluessel: "ma-ev-gaeste-verwalten", titel: "Die Gästeliste während einer Sendung betreuen", tage: 7,
|
||
text: "Wer hereingelassen wird und wer wartet. Ein Gast, der zehn Minuten in der Warteschlange hängt, kommt nicht wieder." },
|
||
{ schluessel: "ma-ev-nachbereitung", titel: "Nach einer Aktion aufschreiben, was getragen hat", tage: 5,
|
||
text: "Solange man es noch weiß. Eine Aktion, die niemand auswertet, wird beim nächsten Mal genauso gemacht – auch die Fehler." },
|
||
],
|
||
erfahren: [
|
||
{ schluessel: "ma-ev-reihe-planen", titel: "Eine Reihe über vier Wochen planen statt einzelner Abende", tage: 14,
|
||
text: "Eine Reihe hat einen Grund wiederzukommen. Ein einzelner guter Abend hat das nicht." },
|
||
{ schluessel: "ma-ev-ausfallplan", titel: "Für den nächsten Termin einen Ausfallplan festlegen", tage: 10,
|
||
text: "Wer springt ein, wenn du krank bist? Die Antwort muss vorher feststehen, nicht am Abend selbst." },
|
||
],
|
||
},
|
||
|
||
clipping: {
|
||
neu: [
|
||
{ schluessel: "ma-cl-erster-clip", titel: "Einen Ausschnitt schneiden und hochladen", tage: 3,
|
||
text: "Irgendeinen. Der erste ist nie gut – der zehnte schon, und zum zehnten kommt nur, wer den ersten gemacht hat." },
|
||
{ schluessel: "ma-cl-marken-setzen", titel: "Während der Sendung Stellen markieren", tage: 2,
|
||
text: "Zeitpunkt und drei Wörter. Wer hinterher zwei Stunden durchsucht, macht es genau einmal." },
|
||
],
|
||
dabei: [
|
||
{ schluessel: "ma-cl-erste-sekunden", titel: "Bei fünf Ausschnitten nur den Anfang überarbeiten", tage: 7,
|
||
text: "Die ersten ein bis drei Sekunden entscheiden über die Verbreitung. Alles danach ist für die, die schon geblieben sind." },
|
||
{ schluessel: "ma-cl-untertitel", titel: "Untertitel setzen und einmal ohne Ton ansehen", tage: 5,
|
||
text: "Ein großer Teil sieht ohne Ton. Ein Ausschnitt, der stumm nicht funktioniert, funktioniert für sie gar nicht." },
|
||
{ schluessel: "ma-cl-takt", titel: "Einen festen Tag pro Woche für Ausschnitte", tage: 7,
|
||
text: "Zwei feste Tage schlagen fünf zufällige – bei Sendungen wie bei Ausschnitten." },
|
||
],
|
||
erfahren: [
|
||
{ schluessel: "ma-cl-je-kanal", titel: "Denselben Moment für zwei Kanäle verschieden schneiden", tage: 7,
|
||
text: "Was auf dem Hauptkanal als Rückblick funktioniert, braucht bei Clips einen härteren Einstieg. Ein Schnitt, der überall gleich läuft, ist meist für keinen gemacht." },
|
||
{ schluessel: "ma-cl-zweimal", titel: "Einen Ausschnitt zweimal veröffentlichen, nur mit anderem Anfang", tage: 10,
|
||
text: "Gleicher Inhalt, andere ersten drei Sekunden. Das ist der einzige Weg, den Anfang zu bewerten, ohne dass alles andere dazwischenfunkt." },
|
||
{ schluessel: "ma-cl-was-kostet", titel: "Eine Woche lang mitschreiben, wie lange ein Ausschnitt dauert", tage: 7,
|
||
text: "Wer nicht weiß, was eine Sache kostet, kann nicht entscheiden, ob sie sich lohnt – und schneidet am Ende drei Stunden für zweihundert Aufrufe." },
|
||
{ schluessel: "ma-cl-was-lief", titel: "Die zehn erfolgreichsten Ausschnitte nebeneinanderlegen", tage: 14,
|
||
text: "Nicht raten, welche Art funktioniert. Nachsehen – meist ist es eine, die man selbst für die schwächste hielt." },
|
||
{ schluessel: "ma-cl-vorlage-bauen", titel: "Eine Vorlage bauen, mit der andere schneiden können", tage: 14,
|
||
text: "Solange nur einer schneiden kann, hört das Schneiden auf, sobald er keine Zeit hat." },
|
||
],
|
||
},
|
||
|
||
social: {
|
||
neu: [
|
||
{ schluessel: "ma-so-ankuendigung", titel: "Eine Ankündigung vor der Sendung absetzen", tage: 2,
|
||
text: "30 bis 60 Minuten vorher. Sie bündelt die, die ohnehin kommen wollten – und ein voller Start zieht neue nach." },
|
||
{ schluessel: "ma-so-antworten", titel: "Alle Kommentare unter einem Beitrag beantworten", tage: 3,
|
||
text: "Eine unbeantwortete Frage ist schlimmer als eine abgelehnte – sie sagt: du bist hier nicht gemeint." },
|
||
],
|
||
dabei: [
|
||
{ schluessel: "ma-so-woche-planen", titel: "Die Beiträge einer Woche im Voraus festlegen", tage: 7,
|
||
text: "Ein bis zwei eigene Beiträge je Woche reichen – aber sie müssen kommen, auch an einem schlechten Tag." },
|
||
{ schluessel: "ma-so-beste-zeit", titel: "Zwei Uhrzeiten gegeneinander ausprobieren", tage: 10,
|
||
text: "Dieselbe Art Beitrag, zwei Zeiten, zwei Wochen. Danach weißt du es, statt es zu vermuten." },
|
||
],
|
||
erfahren: [
|
||
{ schluessel: "ma-so-eigener-ton", titel: "Für den Nebenkanal einen eigenen Ton festlegen und aufschreiben", tage: 14,
|
||
text: "Zwei Accounts mit derselben Stimme sind ein Account mit doppelter Arbeit. Aufgeschrieben heißt: auch jemand anderes kann ihn treffen." },
|
||
{ schluessel: "ma-so-nicht-spiegeln", titel: "Einen Monat lang nichts vom Hauptkanal spiegeln", tage: 30,
|
||
text: "Erst wenn der Nebenkanal sich allein trägt, weiß man, ob er ein Kanal ist oder ein Echo. Vorher misst man nur den Hauptkanal zweimal." },
|
||
{ schluessel: "ma-so-monatsrueckblick", titel: "Einmal im Monat durchgehen, welche Formate getragen haben", tage: 14,
|
||
text: "Welche Formate, welche Zeiten, welcher Kanal überflüssig geworden ist. Der Alltag gibt diesen Blick nicht her." },
|
||
{ schluessel: "ma-so-ton-festhalten", titel: "Aufschreiben, wie wir klingen – und wie nicht", tage: 14,
|
||
text: "Drei Sätze, die passen, und drei, die nicht passen. Sobald mehr als einer schreibt, ist das der Unterschied zwischen einer Stimme und einem Durcheinander." },
|
||
],
|
||
},
|
||
|
||
technik: {
|
||
neu: [
|
||
{ schluessel: "ma-te-ton-hoeren", titel: "Den eigenen Ton einmal aufnehmen und anhören", tage: 2,
|
||
text: "Eine Minute mit dem echten Aufbau, danach mit Kopfhörern. Während der Sendung hört man sich selbst nie." },
|
||
{ schluessel: "ma-te-verbindung-messen", titel: "Vor der Sendung die Verbindung messen", tage: 2,
|
||
text: "Dauert zwanzig Sekunden. Eine hakende Sendung sucht man sonst zwei Stunden beim Ton." },
|
||
],
|
||
dabei: [
|
||
{ schluessel: "ma-te-last-messen", titel: "Bei laufender Sendung einmal die Auslastung ansehen", tage: 7,
|
||
text: "Prozessor, Grafik, Netz. Steht die CPU am Anschlag, bekommt der Ton keine Rechenzeit – und genau das klingt wie eine Roboterstimme." },
|
||
{ schluessel: "ma-te-ersatz", titel: "Für jedes wichtige Gerät den Ersatz kennen", tage: 10,
|
||
text: "Welches Mikrofon, welches Kabel, welches Handy springt ein. Mitten in der Sendung ist die falsche Zeit, das herauszufinden." },
|
||
{ schluessel: "ma-te-checkliste", titel: "Eine Startliste mit fünf Punkten aufschreiben", tage: 7,
|
||
text: "Fünf, nicht zwanzig. Eine Liste, die zu lang ist, wird übersprungen – und dann fehlt auch der erste Punkt." },
|
||
],
|
||
erfahren: [
|
||
{ schluessel: "ma-te-ausfall-durchspielen", titel: "Einen Ausfall einmal absichtlich durchspielen", tage: 14,
|
||
text: "Stecker ziehen, während niemand zusieht. Was man einmal geübt hat, macht man im Ernstfall in dreißig Sekunden statt in zehn Minuten." },
|
||
{ schluessel: "ma-te-anleitung-deutsch", titel: "Die Einstellungen in deutschen Menüpunkten aufschreiben", tage: 14,
|
||
text: "Wer eine Anleitung mit englischen Begriffen bekommt, findet sie auf seinem Bildschirm nicht wieder." },
|
||
],
|
||
},
|
||
|
||
planung: {
|
||
neu: [
|
||
{ schluessel: "ma-pl-verfuegbarkeit", titel: "Die eigenen Zeiten für die nächsten zwei Wochen eintragen", tage: 3,
|
||
text: "Auch die Tage, an denen du NICHT kannst — genau die fehlen sonst beim Planen. Wer sie nicht einträgt, wird eingeteilt und sagt hinterher ab; das kostet mehr als ein Nein vorher." },
|
||
],
|
||
dabei: [
|
||
{ schluessel: "ma-pl-sendeplan", titel: "Den Sendeplan für vier Wochen festlegen", tage: 10,
|
||
text: "Zwei feste Tage schlagen fünf zufällige. Wer weiß, wann es losgeht, plant sich den Abend frei." },
|
||
{ schluessel: "ma-pl-themen-vorrat", titel: "Fünf Themen auf Vorrat aufschreiben", tage: 7,
|
||
text: "Für die Abende, an denen nichts einfällt. Die kommen, und dann ist die Liste mehr wert als jede Idee von heute." },
|
||
{ schluessel: "ma-pl-schichten", titel: "Die Schichten für die nächste Woche verteilen", tage: 5,
|
||
text: "Niemand ist dauerhaft zuständig. Rotation ist in der Forschung eine der wenigen Maßnahmen, die Belastung wirklich senken." },
|
||
],
|
||
erfahren: [
|
||
{ schluessel: "ma-pl-engpass", titel: "Den Engpass der nächsten vier Wochen benennen", tage: 14,
|
||
text: "Eine Person, ein Gerät, ein Termin. Wer ihn vorher sagt, hat eine Wahl; wer ihn erlebt, hat keine." },
|
||
{ schluessel: "ma-pl-urlaub", titel: "Abwesenheiten einsammeln und Vertretung festlegen", tage: 14,
|
||
text: "Nicht „wir schauen dann“ – ein Name. Eine Vertretung, die erst am Tag davor gesucht wird, ist keine." },
|
||
],
|
||
},
|
||
|
||
organisation: {
|
||
neu: [
|
||
{ schluessel: "ma-or-ablage-finden", titel: "Drei Dateien in der Ablage suchen und wiederfinden", tage: 2,
|
||
text: "Wer nicht findet, legt neu an – und ab da gibt es zwei Fassungen von allem." },
|
||
{ schluessel: "ma-or-aufgabe-schliessen", titel: "Eine erledigte Aufgabe wirklich abschließen", tage: 2,
|
||
text: "Ein Brett, auf dem Erledigtes stehen bleibt, sagt nach zwei Wochen nichts mehr." },
|
||
],
|
||
dabei: [
|
||
{ schluessel: "ma-or-namen-regel", titel: "Eine Regel für Dateinamen aufschreiben und anwenden", tage: 7,
|
||
text: "Datum vorn, dann worum es geht. Klingt nach Kleinigkeit und ist der Unterschied zwischen Suchen und Finden." },
|
||
{ schluessel: "ma-or-alte-aufraeumen", titel: "Alles durchgehen, was länger als 30 Tage offen liegt", tage: 10,
|
||
text: "Entweder es ist wichtig – dann bekommt es eine Frist. Oder nicht – dann weg. Liegenbleiben ist die dritte Möglichkeit, und die kostet am meisten." },
|
||
],
|
||
erfahren: [
|
||
{ schluessel: "ma-or-wiederfinden", titel: "Eine Ablage bauen, in der man einen Ausschnitt nach drei Monaten wiederfindet", tage: 14,
|
||
text: "Datum, Kanal, Thema im Dateinamen. Was man nicht wiederfindet, schneidet man irgendwann ein zweites Mal – und merkt es nicht einmal." },
|
||
{ schluessel: "ma-or-zugaenge-pruefen", titel: "Alle Zugänge durchgehen: wer braucht noch welchen", tage: 14,
|
||
text: "Wer geht, nimmt seinen Zugang nicht mit. Einmal im Quartal durchsehen – es dauert zehn Minuten und schließt Türen, die niemand mehr im Blick hat." },
|
||
{ schluessel: "ma-or-uebersicht-bauen", titel: "Eine Übersicht bauen, die auch ohne dich verständlich ist", tage: 14,
|
||
text: "Der Test ist einfach: Kann jemand anders damit arbeiten, ohne zu fragen? Wenn nicht, ist es eine Notiz, keine Übersicht." },
|
||
],
|
||
},
|
||
|
||
team: {
|
||
neu: [
|
||
{ schluessel: "ma-tm-wen-fragen", titel: "Aufschreiben, wen du bei was fragst", tage: 2,
|
||
text: "Drei Namen, drei Themen. Wer im Ernstfall überlegen muss, wen er fragt, fragt niemanden." },
|
||
{ schluessel: "ma-tm-vorstellen", titel: "Sich im Team kurz vorstellen", tage: 3,
|
||
text: "Zwei Sätze, wer du bist und was du machst. Ein Team, in dem man Namen liest statt Menschen zu kennen, hilft sich nicht gegenseitig." },
|
||
],
|
||
dabei: [
|
||
{ schluessel: "ma-tm-uebergabe", titel: "Eine saubere Übergabe an die nächste Schicht schreiben", tage: 5,
|
||
text: "Was offen ist, was auffiel, worauf zu achten ist. Ohne sie fängt die nächste Schicht bei null an." },
|
||
{ schluessel: "ma-tm-danken", titel: "Einer Person ausdrücklich für etwas Bestimmtes danken", tage: 5,
|
||
text: "Nicht allgemein – für etwas Bestimmtes. Fehlende Anerkennung ist der am häufigsten genannte emotionale Preis dieser Arbeit und der billigste zu beheben." },
|
||
{ schluessel: "ma-tm-nein-sagen", titel: "Einmal bewusst nein sagen, wenn es zu viel ist", tage: 7,
|
||
text: "Zu wenig Zeit ist der meistgenannte Grund, warum Moderatoren aufhören. Ein Nein zur richtigen Zeit verhindert ein Aufhören zur falschen." },
|
||
],
|
||
erfahren: [
|
||
{ schluessel: "ma-tm-kanal-koepfe", titel: "Jedem Kanal einen festen Kopf geben", tage: 14,
|
||
text: "Wer für alles zuständig ist, ist für nichts zuständig. Ein Name je Kanal heißt: Es gibt jemanden, der es merkt, wenn dort zwei Wochen nichts passiert." },
|
||
{ schluessel: "ma-tm-woche-ohne-dich", titel: "Eine ganze Woche planen, in der du nicht da bist", tage: 21,
|
||
text: "Nicht ansagen, sondern vorbereiten. Was in dieser Woche zusammenbricht, bricht auch zusammen, wenn du krank wirst – nur dann ungeplant." },
|
||
{ schluessel: "ma-tm-buddy", titel: "Einen Neuen durch seine erste Schicht begleiten", tage: 14,
|
||
text: "Ein fester Ansprechpartner in den ersten Wochen ist die am besten belegte Einzelmaßnahme gegen frühes Aufhören." },
|
||
{ schluessel: "ma-tm-runde", titel: "Eine kurze Runde nach einer harten Sendung", tage: 10,
|
||
text: "Wer Hässliches wegmoderiert, nimmt es mit. Ein fester kurzer Austausch wirkt nachweislich besser als ein Angebot, das man von sich aus annehmen muss." },
|
||
{ schluessel: "ma-tm-vertretung-einarbeiten", titel: "Jemanden so einarbeiten, dass er dich vertreten kann", tage: 21,
|
||
text: "Solange nur du es kannst, kannst du nicht krank werden. Das ist keine Vorsicht, das ist Rechnen." },
|
||
],
|
||
},
|
||
|
||
kommunikation: {
|
||
neu: [
|
||
{ schluessel: "ma-ko-antwortzeit", titel: "Offene Nachrichten innerhalb eines Tages beantworten", tage: 3,
|
||
text: "Auch mit „ich schaue es mir an“. Eine Antwort ohne Ergebnis ist besser als Schweigen mit Ergebnis." },
|
||
],
|
||
dabei: [
|
||
{ schluessel: "ma-ko-vorlagen", titel: "Drei Textbausteine für wiederkehrende Fragen schreiben", tage: 7,
|
||
text: "Dieselbe Frage kommt zwanzigmal. Ein Baustein spart nicht nur Zeit – er sorgt auch dafür, dass alle dieselbe Antwort bekommen." },
|
||
{ schluessel: "ma-ko-anfrage-weiterleiten", titel: "Eine Anfrage sauber weitergeben statt liegen zu lassen", tage: 5,
|
||
text: "Mit einem Satz, worum es geht, und einem Namen. Eine weitergeleitete Anfrage ohne Zusammenhang ist eine neue Aufgabe für den Nächsten." },
|
||
],
|
||
erfahren: [
|
||
{ schluessel: "ma-ko-anfrage-antwort", titel: "Für Kooperationsanfragen eine feste Antwort mit Zahlen vorbereiten", tage: 14,
|
||
text: "Wer drei Tage für eine Antwort braucht, wirkt teurer als er ist. Wer Zahlen mitschickt, verhandelt nicht mehr über die Frage, ob es sich lohnt." },
|
||
{ schluessel: "ma-ko-kooperation", titel: "Eine Anfrage von außen vollständig durchziehen", tage: 21,
|
||
text: "Von der ersten Nachricht bis zur Absage oder Zusage. Wer nur den Anfang macht, hinterlässt eine halbe Sache im Postfach eines anderen." },
|
||
{ schluessel: "ma-ko-ton-schwierig", titel: "Eine unangenehme Nachricht schreiben und gegenlesen lassen", tage: 10,
|
||
text: "Absagen, Beschwerden, Korrekturen. Vier Augen kosten fünf Minuten und ersparen eine Woche Aufräumen." },
|
||
],
|
||
},
|
||
|
||
analyse: {
|
||
neu: [
|
||
{ schluessel: "ma-an-zahlen-finden", titel: "Die Zahlen einer Sendung einmal selbst heraussuchen", tage: 3,
|
||
text: "Zuschauer, Verweildauer, Wiederkehr — einmal selbst heraussuchen, nicht vorgelesen bekommen. Wer nicht weiß, wo sie stehen, glaubt jede Zahl, die ihm jemand sagt." },
|
||
],
|
||
dabei: [
|
||
{ schluessel: "ma-an-verweildauer", titel: "Die Verweildauer der letzten fünf Sendungen vergleichen", tage: 7,
|
||
text: "Über 15 Minuten heißt: die Stimmung trägt. Darunter liegt es fast nie am Thema, sondern am Anfang." },
|
||
{ schluessel: "ma-an-eine-zahl", titel: "Für den Monat EINE Zahl festlegen, auf die ihr schaut", tage: 7,
|
||
text: "Zehn Zahlen beobachten heißt keine beobachten. Eine, die ihr beeinflussen könnt – und sie muss nicht die größte sein." },
|
||
],
|
||
erfahren: [
|
||
{ schluessel: "ma-an-kanaele-nebeneinander", titel: "Die Kanäle in einer Tabelle nebeneinanderstellen", tage: 14,
|
||
text: "Einzeln angesehen wächst jeder irgendwie. Nebeneinander sieht man, welcher die investierte Zeit wirklich zurückzahlt – und welcher nur beschäftigt." },
|
||
{ schluessel: "ma-an-fruehe-zahl", titel: "Eine Zahl finden, die VOR dem Wachstum ausschlägt", tage: 21,
|
||
text: "Aufrufe sagen, was war. Nützlich ist die Zahl, die sich zwei Wochen vorher bewegt – meist Wiederkehr oder Verweildauer, aber das muss man selbst nachsehen." },
|
||
{ schluessel: "ma-an-verlauf-lesen", titel: "Einen Verlauf über drei Monate lesen und deuten", tage: 14,
|
||
text: "Ein einzelner schlechter Wert ist ein schlechter Tag. Dasselbe über drei Monate ist ein Muster – und nur das Muster ist eine Auskunft." },
|
||
{ schluessel: "ma-an-gegenprobe", titel: "Eine Annahme nachmessen, von der alle ausgehen", tage: 14,
|
||
text: "„Freitags ist am meisten los.“ Nachsehen. Ungefähr jede zweite solche Annahme hält der Messung nicht stand." },
|
||
],
|
||
},
|
||
|
||
wachstum: {
|
||
neu: [
|
||
{ schluessel: "ma-wa-woher", titel: "Zehn Neue fragen, wie sie hergefunden haben", tage: 5,
|
||
text: "Die Antwort ist selten die, die man erwartet – und sie kostet eine Frage." },
|
||
],
|
||
dabei: [
|
||
{ schluessel: "ma-wa-zeit-testen", titel: "Eine neue Sendezeit vier Wochen lang ausprobieren", tage: 21,
|
||
text: "Eine Zeit, zu der ihr niemanden habt, schlägt eine, zu der alle senden. Vier Wochen, sonst misst man den Zufall." },
|
||
{ schluessel: "ma-wa-wiederkehr", titel: "Zählen, wie viele von letzter Woche wieder da sind", tage: 10,
|
||
text: "Wachstum ohne Wiederkehr ist ein Eimer mit Loch. Die Zahl ist unangenehm und die wichtigste, die es gibt." },
|
||
],
|
||
erfahren: [
|
||
{ schluessel: "ma-wa-hinueberfuehren", titel: "Von einem Kanal auf den anderen führen – und nachmessen, ob jemand ankommt", tage: 21,
|
||
text: "Ein Hinweis kostet nichts und wirkt meist auch nichts. Erst die Messung sagt, ob der Weg trägt oder ob man ihn sich sparen kann." },
|
||
{ schluessel: "ma-wa-kanal-pruefen", titel: "Einen zusätzlichen Kanal testen und danach ehrlich entscheiden", tage: 21,
|
||
text: "Vier Wochen, dann Schluss oder weiter. Ein Kanal, den niemand pflegt, schadet mehr als er nützt." },
|
||
{ schluessel: "ma-wa-empfehlung", titel: "Einen Weg bauen, auf dem Stammleute jemanden mitbringen", tage: 14,
|
||
text: "Wer aus der Runde kommt, ist schon einmal durch ein Augenpaar gegangen – das ist die beste Quelle, die es gibt." },
|
||
],
|
||
},
|
||
|
||
branding: {
|
||
neu: [
|
||
{ schluessel: "ma-br-farben-kennen", titel: "Die Farben und Schriften einmal nachschlagen", tage: 2,
|
||
text: "Damit du sie benutzt, statt sie zu schätzen. Zwei ähnliche Blautöne nebeneinander sehen aus wie ein Versehen." },
|
||
],
|
||
dabei: [
|
||
{ schluessel: "ma-br-vorlage-nutzen", titel: "Drei Beiträge mit derselben Vorlage bauen", tage: 7,
|
||
text: "Wiedererkennung entsteht durch Wiederholung, nicht durch Einfälle." },
|
||
{ schluessel: "ma-br-sprache", titel: "Aufschreiben, wie wir jemanden ansprechen", tage: 7,
|
||
text: "Du oder Sie, Spitznamen oder nicht, Emojis oder nicht. Sobald mehr als einer schreibt, merkt man den Unterschied sofort." },
|
||
],
|
||
erfahren: [
|
||
{ schluessel: "ma-br-durchgang", titel: "Alle Kanäle nebeneinanderlegen und Abweichungen notieren", tage: 14,
|
||
text: "Bild, Beschreibung, Farben, Ton. Nach einem halben Jahr läuft immer etwas auseinander – man sieht es nur, wenn man es nebeneinanderlegt." },
|
||
{ schluessel: "ma-br-zeichen", titel: "Ein wiedererkennbares Zeichen für eine Reihe festlegen", tage: 14,
|
||
text: "Ein Bild, das immer gleich aussieht, spart jede Erklärung. Wer es sieht, weiß, was kommt." },
|
||
],
|
||
},
|
||
|
||
sonstiges: {
|
||
neu: [
|
||
{ schluessel: "ma-sn-notieren", titel: "Aufschreiben, was dir in der ersten Woche gefehlt hat", tage: 7,
|
||
text: "Nur ein Neuer kann das sagen – nach drei Monaten fällt es niemandem mehr auf. Genau deshalb ist es die wertvollste Liste im Haus." },
|
||
],
|
||
dabei: [
|
||
{ schluessel: "ma-sn-idee-einbringen", titel: "Eine eigene Idee aufs Brett schreiben", tage: 7,
|
||
text: "Nicht im Gespräch sagen – aufschreiben. Was nur gesagt wurde, ist nach zwei Tagen weg." },
|
||
],
|
||
erfahren: [
|
||
{ schluessel: "ma-sn-ueberfluessiges", titel: "Etwas benennen, das ihr nicht mehr braucht", tage: 14,
|
||
text: "Ein Ablauf, eine Liste, ein Kanal. Weglassen ist die einzige Verbesserung, die nichts kostet – und die einzige, die niemand von selbst vorschlägt." },
|
||
],
|
||
},
|
||
};
|
||
|
||
/* Flach, mit Kategorie und Stufe an jedem Eintrag -- fuer die Pruefung
|
||
und fuer jeden, der zaehlen will, ohne zweimal zu verschachteln. */
|
||
export const MODI_AUFGABEN_FLACH = Object.entries(MODI_AUFGABEN)
|
||
.flatMap(([kategorie, stufen]) => Object.entries(stufen)
|
||
.flatMap(([stufe, liste]) => liste.map((a) => ({ ...a, kategorie, stufe }))));
|