diff --git a/server/pruef-checkliste.mjs b/server/pruef-checkliste.mjs index a9f76b84..ad0558ac 100644 --- a/server/pruef-checkliste.mjs +++ b/server/pruef-checkliste.mjs @@ -101,6 +101,44 @@ for (const bereich of ["live", "community", "technik", "content"]) { allein sagt nicht, wofuer die Punkte da sind. */ ok(r.gruppen.every((g) => g.text && g.text.length > 20), ` jede Gruppe erklaert sich (${r.gruppen.filter((g) => !g.text).length} ohne Text)`); + /* JEDER PUNKT BRAUCHT EINE STUFE (Befund Filipe, 09.09.2026). + + Die Stufenleiste über der Liste erscheint nur, wenn mindestens ein + Punkt eine Stufe trägt -- und bei den Content-Ideen trug keiner + eine. Drei Bereiche hatten die Leiste, einer nicht, und aufgefallen + ist es nur, weil jemand alle vier nebeneinander gesehen hat. + + Das ist die typische Lücke: Nicht falsch, sondern FEHLEND, und + deshalb sieht die Seite überall richtig aus. Eine Prüfung, die + "jeder Punkt hat eine Stufe" verlangt, hätte es beim Anlegen des + ersten Punktes ohne Stufe gesagt. */ + { + const alle = r.gruppen.flatMap((g) => g.punkte); + const ohneStufe = alle.filter((p) => !p.stufe); + ok(ohneStufe.length === 0, + ` jeder Punkt hat eine Könnensstufe (${alle.length - ohneStufe.length} von ${alle.length})` + + (ohneStufe.length ? ` — ohne: ${ohneStufe.slice(0, 3).map((p) => p.schluessel).join(", ")}` : "")); + /* Und alle vier Stufen müssen vorkommen. Ein Bereich, in dem es nur + Anfängerpunkte gibt, hat eine Leiter mit einer Sprosse. */ + const stufen = new Set(alle.map((p) => p.stufe)); + const fehlend = ["anfaenger", "fort", "profi", "meister"].filter((x) => !stufen.has(x)); + ok(fehlend.length === 0, + ` alle vier Stufen kommen vor${fehlend.length ? ` — fehlt: ${fehlend.join(", ")}` : ""}`); + + /* GEGENPROBE: Dieselbe Rechnung an einer Liste, in der absichtlich + eine Stufe fehlt. Sie MUSS anschlagen -- sonst hätte die Prüfung + oben auch bei den Content-Ideen "ok" gesagt, und genau das war + ja der Zustand, den Filipe gefunden hat. */ + const kaputt = alle.map((p, i) => (i === 0 ? { ...p, stufe: undefined } : p)); + ok(kaputt.filter((p) => !p.stufe).length === 1, + ` Gegenprobe: ein Punkt ohne Stufe wird erkannt`); + const nurEine = alle.map((p) => ({ ...p, stufe: "anfaenger" })); + const fehlend2 = ["anfaenger", "fort", "profi", "meister"] + .filter((x) => !new Set(nurEine.map((p) => p.stufe)).has(x)); + ok(fehlend2.length === 3, + ` Gegenprobe: eine Liste mit nur einer Stufe fällt auf (${fehlend2.length} fehlen)`); + } + /* Jeder Punkt braucht einen stabilen Schluessel. */ const ohne = r.gruppen.flatMap((g) => g.punkte).filter((p) => !p.schluessel); ok(ohne.length === 0, ` jeder Punkt hat einen Schluessel (${ohne.length} ohne)`); @@ -280,6 +318,14 @@ for (const [rolle, code, name, darf] of [ bilanz: document.querySelectorAll(".bilanz-zahl").length, stufenKnoepfe: document.querySelectorAll(".stufe-knopf").length, marken: document.querySelectorAll(".fest-punkt__marke-stufe").length, + /* DIE STUFENLEISTE MUSS AUF DER SEITE ANKOMMEN (09.09.2026). + + Die Datenpruefung weiter oben stellt sicher, dass jeder Punkt + eine Stufe HAT. Das ist nicht dasselbe wie: die Leiste ist zu + sehen. Genau diese Luecke hat Filipe gefunden -- drei Bereiche + hatten die Leiste, Content nicht, und die Daten sahen von aussen + unauffaellig aus. Fuenf Knoepfe: "Alle" und die vier Stufen. */ + stufenleiter: document.querySelectorAll(".stufenleiter__knopf").length, /* IST DER STIL AUCH ANGEKOMMEN? Beim ersten Anlauf lag das CSS in content.css -- und bereich.html laedt die gar nicht. Die Punkte standen nackt und ohne Flaeche da, und die Pruefung war trotzdem @@ -294,13 +340,15 @@ for (const [rolle, code, name, darf] of [ })(), ueber: document.documentElement.scrollWidth - document.documentElement.clientWidth, })); - const gut = r.da && r.gruppen === 3 && r.punkte >= 6 && r.bilanz === 3 && r.gestaltet === true + const gut = r.stufenleiter === 5 + && r.da && r.gruppen === 3 && r.punkte >= 6 && r.bilanz === 3 && r.gestaltet === true && r.marken === r.punkte && r.ueber <= 0 && (darf ? r.stufenKnoepfe === r.punkte * 2 : r.stufenKnoepfe === 0); if (!gut) fehler++; console.log(` ${gut ? "ok " : "FEHL"} ${name} · ${bereich}: ` + `${r.gruppen} Gruppen, ${r.punkte} Punkte, ${r.bilanz} Bilanzzahlen, ` - + `${r.stufenKnoepfe} Bewertungsknoepfe, ${r.marken} Marken, ${r.ueber}px über` + + `${r.stufenKnoepfe} Bewertungsknoepfe, ${r.marken} Marken, ` + + `Stufenleiste ${r.stufenleiter}/5, ${r.ueber}px über` + (r.gestaltet ? "" : " STIL FEHLT")); } ok(konsole.length === 0, diff --git a/server/workspace-vorlagen.js b/server/workspace-vorlagen.js index 9ea04756..2dd7ce3e 100644 --- a/server/workspace-vorlagen.js +++ b/server/workspace-vorlagen.js @@ -61,67 +61,166 @@ 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", + 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", + 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", + 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", + 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", + 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", + 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", + 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", + 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", + 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", + 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", + 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", + 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", + 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." }, + ]; /* ===================================================================== @@ -151,7 +250,10 @@ export const LIVE_PUNKTE = { { 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" }, + { 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" }, + ], 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" }, @@ -162,7 +264,9 @@ export const LIVE_PUNKTE = { { 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: "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" }, + ], auswertung: [ { schluessel: "was-hat-diesmal-getragen", titel: "Was hat diesmal getragen?", text: "Ein Ding. Nicht drei. Das eine, das man wiederholen will.", stufe: "anfaenger" }, @@ -173,7 +277,10 @@ export const LIVE_PUNKTE = { { 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: "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" }, + ], }; @@ -204,7 +311,10 @@ export const COMMUNITY_PUNKTE = { { 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" }, + { 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" }, + ], 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" }, @@ -212,7 +322,9 @@ export const COMMUNITY_PUNKTE = { { 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: "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" }, + ], 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" }, @@ -221,7 +333,8 @@ export const COMMUNITY_PUNKTE = { { 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: "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" }, + ], }; @@ -243,7 +356,12 @@ export const TECHNIK_PUNKTE = { { 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" }, + { 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" }, + ], 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" }, @@ -251,14 +369,17 @@ export const TECHNIK_PUNKTE = { { 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: "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" }, + ], 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: "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" }, + ], }; export const CALL_LEITFAEDEN = [