Der vollständige Entscheidungsbaum von Phase 0: Source-Detection, HARD BLOCK, Zielgruppen-Routing und sämtliche Edge Cases mit komplettem Pseudocode
Die Source-Detection ist der allererste Entscheidungsknoten im Orchestrator. Bevor irgendein Analyse-Token ausgegeben wird, muss der Skill wissen, wo der Quellcode liegt. Es gibt genau drei Pfade — und jeden Edge Case, der dabei auftreten kann.
Der vollständige Entscheidungsbaum:
Pfad 1 — Git-URL: Wenn die Eingabe mit „http“ oder „git@“ beginnt, wird ein Git-Clone in ein temporäres Verzeichnis ausgeführt. GitHub-URLs ohne „.git“-Suffix bekommen diesen automatisch angehängt. URLs mit „/tree/“ oder „/blob/“ (die auf ein Unterverzeichnis oder eine Datei im Browser zeigen) werden auf die Repo-Root zurückgeführt. Schlägt der Clone fehl, wird zwischen Auth-Fehler (privates Repo, Token fehlt) und 404 (Repo existiert nicht) unterschieden.
Pfad 2 — Dateisystem-Pfad: Absolute Pfade (/...), relative Pfade (./...) und Home-Pfade (~/) werden aufgelöst. Kritischer Edge Case: Wenn der Pfad auf eine Datei statt ein Verzeichnis zeigt, wird nicht still fehlgeschlagen, sondern eine klare Fehlermeldung ausgegeben, die das übergeordnete Verzeichnis vorschlägt. Leere Verzeichnisse erzeugen ebenfalls einen Fehler.
Pfad 3 — CWD: Die Eingabe „.“, eine leere Eingabe, oder Formulierungen wie „dieses Projekt“ nutzen das aktuelle Arbeitsverzeichnis. Auch hier muss das Verzeichnis mindestens eine lesbare Datei enthalten.
Kein Match: Wenn keines der drei Muster zutrifft, wird eine Fehlermeldung mit allen drei akzeptierten Formaten angezeigt. Es gibt keinen Fallback und kein Raten.
Nach erfolgreicher Source-Detection steht der Orchestrator vor einem unumgehbaren Gate: Zwei Pflichtfragen müssen beantwortet werden, bevor Phase 1 starten darf. Es gibt keine Abkürzung, keinen Default und kein „Später“.
HARD BLOCK — Die zwei Pflichtfragen
Frage 1: Sprache(n)?
Akzeptierte Antworten: „de“, „en“, „beide“/„both“, „Deutsch“, „English“, „Deutsch und Englisch“. Bestimmt die Dateinamens-Suffixe (_de.html, _en.html) und die Inhaltssprache.
Frage 2: Zielgruppen?
Akzeptierte Antworten: Explizite Nennung von einer oder mehreren der drei Standard-Audiences (Entwickler, Anwender, Entscheider) oder benutzerdefinierte Audiences. „alle“ und „für jeden“ sind nicht akzeptiert — zu vage.
Warum kein „einfach loslegen“?
Wenn der Skill raten würde („vermutlich Deutsch, vermutlich Entwickler“), könnte er einen kompletten Kurs mit 50+ Dateien generieren — nur um festzustellen, dass der User eigentlich Englisch für Entscheider wollte. Die zwei Fragen kosten 10 Sekunden. Eine falsche Annahme kostet Minuten an verschwendeter Generierung. Das Kosten-Nutzen-Verhältnis ist eindeutig.
Guard-Logic — Vollständiger Pseudocode:
Die Guard-Logik arbeitet so:
1. Der Orchestrator hat eine feste Liste von zwei Pflichtfragen. Jede Frage hat einen Prompt (DE + EN) und einen Validator.
2. Für jede Frage wird der User gefragt. Seine Antwort wird zuerst auf Bypass-Versuche geprüft: „leg los“, „just go“, „skip“, „egal“ und ähnliche werden erkannt und abgelehnt. Die Nachricht erklärt, warum die Frage nicht übersprungen werden kann.
3. Dann wird die Antwort validiert. Für Zielgruppen bedeutet das: „alle“ oder „für jeden“ ist zu vage und wird abgelehnt. Spezifische Namen (Entwickler, Anwender, Entscheider) oder Custom-Audiences werden akzeptiert.
4. Die Schleife wiederholt sich maximal 5-mal. Danach wird die Skill-Ausführung abgebrochen — lieber kein Ergebnis als ein falsches.
Kernregel: Es gibt keine Defaults. Keine Inferenz aus dem Kontext. Keine Heuristik. Der User muss explizit antworten.
Sobald die Pflichtfragen beantwortet sind, muss der Orchestrator aus den Antworten eine Pipeline-Konfiguration ableiten: Wer bekommt welche Dateien, mit welchen Suffixen, bis zu welcher Tiefe?
Suffix-Bestimmung — Reihenfolge entscheidet:
| Reihenfolge | Audience | Datei-Suffix | Beispiel L0 |
|---|---|---|---|
| 1. (Erste/Allgemeinste) | Allgemeinste Audience | Kein Suffix | index_de.html |
| 2. | Entwickler | _dev |
index_dev_de.html |
| 3. | Entscheider | _exec |
index_exec_de.html |
| 4. (Custom) | z.B. „DevOps Team“ | _devops-team |
index_devops-team_de.html |
Regel: Die allgemeinste Audience (typischerweise Anwender) bekommt keinen Suffix und wird damit zur Standard-Ansicht. Alle weiteren Audiences bekommen ein Suffix. Diese Reihenfolge ist: Anwender (kein Suffix) → Entwickler (_dev) → Entscheider (_exec) → Custom (_slug).
Routing-Tabelle — Ableitung:
Der Routing-Algorithmus erstellt eine Pipeline pro Audience-Sprach-Kombination:
1. Audiences werden nach Allgemeinheit sortiert. Die allgemeinste (typischerweise Anwender) kommt zuerst und bekommt keinen Suffix — ihre Dateien sind die „Standard“-Ansicht.
2. Jede weitere Audience bekommt ihren vordefinierten Suffix: _dev für Entwickler, _exec für Entscheider, ein abgeleiteter Slug für Custom-Audiences.
3. Für jede Audience werden so viele Pipelines wie Sprachen erstellt. Bei 2 Audiences und 2 Sprachen ergeben sich 4 Pipelines.
4. Jede Pipeline enthält: Audience-Name, Emoji, Suffix, Sprache, maximale Tiefe, HS-Schwellenwerte, Ausgabeverzeichnis und Dateinamens-Pattern. Damit hat der Pipeline-Agent alle Informationen, die er braucht.
Jeder Entscheidungsknoten in Phase 0 hat Fehlerzustände. Hier ist das vollständige Verzeichnis aller Edge Cases mit der jeweiligen Behandlungsstrategie.
| Edge Case | Erkennung | Behandlung |
|---|---|---|
| User ändert Audiences mid-generation | „Ändere Zielgruppen“ während Phase 3/4 läuft | Voller Neustart. Alle bereits generierten Dateien verwerfen. Phase 0 mit neuen Antworten komplett neu durchlaufen. Teilgenerierung ist inkonsistent. |
| Quellverzeichnis ist leer | count_readable_files() == 0 |
Sofortiger Fehler in Source-Detection. Klare Meldung: „Keine analysierbaren Dateien gefunden.“ Keine Analyse starten. |
| Pfad existiert nicht | !exists(resolved_path) |
Sofortiger Fehler. Pfad ausgeben, damit der User den Tippfehler erkennen kann. |
| Pfad zeigt auf eine Datei | is_file(resolved_path) |
Fehler mit Hinweis: „Bitte das übergeordnete Verzeichnis angeben.“ Der Skill analysiert Projekte, nicht einzelne Dateien. |
| GitHub gibt 404 zurück | git clone exit code 128 + „not found“ |
Unterscheidung: Repository existiert nicht vs. Repository ist privat. Beide Fälle produzieren 128, aber die stderr-Meldung unterscheidet sich. |
| Privates Repo, kein Token | git clone exit code 128 + „auth“ |
Fehler mit klarem Hinweis auf fehlendes Token. Kein stiller Abbruch. |
| Monorepo ohne klaren Entry-Point | Kein README, kein offensichtlicher Entry-Point in Root | Phase 1 scant Unterverzeichnisse und behandelt jedes Paket als eigenständigen Teilbaum. Nicht Fehler, aber Warnung an User. |
| User gibt „alle“ als Audience an | validate_audiences() rejektiert vage Antworten |
Re-Prompt: „Bitte nenne die Zielgruppen konkret.“ Kein Default auf alle drei Standard-Audiences. |
| Netzwerkfehler während Clone | git clone timeout / DNS failure |
Fehler mit Netzwerk-Hinweis. Vorschlag: Lokalen Pfad als Alternative verwenden, falls Repo bereits geklont ist. |
| User antwortet 5x nicht korrekt | HARD BLOCK attempt > max_attempts |
Skill-Abbruch. Besser kein Ergebnis als ein falsches. Fehlermeldung erklärt warum. |
Audience-Wechsel mid-generation: Wenn der User während der Generierung die Zielgruppen ändern will, gibt es keine Möglichkeit, die bereits generierten Dateien „umzubiegen“. Die Helpfulness-Scores sind audience-spezifisch, die Curricula basieren auf diesen Scores, und die Cross-Links verweisen auf audience-spezifische Varianten. Ein Teilupdate würde zu inkonsistenten Ergebnissen führen. Deshalb: voller Neustart.
GitHub-Fehler-Diagnose: Ein fehlgeschlagener Clone (Exit-Code 128) kann zwei Ursachen haben: Das Repository existiert nicht, oder es ist privat und der Zugriff fehlt. Der Skill analysiert die stderr-Ausgabe, um zwischen beiden Fällen zu unterscheiden, und gibt eine spezifische Fehlermeldung aus. Bei Auth-Fehlern wird als Alternative der lokale Pfad vorgeschlagen.
User sagt: „Mach einen Kurs aus ./my-project für alle“. Ist der HARD BLOCK erfüllt?