Kontextabgrenzung: Die Apps kennen nur den Browser, alles andere hängt an Links und am Build

Das System „Lern-Apps“ ist das Monorepo mit allem, was daraus entsteht: die ausgelieferte Site unter https://lernapps.github.io/ (Apps, Mathe-Karte, Übersicht, diese Doku) und der Build, der sie erzeugt. Zur Laufzeit gibt es keinen Server und keine Schnittstelle, die das System selbst aufruft. Nachbarn erreicht es auf drei Wegen: über Links, denen ein Mensch oder ein LLM folgt (claude.ai, GitHub Issues, serlo.org); über das YouTube-iframe, das erst nach einem Klick entsteht; und zur Build-Zeit über Paketquellen und GitHub. Dieselbe Systemgrenze zeigt Kapitel 5, Ebene 1.

Fachlicher Kontext: Zwei Menschen, sieben Nachbarsysteme

kontext fachlich
Nachbar Was er vom System bekommt Was das System von ihm bekommt

Lernende

Seiten, Aufgaben, Rückmeldung, Ergebniszeile, Karte

Eingaben, Selbsteinschätzung (nur im eigenen Browser)

App-Autor:in

Test- und Build-Meldungen (npm test, npm run build)

Konfiguration, Generatoren, Zeichenfunktionen, Markdown-Seiten, Kartendaten, ADRs

claude.ai

tutor.md und llms.txt je App, llms.txt der Übersicht und der Karte, Aufgaben-URLs

Nichts. Das System meldet dem Tutor nichts; das Kind trägt Nummer und Ergebniszeile und schickt Fotos seines Rechenwegs selbst in den Chat (ADR-022).

YouTube

Video-ID im iframe-Aufruf, IP-Adresse und Browserdaten des Kindes (erst nach Klick)

Videoplayer

serlo.org

Nichts. Die Kompetenzseite enthält nur einen Link unter #serlo; erst der Klick öffnet de.serlo.org.

Einen Artikel in anderen Worten, kostenlos, werbefrei, ohne Anmeldung (gemeinnütziger Serlo Education e.V.). Die Adresse prüft die Autor:in beim Anlegen; der Build prüft nur https://de.serlo.org/…, ohne Netzabruf.

GitHub Issues

Nichts. Die Seite enthält nur einen Link; erst der Klick öffnet GitHub.

Rückmeldungen als Issues, die die Autor:in liest. GitHub verlangt ein Konto und ein Mindestalter von 13 Jahren.

GitHub

Quellcode, Commits, Pull Requests

CI-Läufe (pruefen.yml, pages.yml), Organisation und Rechte

GitHub Pages

Ein Artefakt: Eleventy-Ausgabe _site/ mit der Doku unter _site/docs/

HTTPS-Auslieferung unter https://lernapps.github.io/

Paketquellen

Anfragen von npm ci und scripts/dtc-v4.sh

Eleventy 3.1.6 samt transitiven Paketen (package-lock.json); docToolchain main-4.x@6de96fb7 und seine Gradle-Abhängigkeiten

Der Skill lern-app, mit dem die Autor:in neue Apps anlegt, ist kein Nachbar mehr: Er liegt seit PR #7 im Monorepo unter werkzeuge/skill/lern-app/. Die alten Einzel-Repos (raifdmueller.github.io/<app>/), die alte Mathe-Karte, die Vorlage lern-app-template und das alte Skill-Repo lern-app-skill sind am 23.09.2026 gelöscht worden; ihre Pages-Adressen liefern 404. Das erledigte Risiko steht als R-016 in Kapitel 11.

Technischer Kontext: HTTPS-GET, ein Deep Link, ein iframe und zwei Paketquellen

Kanal Protokoll / Format Einzelheiten

Browser → GitHub Pages

HTTPS GET

HTML, CSS, ES-Module (/kern/js/.js, /<app>/js/*), SVG/PNG, manifest.webmanifest, karte/data.json. Keine Cookies, kein POST.

Seite → claude.ai

Link https://claude.ai/new?q=<Prompt>;

Prompt „Lade <App-Adresse>tutor.md …“; erzeugt von TalkItOver, statischer <a>-Fallback in src/start.njk:48. Öffnet ein neues Fenster.

claude.ai → GitHub Pages

HTTPS GET durch das Web-Fetch-Werkzeug von Claude

<app>/tutor.md, <app>/llms.txt, /llms.txt, /karte/llms.txt. Ob Claude die Datei laden kann, entscheidet claude.ai.

Tutor → Kind → App

Aufgaben-URL

<app>/<seite>.html?<parameter>&seed=<n>, <app>/test.html?nr=<n>&modus=voll|schnell, Anker #warum … #uebung. Vertrag im llms.txt jeder App.

Kind → Tutor

Text (Zwischenablage)

Ergebniszeile Test Nr. 4711 (<App>, Schnelltest): 1 ✓ 2 ~ 3 ✗; „Aufgabe Nr. 42“; kopierter Aufgabenlink.

Seite → GitHub Issues

Link https://github.com/lernapps/lernapps.github.io/issues

Statischer <a> auf jeder Seite (entschieden am 23.09.2026, noch nicht umgesetzt). Keine Anfrage vor dem Klick; danach gelten die Regeln von GitHub.

Seite → serlo.org

Link https://de.serlo.org/<fach>/<id>/<titel>;

Statischer <a rel="noopener"> unter #serlo, nur wenn das Front Matter serlo: { url, titel } setzt (src/_includes/kompetenz.njk). Kein iframe, kein Vorschaubild, keine Anfrage vor dem Klick; pruefeSerloLinks (lib/pruefungen.js) bricht den Build bei anderen Adressen ab.

Seite → YouTube

<iframe src="https://www.youtube-nocookie.com/embed/<id>?autoplay=1">

Entsteht erst nach Klick oder bei gesetztem Merker (src/kern/js/video.js:12-15).

Autor:in → GitHub

git über HTTPS, gh

Feature-Branch, PR, Merge in lernapps/lernapps.github.io.

GitHub Actions → Paketquellen

npm ci; git clone + Gradle

Eleventy exakt nach package-lock.json; docToolchain am festen Commit, zwischengespeichert per actions/cache.

GitHub Actions → GitHub Pages

actions/upload-pages-artifact, actions/deploy-pages

Siehe Verteilungssicht.