# Schulspace-Paket: Anleitung für KI-Agenten

Ein Schulspace-Paket ist **eine ZIP-Datei**, aus der Schulspace eine ganze Unterrichtseinheit auf einmal anlegt: Lerninhalte (HTML-Apps mit Word-/PDF-Unterlagen), Meinungsbilder, Kartenabfragen, Live-Quizze, eine Pinnwand als Übersicht für die Klasse und auf Wunsch eine Sammlung. Danach zeigt Schulspace alle Links und QR-Codes auf einer Seite.

Diese Anleitung richtet sich an KI-Agenten (Claude, Claude Code, Codex und andere), die das Paket für eine Lehrkraft bauen. Sie ist vollständig: Was hier nicht steht, nimmt Schulspace nicht an.

## Ablauf

1. Material der Lehrkraft lesen (Arbeitsblätter, Folien, Lehrplan, Notizen). Nur dieses Material verwenden und nichts Fachliches dazuerfinden.
2. Einen Ordner anlegen, darin die Datei `schulspace-paket.json` und die Dateien, auf die sie verweist.
3. Prüfen: `python pruefen.py mein-paket/` (das Skript liegt im Skill und unter https://schulspace.de/paket/skill.zip). Fehler beheben, bis „OK" erscheint.
4. Packen: `python pruefen.py mein-paket/ --zip` erzeugt `mein-paket.zip` mit der richtigen Struktur.
5. Die Lehrkraft lädt die ZIP-Datei unter https://schulspace.de/paket hoch, sieht eine Vorschau und legt alles mit einem Klick an.

Ohne Python: Die ZIP-Datei von Hand bauen. `schulspace-paket.json` muss in der obersten Ebene liegen (oder in genau einem Ordner, der selbst gezippt wurde).

## Aufbau des Ordners

```
mein-paket/
  schulspace-paket.json
  lerninhalte/
    grundrechte-quiz.html
    fallbeispiele.html
  unterlagen/
    arbeitsblatt.pdf
    loesung.docx
```

Pfade in der JSON-Datei sind relativ zum Ordner und nutzen `/`. Groß- und Kleinschreibung muss stimmen.

## Vollständiges Beispiel

```json
{
  "format": "schulspace-paket",
  "version": 1,
  "titel": "Grundrechte – Einstieg in die Einheit",
  "paket_id": "grundrechte-einstieg",
  "kennung": "k7m3p9x2qw4t",
  "beschreibung": "Doppelstunde für die 10. Klasse Berufsschule",
  "fach": "Politik und Gesellschaft",
  "zielgruppe": "Berufsschule 10. Klasse",
  "teile": [
    {
      "id": "start",
      "typ": "meinungsbild",
      "titel": "Was weißt du schon über Grundrechte?",
      "fragen": [
        {"typ": "stimmung", "text": "Wie sicher fühlst du dich beim Thema Grundrechte?"},
        {"typ": "wortwolke", "text": "Welches Grundrecht fällt dir zuerst ein?",
         "einstellungen": {"max_antworten": 2}},
        {"typ": "diagramme", "text": "Gilt die Meinungsfreiheit auch in der Ausbildung?",
         "einstellungen": {"typ": "single", "optionen": ["Ja", "Nein", "Nur teilweise"]}}
      ]
    },
    {
      "id": "quiz-app",
      "typ": "lerninhalt",
      "datei": "lerninhalte/grundrechte-quiz.html",
      "titel": "Grundrechte-Check",
      "sichtbarkeit": "oeffentlich",
      "unterlagen": [
        {"datei": "unterlagen/arbeitsblatt.pdf", "titel": "Arbeitsblatt", "gruppe": "Für die Klasse", "stufe": "alle"},
        {"datei": "unterlagen/loesung.docx", "titel": "Lösung", "gruppe": "Für Lehrkräfte", "stufe": "lehrkraefte"}
      ]
    },
    {
      "id": "fragen",
      "typ": "kartenabfrage",
      "titel": "Wo begegnen dir Grundrechte im Betrieb?",
      "beschreibung": "Eine Karte pro Beispiel.",
      "kategorien": ["Am Arbeitsplatz", "In der Berufsschule", "Privat"]
    },
    {
      "id": "abschluss",
      "typ": "livequiz",
      "titel": "Grundrechte – Abschlussquiz",
      "fragen": [
        {"typ": "sc", "text": "Welcher Artikel schützt die Menschenwürde?",
         "optionen": ["Art. 5 GG", "Art. 1 GG", "Art. 20 GG"], "richtige_antwort": [1]},
        {"typ": "wf", "text": "Grundrechte gelten nur für deutsche Staatsangehörige.",
         "optionen": ["Wahr", "Falsch"], "richtige_antwort": [1]}
      ]
    },
    {
      "id": "uebersicht",
      "typ": "pinnwand",
      "titel": "Grundrechte – unsere Stunde",
      "sichtbarkeit": "oeffentlich",
      "spalten": [
        {"titel": "Einstieg", "farbe": "#2563eb", "karten": [
          {"typ": "teil", "teil": "start", "titel": "Meinungsbild zum Start"}
        ]},
        {"titel": "Erarbeitung", "farbe": "#f59e0b", "karten": [
          {"typ": "text", "titel": "Auftrag", "text": "Spielt den Grundrechte-Check und notiert zwei Fragen."},
          {"typ": "teil", "teil": "quiz-app"}
        ]},
        {"titel": "Sicherung", "farbe": "#16a34a", "karten": [
          {"typ": "teil", "teil": "fragen"},
          {"typ": "link", "titel": "Grundgesetz online", "url": "https://www.gesetze-im-internet.de/gg/"}
        ]}
      ]
    }
  ],
  "sammlung": {
    "sichtbarkeit": "privat",
    "abschnitte": [
      {"titel": "Einstieg", "inhalt": ["start"]},
      {"titel": "Erarbeitung", "inhalt": ["quiz-app", {"text": "Partnerarbeit, 20 Minuten"}]},
      {"titel": "Sicherung", "inhalt": ["fragen", "abschluss", "uebersicht"]}
    ]
  }
}
```

## Felder des Pakets

| Feld | Pflicht | Bedeutung |
|---|---|---|
| `format` | ja | immer `"schulspace-paket"` |
| `version` | ja | immer `1` |
| `titel` | ja | Name der Einheit, höchstens 150 Zeichen |
| `beschreibung` | nein | kurze Beschreibung |
| `fach` | nein | Fach, wird an alle Teile weitergegeben, die keins haben |
| `zielgruppe` | nein | z. B. „Klasse 7" oder „Berufsschule 10. Klasse" |
| `teile` | ja | Liste der Teile, 1 bis 30 |
| `sammlung` | nein | bündelt alle Teile in einer Sammlung (siehe unten) |
| `paket_id` | empfohlen | stabiler Name der Einheit (klein, a–z, 0–9, `-`, `_`, höchstens 40 Zeichen). Dasselbe Paket noch einmal hochladen = aktualisieren statt verdoppeln; zweiter Teil der Nachsendeadressen |
| `kennung` | nein | Paket-Kennung der Lehrkraft aus ihrem persönlichen Skill-Download (Abschnitt „Deine Lehrkraft" in SKILL.md). Nur mit `paket_id`; macht Nachsendeadressen möglich |

## Nachsendeadressen und Paket aktualisieren

Mit `kennung` und `paket_id` hat jeder Teil eine feste Adresse, die schon gilt, bevor das Paket hochgeladen ist – Schulspace leitet später zum echten Inhalt weiter:

```
https://schulspace.de/p/<kennung>/<paket_id>/<teil_id>    ein Teil
https://schulspace.de/p/<kennung>/<paket_id>              die ganze Stunde (Pinnwand, sonst Sammlung)
```

- Damit gehören QR-Codes auf Arbeitsblätter (`python qr.py <adresse> qr.png`, im Skill enthalten) und Querverweise zwischen Lerninhalten (`<a href="https://schulspace.de/p/…/quiz" target="_blank" rel="noopener">Weiter zum Quiz</a>` – immer `target="_blank"`, der Lerninhalt läuft in einem Rahmen, der nur neue Tabs öffnen darf) schon beim Bauen dazu. Die Prüfung meldet Adressen mit fremder Kennung, falscher `paket_id` oder unbekanntem Teil als Fehler und listet alle gültigen Adressen im Bericht.
- Die Klasse erreicht über die Adresse nur, was freigegeben ist: Lerninhalte `oeffentlich` oder `link`, Pinnwand `oeffentlich`. Ein Live-Quiz führt in die laufende Runde oder Hausaufgabe; läuft keine, sieht die Klasse einen freundlichen Hinweis.
- Vor dem Hochladen zeigt die Adresse „Noch nicht da". Die Kennung ist persönlich: ein Paket mit fremder Kennung nimmt Schulspace nicht an.
- **Aktualisieren:** Ein zweites Hochladen mit derselben `paket_id` ersetzt Teile mit gleicher Teil-id an Ort und Stelle (Inhalt, Titel, Beschreibung, Fragen), legt neue Teile an und lässt Teile, die im Paket fehlen, unverändert im Konto. Sichtbarkeit, Passwörter und Beiträge der Klasse bleiben; Fragen eines Meinungsbilds oder Quiz mit Antworten bleiben stehen (dafür eine neue Teil-id vergeben); auf der Pinnwand und in der Sammlung bleibt Vorhandenes, neue Teile kommen dazu; eine Unterlage mit gleichem Titel und geänderter Datei wird ersetzt. Teil-ids deshalb nie umbenennen und nie einem anderen Werkzeug geben (Schulspace lehnt einen Typwechsel unter gleicher Teil-id ab).

Jeder Teil hat eine `id` (klein, nur a–z, 0–9, `-` und `_`, höchstens 40 Zeichen, eindeutig) und einen `typ`: `lerninhalt`, `meinungsbild`, `kartenabfrage`, `livequiz` oder `pinnwand`. Über die `id` verweisen Pinnwand und Sammlung auf die Teile.

## Lerninhalt

Eine eigene HTML-Datei, die Schulspace wie einen normalen Upload veröffentlicht.

| Feld | Pflicht | Bedeutung |
|---|---|---|
| `datei` | ja | Pfad zur `.html`-Datei im Paket, höchstens 15 MB |
| `titel` | nein | sonst aus `<meta name="schulspace-title">` oder `<title>` |
| `beschreibung`, `fach`, `zielgruppe` | nein | sonst aus den `schulspace-…`-Meta-Tags bzw. dem Paket |
| `sichtbarkeit` | nein | `oeffentlich` (Standard: per Link und im Profil), `galerie` (zusätzlich in der Galerie), `link` (geheimer Link, nur Premium), `privat` |
| `unterlagen` | nein | bis zu 10 Word-/PDF-Dateien, die am Lerninhalt hängen |
| `markierungen` | nein | nur `false` für eine bestehende HTML-Datei der Lehrkraft, die du nicht selbst baust (siehe unten) |

Eine Unterlage: `{"datei": "unterlagen/ab.pdf", "titel": "Arbeitsblatt", "gruppe": "Für die Klasse", "stufe": "alle"}`. `stufe` regelt, wer sie laden darf: `alle` (auch ohne Konto), `lehrkraefte` (Standard, nur angemeldete Lehrkräfte) oder `premium`. Die Lehrkraft selbst kann ihre Unterlagen immer laden. Setze `stufe` bei jeder Unterlage ausdrücklich, ohne andere Angabe der Lehrkraft so: Material für Schülerinnen und Schüler (Arbeitsblatt, Infotext, Aufgaben) → `alle` mit der Gruppe „Für die Klasse"; Material für Lehrkräfte (Lösung, Erwartungshorizont, Verlaufsplan, Tafelbild) → `lehrkraefte` mit der Gruppe „Für Lehrkräfte". `premium` nur auf ausdrücklichen Wunsch. Stammt Schülermaterial erkennbar von Dritten (Schulbuch, Verlag), bleibt es bei `lehrkraefte`. Unterlagen sind derzeit nicht für jedes Konto freigeschaltet. Fehlt die Freischaltung, legt Schulspace den Lerninhalt trotzdem an und meldet das.

**Regeln für die HTML-Datei** (diese Fehler sieht man sonst erst im Unterricht):

- Eine einzige, vollständige HTML-Datei mit CSS und JavaScript darin. Bilder als eingebettete Daten (`data:`), am besten WebP.
- Nichts von fremden Servern laden: keine Bilder, Schriften oder Skripte über `https://…`. Bekannte Bibliotheken ersetzt Schulspace durch eigene Kopien, alles andere wird beim Hochladen entfernt. Statt Fotos Emojis oder SVG verwenden.
- Kein `alert()`, `confirm()` oder `prompt()`. Diese Dialogfenster sind in der Schulspace-Ansicht gesperrt. Meldungen auf der Seite anzeigen.
- `localStorage` nur in `try { … } catch (e) { … }`. In manchen Schulnetzen wirft es einen Fehler.
- Interne Sprünge nicht über `<a href="#abschnitt">`, sondern per JavaScript (Klick abfangen, Ansicht umschalten).
- Muss am Handy, Tablet und PC funktionieren. Keine Anmeldung, keine Speicherung auf fremden Servern, keine Namen von Schülerinnen und Schülern.
- 6 bis 10 Markierungen für den Bearbeitungs-Check (nächster Abschnitt).
- Diese Meta-Tags in den `<head>`:

```html
<meta name="schulspace-title" content="Grundrechte-Check">
<meta name="schulspace-description" content="Zehn Fragen mit Erklärung zu Artikel 1 bis 19 GG">
<meta name="schulspace-subject" content="Politik und Gesellschaft">
<meta name="schulspace-audience" content="Berufsschule 10. Klasse">
```

### Markierungen für den Bearbeitungs-Check

Jede HTML-Datei, die du baust, bekommt Markierungen. Mit einem Bearbeitungs-Check sieht die Lehrkraft später, wer welche Aufgaben bearbeitet hat. Die Markierungen sind reine Attribute: Sie verändern weder Aussehen noch Verhalten und tun nichts, solange kein Check läuft. Das Paket legt **keinen** Bearbeitungs-Check an. Das entscheidet die Lehrkraft später selbst je Klasse, und Schulspace findet die Markierungen dann automatisch.

**BEARBEITUNGS-CHECK-MARKIERUNGEN (PFLICHT):**
Instrumentiere die Anwendung für den Schulspace-Bearbeitungs-Check mit den Attributen data-ss-anchor, data-ss-label und data-ss-kind:
- PFLICHT-Anzahl: 6 bis 10 Markierungen, über die GESAMTE Anwendung verteilt. Eine einzelne Markierung am Start-Button ist FALSCH — sie zeigt der Lehrkraft nur "geöffnet", nicht "bearbeitet".
- Gut geeignete Stellen (davon mehrere verwenden):
  - der Prüfen-/Absenden-Button JEDER Aufgabe → data-ss-kind="click"
  - Eingabefelder mit Schülerantworten → data-ss-kind="input"
  - Erfolgs-/Feedback-Meldungen ("Super gemacht!", "Richtig!") und Auswertungs-/Ergebnis-Screens → data-ss-kind="visible" (wird gemeldet, sobald der Abschnitt erscheint)
  - eine Punkteanzeige → data-ss-kind="score"
- NICHT markieren: Neustart-/Zurücksetzen-Buttons und reine Navigation (Menü, Zurück-Pfeile). Im Idealfall klickt sie niemand — eine Markierung dort bliebe leer und würde die Übersicht der Lehrkraft verfälschen.
- data-ss-anchor: "a1", "a2", … fortlaufend in Bearbeitungsreihenfolge; jeder Wert kommt GENAU EINMAL vor (auch nach dem Kopieren von Blöcken prüfen).
- data-ss-label: kurzer, für eine Lehrkraft verständlicher Name wie "Aufgabe 3 – Antwort geprüft" — keine Technik-Kürzel wie "q1".
- Die LETZTE Markierung sitzt auf dem Abschluss-Button oder End-Screen, mit data-ss-counts="true".
- Wird derselbe Weiter-Button über mehrere Etappen wiederverwendet, gib ihm data-ss-times="<Anzahl Etappen>".
- Auch Elemente, die erst per JavaScript gerendert werden, bekommen die Attribute (direkt im Render-Code/Template-String) — sie werden nachträglich erkannt.
- Die Attribute sind reine Marker: schreibe KEIN zusätzliches JavaScript dafür, Verhalten und Design bleiben unverändert.

Beispiel:

```html
<button data-ss-anchor="a1" data-ss-label="Aufgabe 1 – Antwort geprüft" data-ss-kind="click">Prüfen</button>
<textarea data-ss-anchor="a2" data-ss-label="Aufgabe 2 – Begründung" data-ss-kind="input"></textarea>
<div data-ss-anchor="a3" data-ss-label="Erfolgsmeldung gesehen" data-ss-kind="visible">Super gemacht!</div>
<span data-ss-anchor="a4" data-ss-label="Punktestand" data-ss-kind="score">Punkte: 0</span>
<button data-ss-anchor="a5" data-ss-label="Übung abgeschlossen" data-ss-kind="click" data-ss-counts="true">Fertig</button>
```

Markierungen müssen feste Werte im Quelltext haben (`data-ss-anchor="a3"`), auch in JavaScript-Template-Strings. Zusammengesetzte Werte wie `"a" + n` oder `setAttribute(…)` findet die Prüfung nicht. `pruefen.py` meldet fehlende oder zu wenige Markierungen als Fehler.

Übernimmst du eine **bestehende** HTML-Datei der Lehrkraft, die du nicht selbst baust, setze beim Lerninhalt `"markierungen": false`. Dann verlangt die Prüfung keine Markierungen.

### Einzelner Lerninhalt für das normale Hochladen

Nicht alles muss ein Paket sein. Will die Lehrkraft nur eine HTML-Datei – oder einer vorhandenen Datei die „Schulspace-Metadaten" hinzufügen –, gibt es keine ZIP-Datei und keine `schulspace-paket.json`:

- Die vier Meta-Tags gehören in den `<head>`: `schulspace-title`, `schulspace-description`, `schulspace-subject` (Fach), `schulspace-audience` (Zielgruppe). Das Formular unter „Hochladen" liest genau diese vier und füllt damit Titel, Beschreibung, Fach und Zielgruppe aus. Die Schulart wählt die Lehrkraft selbst.
- Für eine Datei, die du selbst baust, gelten alle Regeln oben, auch die Markierungen für den Bearbeitungs-Check.
- Bei einer bestehenden Datei der Lehrkraft ergänzt du nur die Meta-Tags und änderst sonst nichts.
- Gib die vollständige HTML-Datei zurück. Die Lehrkraft zieht sie unter „Hochladen" ins Formular oder fügt den Code ein.

## Meinungsbild

Die Klasse antwortet anonym per Code oder QR-Code, das Ergebnis erscheint live am Beamer.

| Feld | Pflicht | Bedeutung |
|---|---|---|
| `titel` | ja | höchstens 200 Zeichen |
| `begleittext` | nein | Text unter dem Titel |
| `steuerung` | nein | `selbst` (Standard: die Klasse blättert selbst) oder `lehrkraft` |
| `ergebnisse` | nein | `live` (Standard) oder `verdeckt` (erst auf Knopfdruck) |
| `fragen` | ja | 1 bis 50 Fragen |

Eine Frage: `{"typ": "…", "text": "…", "einstellungen": {…}, "zeitlimit_sek": 60}`. `einstellungen` und `zeitlimit_sek` sind freiwillig.

| typ | Was die Klasse tut | einstellungen |
|---|---|---|
| `daumen` | Daumen hoch/runter | `modus`: `daumen`, `daumen_plus` (mit neutral), `ampel`, `ja_nein`, `ja_nein_enth` (mit Enthaltung), `custom` mit `optionen`: 2–4 × `{"text": "…", "emoji": "🙂"}` |
| `stimmung` | Stimmung auf einer Skala | `stufen` 2–10, `typ`: `emoji` oder `zahl` |
| `positionslinie` | Position zwischen zwei Polen | `links`, `rechts` (Beschriftungen), `stufen` 2–20 |
| `schaetzfrage` | eine Zahl schätzen | `einheit`, `min`, `max`, `aufloesung` |
| `wortwolke` | Begriffe eingeben | `max_zeichen` 5–100, `max_antworten` 1–10 |
| `wortkarten` | kurze Sätze auf Karten | `max_zeichen` 20–240, `max_antworten` 1–10 |
| `zielscheibe` | mehrere Aspekte bewerten | `achsen` (bis 8 Texte), `skala` 2–10 |
| `ranking` | Einträge ordnen | `items` (2–10 Texte, Pflicht), `modus`: `vollstaendig`, `punkte`, `top3`; `punkte` 5–50 |
| `diagramme` | Abstimmung mit Diagramm | `typ`: `single`, `multiple`, `wahrfalsch`; `optionen` (2–10 Texte, Pflicht außer bei `wahrfalsch`); `diagramm`: `balken`, `gestapelt`, `donut` |
| `individuell` | eigene Frageform | `typ`: `single`, `multiple` (dann `optionen` Pflicht), `freitext`, `skala` (`skala_min`, `skala_max`) |
| `info` | keine Abstimmung, nur eine Infofolie | `text` |

## Kartenabfrage

Die Klasse schreibt Karten, die Lehrkraft sortiert und clustert sie am Beamer.

| Feld | Pflicht | Bedeutung |
|---|---|---|
| `titel` | ja | die Frage oder der Auftrag, höchstens 200 Zeichen |
| `beschreibung` | nein | Erklärung für die Klasse |
| `kategorien` | nein | bis zu 50 Kategorien, aus denen die Klasse wählt |
| `max_karten` | nein | Karten je Person, 0 = unbegrenzt |
| `fach`, `zielgruppe` | nein | sonst aus dem Paket |

## Live-Quiz

Ein Quiz im Stil von Kahoot. Die Klasse tritt mit einem Spiel-Code bei, der beim Starten erscheint.

| Feld | Pflicht | Bedeutung |
|---|---|---|
| `titel` | ja | höchstens 200 Zeichen |
| `beschreibung`, `fach`, `zielgruppe` | nein | |
| `sichtbarkeit` | nein | `privat` (Standard) oder `oeffentlich` (auch andere Lehrkräfte finden es) |
| `fragen` | ja | 1 bis 100 Fragen |

Eine Frage: `{"typ": "sc", "text": "…", "optionen": [...], "richtige_antwort": [...], "zeitlimit_sek": 20, "punkte_max": 1000}`. `zeitlimit_sek` (5–120) und `punkte_max` (500, 1000 oder 2000) sind freiwillig. Positionen in `richtige_antwort` zählen **ab 0**.

| typ | optionen | richtige_antwort |
|---|---|---|
| `sc` Einzelwahl | 2–6 Antworten | genau eine Position, z. B. `[2]` |
| `mc` Mehrfachwahl | 2–6 Antworten | alle richtigen Positionen, z. B. `[0, 3]` |
| `wf` Wahr/Falsch | `["Wahr", "Falsch"]` | `[0]` für wahr, `[1]` für falsch |
| `reihenfolge` | 2–6 Einträge **in der richtigen Reihenfolge** (Schulspace mischt) | weglassen |
| `zuordnung` | erst alle Begriffe, dann alle Erklärungen in derselben Reihenfolge (2–5 Paare) | weglassen |
| `schaetzfrage` | `["Minimum", "Maximum"]` als Zahlen | `[gesuchte Zahl]` zwischen beiden |
| `freitext` | 1–10 akzeptierte Antworten (Tippfehler werden toleriert) | weglassen |
| `umfrage` | 2–6 Antworten, ohne Wertung | weglassen |

Bei `sc` die richtige Antwort an eine zufällige Position setzen und nur eindeutige Fragen stellen: Keine zweite Option darf unter einer vertretbaren Lesart ebenfalls richtig sein.

## Pinnwand

Eine Pinnwand mit Spalten und Karten, ideal als Übersicht der Stunde für die Klasse. Karten vom Typ `teil` binden andere Teile des Pakets ein.

| Feld | Pflicht | Bedeutung |
|---|---|---|
| `titel` | ja | höchstens 200 Zeichen |
| `beschreibung` | nein | |
| `sichtbarkeit` | nein | `privat` (Standard) oder `oeffentlich` (per Link und QR-Code für die Klasse) |
| `layout` | nein | `spalten` (Standard) oder `sammlung` |
| `beitraege` | nein | `lehrkraft` (Standard: nur du) oder `klasse` (die Klasse darf posten, Beiträge erscheinen nach deiner Freigabe) |
| `reaktionen` | nein | `keine` (Standard), `herz`, `stimme`, `sterne` |
| `hintergrund` | nein | Name eines Hintergrunds, z. B. `marke`, `lagune`, `petrol`, `schiefer`, `karo`, `punkte` |
| `spalten` | ja | 1–12 Spalten mit `titel`, optional `farbe` (`"#2563eb"`) und `karten` (bis 50 je Spalte, 200 insgesamt) |

| Kartentyp | Felder |
|---|---|
| `text` | `titel` und/oder `text`. Leerzeile = neuer Absatz. Einfaches HTML (`<b>`, `<i>`, `<ul>`, `<a>`) ist erlaubt. |
| `link` | `url` (http/https), optional `titel`, `text` |
| `liste` | `eintraege`: Liste von Texten (Checkliste) |
| `teil` | `teil`: die `id` eines Lerninhalts, Meinungsbilds, einer Kartenabfrage oder eines Live-Quiz im Paket; optional `titel` |

Jede Karte darf außerdem eine `farbe` haben. Wenn die Pinnwand öffentlich ist, sollten eingebundene Lerninhalte nicht privat sein, sonst kann die Klasse sie nicht öffnen.

## Sammlung

`"sammlung": true` legt eine Sammlung mit allen Teilen in Paket-Reihenfolge an. Mit einem Objekt lässt sie sich gliedern:

| Feld | Bedeutung |
|---|---|
| `titel`, `beschreibung` | sonst vom Paket |
| `sichtbarkeit` | `privat` (Standard), `link` (öffentlich per Link, nicht in der Galerie) oder `galerie` |
| `ansicht` | `board` (Abschnitte als Spalten, Standard bei `abschnitte`) oder `liste` (untereinander, Standard ohne Abschnitte) |
| `abschnitte` | Liste von `{"titel": "…", "inhalt": [ … ]}` |

Ein Eintrag in `inhalt` ist die `id` eines Teils, `{"text": "Arbeitsauftrag …"}` für ein Textfeld oder `{"link": "https://…", "titel": "…", "beschreibung": "…"}` für eine Link-Karte. Meinungsbilder, Kartenabfragen und Live-Quizze sieht in einer Sammlung nur die Lehrkraft. Für die Klasse ist die Pinnwand der bessere Ort.

## Grenzen

- ZIP-Datei höchstens 15 MB, entpackt höchstens 48 MB, höchstens 300 Dateien.
- Höchstens 30 Teile, davon höchstens 15 Lerninhalte.
- Je HTML-Datei und je Unterlage höchstens 15 MB, alle HTML-Dateien zusammen höchstens 20 MB.
- Es gelten die normalen Kontingente des Kontos (z. B. Anzahl Lerninhalte oder Meinungsbilder im kostenlosen Konto). Die Vorschau zeigt, ob das Paket passt.
- Geheimer Link für Lerninhalte nur mit Premium oder Schullizenz.

## Datenschutz

- Keine Namen oder sonstigen Daten von Schülerinnen und Schülern ins Paket schreiben. Peer-Feedback mit Namenslisten gibt es deshalb im Paket nicht.
- Keine Passwörter ins Paket schreiben. Passwortschutz setzt die Lehrkraft nach dem Anlegen in Schulspace.
- Urheberrecht: Unterlagen mit `stufe: "alle"` kann jede Person laden. Das passt nur für eigenes oder frei lizenziertes Material.

## Gute Pakete

- Vom Material der Lehrkraft ausgehen, nicht vom Thema: Fragen, Karten und Aufgaben aus ihren Unterlagen ableiten.
- Didaktisch aufbauen: Einstieg (Meinungsbild oder Kartenabfrage), Erarbeitung (Lerninhalt mit Unterlagen), Sicherung (Live-Quiz, Kartenabfrage), dazu eine öffentliche Pinnwand als roter Faden für die Klasse.
- Lieber wenige, gut gemachte Teile als viele. Jede HTML-Datei einzeln bauen, testen und prüfen. Danach die JSON-Datei schreiben und `pruefen.py` laufen lassen.
- Am Ende der Lehrkraft kurz sagen, was im Paket steckt und was sie nach dem Anlegen noch einstellen sollte (Passwort, Sichtbarkeit, Freigaben).
