IZG KISSD — Keep It Simple Stupid, Dude
Ein Skill ist erst fertig, wenn ihn ein schwaches Fremdmodell ohne Vorwissen
fehlerfrei und wiederholbar abarbeitet. Dieser Skill misst genau das: wie viel
Handlungsspielraum bleibt dem Agenten, und wo wird daraus ein Fehler?
Prueft fremde Skills, Prompts, Runbooks, CLAUDE.md-Abschnitte. Er aendert nichts
von sich aus — er liefert Befund plus Korrekturvorschlag, das Umschreiben ist ein
eigener Auftrag.
Die Rubrik
| ID |
Prinzip |
Fehlerbild beim schwachen Modell |
| K1 |
Kein Spielraum |
"den passenden Pfad waehlen" → Modell erfindet einen |
| K2 |
Kopiervorlage statt Prosa |
Befehl beschrieben statt gezeigt → falsche Flags |
| K3 |
Absolute Anker |
./script.sh → laeuft im falschen Verzeichnis |
| K4 |
Verifikation pro Schritt |
kein Soll-Zustand → Fehler faellt drei Schritte spaeter auf |
| K5 |
Fehlerpfad benannt |
Schritt scheitert → Modell macht stumm weiter |
| K6 |
Reihenfolge erzwungen |
unnummeriert → Modell springt oder ueberspringt |
| K7 |
Voraussetzungen deklariert |
Tool fehlt → Abbruch mitten im Ablauf |
| K8 |
Token-sparsam |
cat/find ohne Filter, aufgeblaehte SKILL.md |
| K9 |
Idempotent |
zweiter Lauf bricht ab oder dupliziert |
| K10 |
Metadaten korrekt |
Frontmatter kaputt → Skill wird nie gefunden |
Merksatz: Jeder Schritt hat genau eine richtige Ausfuehrung, einen sichtbaren
Soll-Zustand und eine benannte Reaktion auf Fehlschlag.
Ablauf
Ziel klaeren. Fehlt der Pfad, den Nutzer fragen — nicht raten.
Lint starten (deckt K1-K10 mechanisch ab):
KISSD=~/.claude/skills/izg-kissd
ZIEL=.claude/skills/beispiel-skill # vom Nutzer genannter Pfad
python3 "$KISSD/scripts/kissd_lint.py" "$ZIEL" --json
ZIEL ist eine SKILL.md, ein Skill-Ordner, ein Verzeichnisbaum oder eine
Markdown-Datei. Ohne --json kommt eine Markdown-Tabelle. --strict setzt
Exit-Code 1 auch bei warn.
Zieldatei lesen und die vier Punkte pruefen, die kein Regex entscheidet:
- Selbsttest-Frage: Ein Modell ohne diese Session, ohne dieses Repo, ohne
Rueckfragemoeglichkeit — kommt es durch? Jede Stelle, an der die Antwort
"kommt drauf an" lautet, ist ein Befund.
- Entscheidungspunkte: Jede Verzweigung braucht eine pruefbare Bedingung
("wenn Exit-Code 1"), keine Einschaetzung ("wenn es Probleme gibt").
- Vorwissen: Wird ein Skill, ein Alias, eine Konvention vorausgesetzt, die
ein Fremdagent nicht hat? Dann braucht es einen Fallback im Dokument.
- Ergebnisform: Ist das Ausgabeformat festgelegt (Datei, Abschnitte,
Sortierung)? Freies Format heisst: nicht reproduzierbar, nicht diffbar.
Report schreiben (Format unten). Lint-Befunde und manuelle Befunde in eine
Tabelle, sortiert nach Severity, dann Check-ID, dann Zeile.
Fragen, ob die Vorschlaege eingebaut werden sollen. Erst auf Zusage editieren.
Report-Format
Fest, damit zwei Laeufe vergleichbar bleiben:
# KISSD-Report: <ziel>
KISS-Score <n>/100 — block: <n> | warn: <n> | info: <n>
## Befunde
| Check | Sev | Stelle | Befund | Vorschlag |
|---|---|---|---|---|
## Top-3-Korrekturen
1. <Befund> → <konkreter Ersatztext oder Codeblock>
Regeln fuer die Vorschlagsspalte:
- Jeder Befund braucht einen Vorschlag. Befund ohne Vorschlag wird gestrichen.
- Der Vorschlag ist Ersatztext, keine Absichtserklaerung: nicht "praeziser
formulieren", sondern der fertige Satz oder Codeblock.
- Top-3 nach Severity, dann nach Zahl der betroffenen Stellen.
Verifikation
Nach dem Lauf pruefen:
- Exit-Code 0 = keine
block-Befunde. Exit-Code 1 = mindestens einer, der
Report nennt ihn. Exit-Code 2 = Pfad existiert nicht.
- Jeder Befund im Report traegt Datei und Zeilennummer.
- Zweiter Lauf ueber denselben Stand liefert denselben Score.
Wenn etwas fehlschlaegt
| Symptom |
Ursache |
Massnahme |
| Exit-Code 2, "Pfad existiert nicht" |
Ziel falsch angegeben |
Nutzer nach dem Pfad fragen, nicht suchen |
| "keine SKILL.md gefunden" |
Verzeichnis ohne Skills |
Direkt auf die Markdown-Datei zeigen |
| Score 100, aber Skill fuehlt sich unsicher an |
Befund liegt in Schritt 3 |
Die vier manuellen Punkte durchgehen — Lint ersetzt sie nicht |
| Sehr viele K7-Befunde |
requires.json fehlt |
Eine requires.json anlegen, danach erneut pruefen |
Grenzen
Der Lint prueft Text, keine Wirkung. Ein Skill kann 100/100 erreichen und
trotzdem das Falsche tun — Korrektheit der Logik ist Aufgabe eines Reviews, nicht
dieses Skills. warn-Befunde sind Hinweise auf Spielraum, kein Urteil: in einem
bewusst explorativen Skill ist Spielraum gewollt. Das gehoert in den Report als
Einordnung, nicht als stille Unterdrueckung.
1---2name: izg-kissd3description: Prueft Skills und Workflows auf Idiotensicherheit — findet Stellen, an denen ein schwaches Modell abweichen kann, und liefert konkrete Korrekturvorschlaege. Use when ein Skill, ein Prompt oder ein Workflow reproduzierbar und fremdmodell-tauglich werden soll.4---56# IZG KISSD — Keep It Simple Stupid, Dude78Ein Skill ist erst fertig, wenn ihn ein schwaches Fremdmodell ohne Vorwissen9fehlerfrei und wiederholbar abarbeitet. Dieser Skill misst genau das: **wie viel10Handlungsspielraum bleibt dem Agenten, und wo wird daraus ein Fehler?**1112Prueft fremde Skills, Prompts, Runbooks, CLAUDE.md-Abschnitte. Er **aendert nichts**13von sich aus — er liefert Befund plus Korrekturvorschlag, das Umschreiben ist ein14eigener Auftrag.1516## Die Rubrik1718| ID | Prinzip | Fehlerbild beim schwachen Modell |19|----|---------|----------------------------------|20| K1 | **Kein Spielraum** | "den passenden Pfad waehlen" → Modell erfindet einen |21| K2 | **Kopiervorlage statt Prosa** | Befehl beschrieben statt gezeigt → falsche Flags |22| K3 | **Absolute Anker** | `./script.sh` → laeuft im falschen Verzeichnis |23| K4 | **Verifikation pro Schritt** | kein Soll-Zustand → Fehler faellt drei Schritte spaeter auf |24| K5 | **Fehlerpfad benannt** | Schritt scheitert → Modell macht stumm weiter |25| K6 | **Reihenfolge erzwungen** | unnummeriert → Modell springt oder ueberspringt |26| K7 | **Voraussetzungen deklariert** | Tool fehlt → Abbruch mitten im Ablauf |27| K8 | **Token-sparsam** | `cat`/`find` ohne Filter, aufgeblaehte SKILL.md |28| K9 | **Idempotent** | zweiter Lauf bricht ab oder dupliziert |29| K10 | **Metadaten korrekt** | Frontmatter kaputt → Skill wird nie gefunden |3031**Merksatz:** Jeder Schritt hat genau eine richtige Ausfuehrung, einen sichtbaren32Soll-Zustand und eine benannte Reaktion auf Fehlschlag.3334## Ablauf35361. Ziel klaeren. Fehlt der Pfad, den Nutzer fragen — nicht raten.37382. Lint starten (deckt K1-K10 mechanisch ab):3940```bash41KISSD=~/.claude/skills/izg-kissd42ZIEL=.claude/skills/beispiel-skill # vom Nutzer genannter Pfad43python3 "$KISSD/scripts/kissd_lint.py" "$ZIEL" --json44```4546`ZIEL` ist eine `SKILL.md`, ein Skill-Ordner, ein Verzeichnisbaum oder eine47Markdown-Datei. Ohne `--json` kommt eine Markdown-Tabelle. `--strict` setzt48Exit-Code 1 auch bei `warn`.49503. Zieldatei lesen und die vier Punkte pruefen, die kein Regex entscheidet:5152 - **Selbsttest-Frage:** Ein Modell ohne diese Session, ohne dieses Repo, ohne53 Rueckfragemoeglichkeit — kommt es durch? Jede Stelle, an der die Antwort54 "kommt drauf an" lautet, ist ein Befund.55 - **Entscheidungspunkte:** Jede Verzweigung braucht eine pruefbare Bedingung56 ("wenn Exit-Code 1"), keine Einschaetzung ("wenn es Probleme gibt").57 - **Vorwissen:** Wird ein Skill, ein Alias, eine Konvention vorausgesetzt, die58 ein Fremdagent nicht hat? Dann braucht es einen Fallback im Dokument.59 - **Ergebnisform:** Ist das Ausgabeformat festgelegt (Datei, Abschnitte,60 Sortierung)? Freies Format heisst: nicht reproduzierbar, nicht diffbar.61624. Report schreiben (Format unten). Lint-Befunde und manuelle Befunde in **eine**63 Tabelle, sortiert nach Severity, dann Check-ID, dann Zeile.64655. Fragen, ob die Vorschlaege eingebaut werden sollen. Erst auf Zusage editieren.6667## Report-Format6869Fest, damit zwei Laeufe vergleichbar bleiben:7071```markdown72# KISSD-Report: <ziel>7374KISS-Score <n>/100 — block: <n> | warn: <n> | info: <n>7576## Befunde7778| Check | Sev | Stelle | Befund | Vorschlag |79|---|---|---|---|---|8081## Top-3-Korrekturen82831. <Befund> → <konkreter Ersatztext oder Codeblock>84```8586Regeln fuer die Vorschlagsspalte:8788- Jeder Befund braucht einen Vorschlag. Befund ohne Vorschlag wird gestrichen.89- Der Vorschlag ist **Ersatztext**, keine Absichtserklaerung: nicht "praeziser90 formulieren", sondern der fertige Satz oder Codeblock.91- Top-3 nach Severity, dann nach Zahl der betroffenen Stellen.9293## Verifikation9495Nach dem Lauf pruefen:9697- Exit-Code 0 = keine `block`-Befunde. Exit-Code 1 = mindestens einer, der98 Report nennt ihn. Exit-Code 2 = Pfad existiert nicht.99- Jeder Befund im Report traegt Datei und Zeilennummer.100- Zweiter Lauf ueber denselben Stand liefert denselben Score.101102## Wenn etwas fehlschlaegt103104| Symptom | Ursache | Massnahme |105|---|---|---|106| Exit-Code 2, "Pfad existiert nicht" | Ziel falsch angegeben | Nutzer nach dem Pfad fragen, nicht suchen |107| "keine SKILL.md gefunden" | Verzeichnis ohne Skills | Direkt auf die Markdown-Datei zeigen |108| Score 100, aber Skill fuehlt sich unsicher an | Befund liegt in Schritt 3 | Die vier manuellen Punkte durchgehen — Lint ersetzt sie nicht |109| Sehr viele K7-Befunde | `requires.json` fehlt | Eine `requires.json` anlegen, danach erneut pruefen |110111## Grenzen112113Der Lint prueft Text, keine Wirkung. Ein Skill kann 100/100 erreichen und114trotzdem das Falsche tun — Korrektheit der Logik ist Aufgabe eines Reviews, nicht115dieses Skills. `warn`-Befunde sind Hinweise auf Spielraum, kein Urteil: in einem116bewusst explorativen Skill ist Spielraum gewollt. Das gehoert in den Report als117Einordnung, nicht als stille Unterdrueckung.