Deutsch oeffnet mit „ und schliesst mit “. An 199 Stellen, die ein
Mensch liest, stand als Schlusszeichen ein GERADES " -- „Nächstes"
statt „Nächstes“. Auf sechzehn oeffentlichen Seiten, in vierzig
Dateien des Workspace und in zwoelf Servermodulen, die Texte
verschicken.
Auf dem Bildschirm sieht man den Unterschied sofort. Beim Schreiben
nicht: Das gerade " liegt auf der Tastatur, die anderen nicht.
WARUM EIN ERSTER ANLAUF ZURUECKGENOMMEN WURDE
Ein gerades " ist an vielen Stellen SYNTAX und kein Schriftzeichen --
Grenze einer Zeichenkette, Grenze eines HTML-Attributs, Zeichen in
einem regulaeren Ausdruck. Wer stumpf ersetzt, macht aus
„<a href="https://… ein kaputtes Attribut
/^["'„»\s]+|["'“«.\s]+$/ einen kaputten Ausdruck
"… nichts „mal " + "eben …" eine kaputte Zeichenkette
DIE UNTERSCHEIDUNG LAEUFT AN MERKMALEN, NICHT AN EINER LISTE
< > = dazwischen -> HTML-Marke oder Attribut
endet auf Leerzeichen -> die Zeichenkette hoert hier auf, der
Satz geht in der naechsten Zeile weiter.
Ein deutsches Schlusszeichen steht NIE
hinter einem Leerzeichen.
Rueckstrich mittendrin -> regulaerer Ausdruck
${ ohne } -> mitten in einem Ausdruck
Eine Liste erlaubter Ausnahmen waere die naechste, die niemand
pflegt. Zwoelf Stellen bleiben dadurch stehen, alle zwoelf einzeln
angesehen und alle zwoelf zu Recht -- dort steht das richtige
Schlusszeichen ohnehin weiter unten im Satz.
Fuenf davon waren allerdings ECHTE Fehler HINTER dem Link
(`…>HasiDog</a>".`) -- die erste Regel hatte nur das Attribut
gesehen, nicht den Satz danach. Gezielt nachgezogen.
Ein maskiertes `\"` in workspace-vorlagen.js (28 Hooks) wird zu “ --
ohne Rueckstrich, denn “ begrenzt nichts.
KOMMENTARE BLEIBEN, WIE SIE SIND. Dort liest es niemand ausser mir;
eine Wache, die auch Kosmetik anmahnt, wird weggeklickt. Beim ersten
Messen fielen ausserdem acht Stellen aus buehne.html faelschlich an,
weil `/* */` in HTML (in <style> und <script>) nicht ausgeblendet
war -- jetzt schon.
DIE WACHE DAZU
pruef-struktur prueft es ab sofort mit derselben Regel: 322 Dateien
mit sichtbarem Text, 0 Funde, und die zwoelf bewussten Ausnahmen
werden GEZAEHLT und genannt (erlaubt: 12). Eine Ausnahme, die niemand
sieht, waechst -- und irgendwann steht der echte Fall darin.
GEPRUEFT
pruef-struktur 59 -> 68 Pruefungen, 0 Fehler
node --check auf allen geaenderten JS-Dateien
nachgemessen: 199 geaendert, 12 mit Grund stehen geblieben
gruen geblieben: bewerbung-aufgaben 163, nachwuchs 262,
reaktion 421, support 63, content 45, terminregel 35, treff 85
Und nachgesehen, ob eine Pruefung noch die alte Schreibweise
ERWARTET: 13 Fundstellen, alle dreizehn nur Text in ihrer eigenen
Ausgabe, keine einzige ein Vergleich mit dem Seitentext.
GEGENPROBE: In reaktion.html ein Schlusszeichen zurueckgedreht ->
„workspace/reaktion.html:546 „Nächstes"", mit Datei und Zeile. Und
die Erkennung einzeln gegen HTML-Attribut, fortgesetzte
Zeichenkette, regulaeren Ausdruck und eingesetzten Wert geprueft.
Stempel gesetzt: workspace 670 Verweise in 45 Dateien, oeffentlich
554 in 48 Seiten.
Co-Authored-By: Claude Opus 5 <[email protected]>
2819 lines
204 KiB
JavaScript
2819 lines
204 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.
|
||
*/
|
||
function katalogAufgabeAnlegen(v, zielId, vonId, zustand = "offen") {
|
||
const d = new Date(Date.now() + (v.tage || 7) * 86400_000);
|
||
const frist = `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, "0")}`
|
||
+ `-${String(d.getDate()).padStart(2, "0")}`;
|
||
db().prepare(`INSERT INTO aufgaben
|
||
(titel, beschreibung, status, prioritaet, verantwortlich_id, frist,
|
||
kategorie, vorlage, erstellt, erstellt_von)
|
||
VALUES (?,?,'offen',?,?,?,?,?,?,?)`)
|
||
.run(v.titel, v.text, v.tage <= 1 ? "hoch" : "mittel",
|
||
zielId, frist, v.kategorie, v.schluessel, jetzt(), vonId);
|
||
const id = db().prepare("SELECT last_insert_rowid() AS id").get().id;
|
||
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;
|
||
|
||
/* =====================================================================
|
||
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);
|
||
/* 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) {
|
||
/* 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);
|
||
const frist = `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, "0")}`
|
||
+ `-${String(d.getDate()).padStart(2, "0")}`;
|
||
/* 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, erstellt, erstellt_von)
|
||
VALUES (?,?,'offen',?,?,?,?,?,?)`)
|
||
.run(v.titel, v.text, stufe === "anfaenger" ? "hoch" : "mittel",
|
||
creatorId, frist, v.schluessel, jetzt(), 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);
|
||
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 }))));
|