LmsPhishingQuiz
AngriffssimulationenPhishing-Quiz — entscheiden, und am Text sehen, woran man es erkannt hätte.
::lms-phishing-quiz Im Zusammenhang ansehen Übernommen aus dem PhishingQuiz der BAK-Spiele (React/MobX, rund 3300 Zeilen).
LmsMailTriage — der ist schlanker und braucht keine Markierungen.
Drei Stufen, wie in der Vorlage. Das Original führt nicht gleich ins Spiel,
sondern erst durch ein Tutorial: zwei Nachrichten, die selbst sagen, was sie
sind. Danach kommen Level 1 und Level 2. Diese Reihenfolge ist der Lehrgang und
keine Verpackung — wer noch die Bedienung sucht, achtet nicht auf die
Absenderadresse. Hier ist jede Stufe ein eigener Baustein mit eigener id und
eigenem Stand; im Tutorial sind die Tipps umsonst, in den beiden Leveln kosten
sie Punkte.
Die Daten rechnen mit. Resturlaubsjahr, Stichtag und Verfallsfrist stehen
nicht als feste Zahl im Beispiel, sondern als 2025 oder
21.02.2027 — Versatz, Einheit, Schema. Eine Mitteilung über den
„Resturlaub 2020“ verrät sich sonst an der falschen Stelle: nicht am Absender,
sondern daran, dass sie aus der Konserve kommt. Der Platzhalter gilt in jedem
Textfeld der Bibliothek, siehe README.Beispiele (4)
Tutorial — die Bedienung lernen
Zwei Nachrichten, die verraten, was sie sind. Hier geht es nicht ums Erkennen, sondern darum, was ein Tipp, eine Entscheidung und eine markierte Stelle sind — deshalb sind die Tipps hier umsonst.
Tutorial. Lesen Sie die Nachricht, holen Sie sich den Tipp — hier kostenlos — und entscheiden Sie: Echt oder Phishing. Danach leuchten die verräterischen Stellen im Text auf, jede mit einer Ziffer, und darunter steht, was sie bedeutet.
Beurteilt: 0 von 2 · Punkte: 0 von 20Tutorial
Von: PHISHING BETRÜGER <phishing.tutorial@evilcorp.xyz>
An: Maria Schuster <m.schuster@kmu.de>
Ihre Einschätzung
Level 1 — die offensichtlichen
Sechs Nachrichten, drei Angriffe. Zwei tragen denselben Betreff, und nur eine davon ist echt. Der Tipp kostet Punkte.
Level 1. Sechs Nachrichten aus einem Arbeitstag, drei davon Angriffe. Zwei tragen denselben Betreff — eine davon ist echt. Der Tipp kostet Punkte, die Entscheidung gilt.
Beurteilt: 0 von 6 · Punkte: 0 von 60Passwort-Policy: Ablauf Ihres Passworts in 20 Tagen
Von: Mailversand Adminconsole <mailversand.adminconsole@sdkljf.evilcorp.xyz>
An: Maria Schuster <m.schuster@kmu.de>
kmu.de/it-service
Ihre Einschätzung
Level 2 — die gut gemachten
Sechs Nachrichten, vier Angriffe. Zwei Paare tragen denselben Betreff und fast denselben Text; der Unterschied steht in der Adresse, im Linkziel oder in der Dateiendung.
Level 2. Diesmal verrät sich keine Nachricht auf den ersten Blick. Zwei Paare tragen denselben Betreff und fast denselben Text — der Unterschied steht in der Adresse, im Linkziel oder in der Dateiendung.
Beurteilt: 0 von 6 · Punkte: 0 von 60WG: Resturlaub 2025
Von: Personalabteilung <Personalabteilung@κmυ.de>
An: Maria Schuster <m.schuster@kmu.de>
Ihre Einschätzung
Ohne Fenster, ohne Punkte
`client: false` nimmt den Postfach-Rahmen weg — in einer schmalen Spalte ist die aufklappbare Liste das Ruhigere. Dazu ohne Punktestand, Tipps umsonst, Auflösung erst am Ende.
Zwei Nachrichten. Entscheiden Sie — die Auflösung kommt, wenn beide beurteilt sind.
Beurteilt: 0 von 2Ihre Sendung konnte nicht zugestellt werden
Von: Paketdienst <info@paket-status.shop>
Zustellung bestätigen
Ihre Einschätzung
API
Vollständig aus den Quellen erzeugt. Dieselben Angaben stehen an jedem Beispiel hinter dem Knopf API — hier ausgeschrieben, damit sie über die Seitensuche und im Druck auffindbar bleiben.
Props
| Prop | Typ | Standard | Bedeutung |
|---|---|---|---|
idPflicht | string | — | Eindeutig im Dokument. Schlüssel für den gespeicherten Stand. |
task | string | — | Die Aufgabenstellung. Inline-Markdown erlaubt. |
items | LmsPhishingMail[] | () => [] | Wiederholte Kinder. Ein Eintrag besteht aus:
|
score | boolean | true | Punktestand zeigen und zählen. |
points | LmsPhishingPunkte | — | Was die vier Fälle und ein Tipp wert sind. Fehlende Werte bleiben auf der Vorgabe. Ein Eintrag besteht aus:
|
hints | 'cost' | 'free' | 'off' | 'cost' | `cost` kostet Punkte (Vorgabe), `free` ist umsonst, `off` nimmt die Tipps weg. |
reveal | 'answered' | 'wrong' | 'end' | 'answered' | Wann die markierten Stellen aufleuchten. |
addressee | string | — | Name der angesprochenen Person — ersetzt `{name}` in allen Textfeldern. |
client | boolean | true | Als Postfach-Fenster zeichnen: Titelleiste, Nachrichtenliste links, * Lesebereich rechts. * * Abschaltbar, weil es nicht überall passt. In einer schmalen Spalte — ein * Nugget ist rund 700 Pixel breit — wird aus zwei Bereichen schnell ein * Gedränge; dann ist die aufklappbare Liste das Ruhigere. Und wer den * Baustein in einen Abschnitt stellt, der ohnehin schon einen Rahmen hat, * will keinen zweiten. |
reset | 'ask' | 'off' | 'free' | 'ask' | `ask` fragt nach (Vorgabe), `off` nimmt den Knopf weg, `free` fragt nicht. |
Slots
Dieser Baustein hat keine Slots — sein Inhalt kommt vollständig aus den Props.
Emits
Dieser Baustein sendet keine Events.
Theme
Dieser Baustein hat keine Fläche in der app.config.ts.
Sein Aussehen steuerst du über Props — bei den didaktischen Bausteinen über das gemeinsame Farbrollen-Vokabular (color, variant), bei den dekorativen über deren eigene Props. Eine Theming-Ebene wie ui.<komponente> in Nuxt UI gibt es hier noch nicht.
Changelog
- Hinzugefügt
1.31.0Briefkopf in der Nachricht (
logo, AlternativtextlogoAlt). Ein eigenes Feld und kein Bild im Rumpf, denn der Nachrichtentext läuft escaped durchLmsMarkdown. Didaktisch ist das Logo die Verkleidung selbst — es ist eine Datei, in zehn Sekunden kopiert, und beweist nichts. Die Bankmail in Level 1 trägt eine erfundene Marke („Kreisbank Auental“), wo die Vorlage das echte Logo einer bestehenden Sparkasse setzt — eine Bibliothek liefert ihre Beispiele mit aus. Für den echten Kurs gehört hierhin die Marke, die der Angriff nachahmt; die Abweichung steht im Erklärtext der Seite - Hinzugefügt
1.31.0Das Beispiel folgt jetzt dem Aufbau der Vorlage: Tutorial, dann das Spiel mit Level 1 und Level 2, als drei Bausteine mit eigener
id. Im Tutorial zwei Nachrichten, die selbst sagen, was sie sind, mit kostenlosen Tipps (hints: free) und Markierungen, die erklären, was eine Markierung ist; in den beiden Leveln je sechs Nachrichten aus dem Bestand des BAK-PhishingQuiz, Tipps gegen Punktabzug. Beide Level arbeiten mit Zwillingen — dieselbe Nachricht einmal echt, einmal gefälscht (Passwort-Policy in Level 1, Resturlaub und Zeiterfassung in Level 2): Wer am Thema entscheidet, liegt bei einem der beiden zwangsläufig falsch. Level 1 nimmt die offensichtlichen Angriffe (Bank mit angehängter.de.eu-Domäne, Vorschussbetrug an den eigenen Verteiler), Level 2 die gut gemachten — griechische Buchstaben inκmυ.de, ein angehängtesintranet.kmu.de.eurzokde.com, ein@mitten in einer GitHub-Adresse undInvoice_1375.pdf.exe. Einmal steht der Tippfehler in der echten Nachricht, weil der Angreifer ihn beim Abschreiben ausgebessert hat. Jahreszahlen, Stichtag und Verfallsfrist stehen als…, damit das Beispiel nicht veraltet. Das bisherige Beispiel „Vier Nachrichten, markierte Stellen“ geht darin auf - Hinzugefügt
1.29.0Meldet seinen Stand an den Fortschrittsadapter, nach jeder Entscheidung, nach einem Tipp und beim Zurücksetzen:
answered/total,correct(alle richtig),score(Anteil richtiger Urteile) und neupoints/maxPoints— der Punktestand samt Tippkosten und was höchstens zu holen war. Vorher wurden nur die Urteile gespeichert, ohne Einordnung - Hinzugefügt
1.26.0Entscheiden, und am Text sehen, woran man es erkannt hätte: Nach dem Urteil trägt jede verräterische Stelle eine Ziffer, darunter steht, was sie bedeutet. Neun Merkmale (Absender, Anrede, Druck, Linkziel, Anhang, Empfänger, Rechtschreibung, Datenabfrage, Zahlung), jedes mit zwei Erläuterungen — eine für die Fälschung, eine für die echte Nachricht, denn auch echte Post hat einen Kurzlink. Gezeichnet als Postfach-Fenster mit Nachrichtenliste und Lesebereich, mit
client: falseals aufklappbare Liste für schmale Spalten. Punkte (score,points), Tipps wahlweise mit Abzug, umsonst oder gar nicht (hints), Auflösung nach der Antwort, nur bei Fehlern oder erst am Ende (reveal: answered | wrong | end),addresseesetzt{name}ein. Das Ziel eines Verweises erscheint beim Überfahren als Hinweis — und beim Fokussieren, also auch ohne Maus; ohne das ließe sich „Prüfen Sie das Linkziel“ nicht prüfen, was der Tipp aber verlangt. Nach der Entscheidung steht es zusätzlich ausgeschrieben in der Zeile, rot wenn es täuscht. Nach der Entscheidung steht über der Auflösung, ob sie stimmte — und wenn nicht, was die Nachricht war (phishing.verdictRight,verdictWasPhishing,verdictWasLegit); an dieselbe Bedingung gehängt wie die Markierungen, damitreveal: endnichts vorwegnimmt. Die Kopfzeile benennt ihre Zahlen, statt zwei Brüche nebeneinanderzustellen: „Beurteilt: 1 von 4 · Punkte: -12 von 40“. Am Schluss zählt die Bilanz nicht die richtigen Antworten, sondern die übersehenen Merkmale. Beschriftungen unterphishing.*. Übernommen aus dem PhishingQuiz der BAK-Spiele - Behoben
1.29.0Schreiben in den Fortschrittsspeicher geschieht je Schlüssel nacheinander, und zuletzt immer der neueste Stand. Vorher liefen Schreibvorgänge gleichzeitig, und der zuletzt fertige gewann: Ein Quiz blieb mit dem Stand von vor „Antwort prüfen“ stehen, eine Reflexion (Freitext, je Tastendruck geschrieben) konnte mit abgeschnittenem Text enden
- Hinzugefügt
1.29.0useLmsProgressnimmt als viertes ArgumentbeimLaden: gerufen, wenn ein gespeicherter Stand angekommen ist - Hinzugefügt
1.29.0LmsProgressMetakenntpointsundmaxPointsfür Bausteine, die Punkte zählen.scorebleibt der Anteil richtiger Antworten; Punkte gewichten anders und dürfen negativ sein - Hinzugefügt
1.28.0Überarbeitungen: Werkzeug
untertitel_erzeugen(nur auf Hinweis der Redaktion). Die Brücke holt Videos ohnesubtitles-srcüberki-auftrag-videoder Plattform, schreibt mit WhisperNotesmedien/<kennung>.srtund trägt es ein; wahlweise nur für bestimmte Nuggetdateien - Hinzugefügt
1.28.0Aufträge: Beim
pruefenundabgebenschreibt die Brücke für jedeslms-videoohnesubtitles-src, dessen Video im Paket liegt, mit ffmpeg und WhisperNotes ein.srtdaneben und trägt es alssubtitles-srcein (playground/server/utils/untertitel.ts). Ein zweiter Lauf tut nichts; ohne WhisperNotes bleibt das Paket, wie es ist, und der Agent erfährt es - Hinzugefügt
1.27.0Aufträge: Überarbeitung eines vorhandenen Lernpfads. Die Plattform gibt den Lernpfad als Paket mit (
ausgang), die Brücke legt ihn nachpaket/und unverändert nachbestand/. Zwei Werkzeuge mehr:plan_vorlegenundrueckfragewarten auf die Antwort der Redaktion, die die Brücke bei der Plattform abholt (ki-auftrag-frage,ki-auftrag-antwort) — Antworten geht so auch aus einem anderen Fenster. Endet ein Lauf ohne Abgabe, meldet die Brücke das - Hinzugefügt
1.27.0Brücke:
POST /api/editor/ki/abschreibenschreibt eine Sprachnotiz ab (ffmpeg + WhisperNotes), für fremde Gastgeber freigegeben wieverfuegbar - Hinzugefügt
1.26.0Datum im Inhalt:
2026-10wird beim Zeichnen gerechnet statt im Text zu stehen — vor dem zweiten Doppelpunkt der Versatz in Tagen, dahinter das Schema (JJJJ,JJ,MM,TT; englischYYYY,YY,DD), beides entbehrlich. Der Versatz zählt Tage, mit angehängtemj/yJahre — nötig, wo im Inhalt eine Zahl danebensteht: Im Passwort-Beispiel stehtLuna2021!neben „Luna wird heute 5!“, und5 × 365Tage lägen nach einem Schaltjahr im falschen Jahr. Ohne Schema gilt das der Sprache,content.dateFormat, überschreibbar wie jede Beschriftung. Wirkt in jedem Textfeld, das durchLmsMarkdownläuft, und zusätzlich in den reinen Textfeldern der Mail-Attrappen (Betreff, Absender, Adresse, Vorschauzeile, Linkziel, Anhangsname) in LmsPhishingQuiz, LmsMailTriage und LmsMockMail. Damit veraltet ein Beispiel nicht mehr: Eine Phishing-Mail mit einer Rechnungsnummer von vorgestern ist glaubwürdig, eine von 2024 verrät sich an der falschen Stelle. Der Tag kommt aususeStichtag()— auf dem Server gerechnet, über die Nutzlast in den Browser, dort einmal nachgebessert, damit auch eine vorgerenderte Seite nicht den Tag ihres Builds trägt. Geprüft vonpnpm run datum-test. Auch dort eingesetzt, wo ein Feld nicht gerendert, sondern verglichen oder zerlegt wird: das gesuchte Passwort in LmsPasswordHunt und die Tage eines Rasters in LmsHeatmap — ein Raster mit festen Tagen zeigt nach zwölf Wochen nichts mehr - Hinzugefügt
1.25.0Aufträge: Folien, Word-Seiten und PDFs liegen zusätzlich als Seitenbilder im Auftragsordner (LibreOffice +
pdftoppm, ausgeblendete Folien mit, damit die Nummern zum Textauszug passen) — der Textauszug kennt keine Anordnung, und Schaubilder gingen verloren - Hinzugefügt
1.25.0Aufträge über die Brücke (
/_ws/ki-auftrag): Ein Agent baut aus hochgeladenem Material in einem eigenen Ordner ein Lernpfadpaket, prüft es bei der Plattform und gibt es dort ab;useLmsBausteinwissen()liefert ihm Katalog, Typen, Konventionen und Muster.laufeCodex()nimmt einen eigenen Arbeitsordner, der MCP-Kanal eine eigene Werkzeugliste - Behoben
1.16.2Die Umbrüche richten sich nach der eigenen Breite, nicht nach dem Fenster. Nach
LmsHeadersind die übrigen 28 Bausteine mitsm:/md:/lg:nachgezogen: Raster, Seitenspalten und Zeilenumbrüche fragen jetzt per@containerihren eigenen Platz ab - Hinzugefügt
1.15.0Die eingebauten Beschriftungen gibt es auf Englisch. Gewählt wird über
lms.sprachein derapp.config.ts(deoderen);labelsgilt weiterhin und liegt über der gewählten Sprache, so dass sich einzelne Texte weiter austauschen lassen - Geändert
0.7.0src/runtime/utils/totp.tskommt hinzu: TOTP in reinem JavaScript, gegen die Testvektoren des RFC geprüft. Einzige Änderung gegenüber der Quelle sind Nicht-Null-Zusicherungen an den Feldzugriffen — der Bestand an@ts-nocheckbleibt bei 51, und keine Ausnahme liegt außerhalb vonfx/ - Hinzugefügt
0.6.0useLmsProgress: Fortschritt lässt sich speichern, ohne dass die Bibliothek ein Backend kennt. Das Zielprojekt hinterlegt einmal einen Adapter mitget/set, die Bausteine nutzen ihn, wenn er da ist — sonst halten sie den Stand im Speicher wie bisher. Ereignisse wären hier nutzlos: MDC kann keine Events abonnieren, und genau dort werden diese Bausteine benutzt - Behoben
0.4.0Die Warnung
Slot "default" invoked outside of the render functionerscheint nicht mehr. Der Katalog läuft jetzt mit 0 Fehlern und 0 Warnungen - Hinzugefügt
0.3.0Der MDC-Bereich jedes Beispiels ist jetzt ein Editor: Syntaxhervorhebung, Code-Vervollständigung aus der Registry, Prüfung in sechs Stufen und eine Vorschau, die beim Tippen mitläuft. Oben rechts Zurücksetzen und Kopieren
- Hinzugefügt
0.3.0Die Prüfung meldet unbekannte Bausteine, unbekannte Props, fehlende Pflicht-Props, unbekannte Slots, Events (die MDC nicht abonnieren kann) und den Typkonflikt, an dem man in MDC am häufigsten hängenbleibt: Inline-Attribute sind immer Zeichenketten,
{count=14}übergibt"14" - Hinzugefügt
0.2.0API-Ansicht je Baustein: Props, Slots, Emits, Theme und dieser Changelog. In der Demo-Hülle als Reiter hinter dem Knopf API, auf der Detailseite ausgeschrieben
- Hinzugefügt
0.2.0Emits werden dokumentiert. Sie sind der Grund, warum sich manche Bausteine aus Markdown heraus nicht vollständig bedienen lassen: MDC kann keine Events abonnieren
- Geändert
0.2.0Die Komponentenreferenz der README wird jetzt vollständig erzeugt statt von Hand gepflegt
- Geändert
0.2.0Auch die Tabelle der optionalen Abhängigkeiten wird erzeugt. Sie war gedriftet:
motion-vstand mit 50 statt 54 Komponenten darin,@uiw/color-convertunter „je 1", obwohl es drei sind - Hinzugefügt
0.1.0Erstveröffentlichung: 187 Bausteine in 17 Kategorien, davon 40 didaktische
Lms- und 147 dekorativeFx-Bausteine aus Inspira UI