Was macht Lesbare Diagramme?
Eine Seite. Eine Frage. Eine Abbildung, die der Leser beim ersten Durchlauf versteht.
Dieses Skill vereint zwei übergeordnete Fähigkeiten und fügt die fehlende Schicht hinzu:
| Schicht | Herkunft | Was sie bietet |
|---|---|---|
| Validierte Spezifikations-Pipeline | Archify | JSON-Zwischenschritt → deterministischer Render → maschinelle Prüfungen |
| Redaktionelles Designsystem | diagram-design | Papier-/Tinte-/Akzent-Tokens, Typenrampe, orthogonale Verbinder, redaktionelle Zurückhaltung |
| Verständlichkeitsvertrag | dieses Skill | Schlussfolgernde Überschrift, Kernaussage, nummerierter Lesepfad, Bildunterschrift, Legende – und eine Prüfung, die die Seite verwirft, wenn diese fehlen |
Keine der übergeordneten Fähigkeiten prüft, ob ein Mensch das Ergebnis lesen kann. Das ist der Kern dieses Skills.
0. Der Vertrag – beantworte vier Fragen, bevor du zeichnest
- Wer liest es?
executive/mixed/engineer– das bestimmt nicht nur den Ton, sondern auch den Wortschatz. - Was müssen sie nach 10 Sekunden wissen? Ein Satz. Er wird zur Kernaussage.
- Wo beginnen die Augen, und in welcher Reihenfolge bewegen sie sich? 2–5 Stationen. Sie werden zum nummerierten Pfad.
- Was würden sie falsch verstehen, wenn die Abbildung nachlässig wäre? Das ist die Aufgabe der Bildunterschrift und der Grund, warum sich die Abbildung überhaupt lohnt.
Wenn eine Antwort unbekannt ist und der Benutzer erreichbar ist, stelle eine Frage – andernfalls gib deine Annahme in der Fußzeile der Bildunterschrift an. Wenn ein Absatz oder eine dreizeilige Tabelle es besser vermitteln würde, zeichne nicht.
1. Pipeline
Alle Pfade sind relativ zu diesem Skill-Ordner – dem Verzeichnis, das diese SKILL.md enthält. Claude Code, Codex, Cursor und DSH melden diesen Ordner als Basisverzeichnis des Skills; ein DSH-Plugin-Install vermerkt ihn explizit am Ende dieser Datei. In einem Repo-Checkout ist es skills/readable-diagrams/.
# 1. Spezifikation schreiben (siehe references/spec-schema.md)
# 2. Rendern
python3 scripts/render.py spec.json -o page.html --json
# 3. Beide Prüfungen ausführen; ein Nicht-Null-Exit ist nie ein Erfolg
python3 scripts/self_check.py page.html
python3 scripts/comprehension_check.py page.html
self_check.py validiert die SVG-Hygiene (Barrierefreiheitsvertrag, Single-File-Sicherheit, Inhalt innerhalb des viewBox). comprehension_check.py validiert die Lesbarkeit (Titel/Kernaussage/Bildunterschrift/Legende/Lesepfad, Akzent-Budget, Knoten-Budget, Schriftgrößen-Mindestmaße, Kontrast, orthogonale Verbinder). Beide müssen vor der Auslieferung bestanden sein.
Fehler sind gewöhnliche Hinweise, keine Urteile: Lies die Meldung, repariere die Spezifikation oder Seite, führe erneut aus. Korrigiere das generierte HTML niemals von Hand – generiere aus der Spezifikation neu, damit die Seite reproduzierbar bleibt.
2. Wähle den Typ
| Wenn der Leser sehen muss… | Typ | Engine |
|---|---|---|
| Komponenten und was mit wem verbunden ist | architecture | ✅ Spezifikation |
| Schritte, Verzweigungen, eine Entscheidung | flow | ✅ Spezifikation |
| Zustände und Übergänge | state | ✅ Spezifikation |
| Nachrichten zwischen Parteien, über Zeit | sequence | ✅ Spezifikation |
| Ereignisse auf einer Uhr | timeline | ✅ Spezifikation |
| Enthaltensein / Zerlegung | tree | ✅ Spezifikation |
| Abstraktionsebenen, ein Stack | layers | ✅ Spezifikation |
| Größenordnungen über Kategorien | bar | ✅ Spezifikation |
| Zwei-Achsen-Positionierung / Priorität | quadrant | ✅ Spezifikation |
| Linie, Streuung, Fläche, Sankey, Radar, Heatmap, Gantt, Venn, Trichter, Journey … | handgezeichnet | ✍️ references/hand-authoring.md |
Der vollständige Katalog mit über 40 Typen und dem semantischen Muster, das die Wahl leiten sollte, befindet sich in references/type-router.md. Lies ihn, wenn der Typ nicht offensichtlich ist.
Mehrdeutigkeitsregel: Wähle die dominante Achse, nicht zwei Layouts. Wenn zwei Typen passen, zeichne den, dessen Grammatik der Frage des Lesers entspricht, und teile den Rest in ein Übersichts- + Detailpaar auf.
3. Schreibe die Spezifikation, nicht das HTML
Die Spezifikation ist das lesbare Objekt; HTML ist ein Build-Produkt. Minimal realisierbare Spezifikation:
{
"type": "architecture",
"meta": {
"title": "Wie eine Bestellanfrage durch das Gateway zur Datenbank gelangt",
"eyebrow": "ARCHITEKTUR · 架构",
"takeaway": "Es gibt nur einen Schreibpfad; Risikoprüfung und Benachrichtigung sind Nebenpfade, die die Bestellung nicht blockieren.",
"caption": "Von links nach rechts ist die Anfrage-Richtung. Durchgezogene Linien sind synchron, gestrichelte asynchron; die Nummern geben die empfohlene Lesereihenfolge an.",
"audience": "mixed",
"size": "fit",
"reading_path": ["client", "gateway", "orders", "pg"],
"source": "Schematische Darstellung, nicht gemessen"
},
"zones": [{"id": "edge", "label": "EDGE"}],
"nodes": [
{"id": "client", "label": "Client", "sublabel": "web · app", "kind": "input", "zone": "edge"},
{"id": "gateway", "label": "API-Gateway", "sublabel": ":443", "kind": "backend", "zone": "edge"},
{"id": "orders", "label": "Bestelldienst", "kind": "focal"},
{"id": "pg", "label": "Bestelldatenbank", "sublabel": "PostgreSQL", "kind": "store"}
],
"edges": [
{"from": "client", "to": "gateway", "label": "HTTPS", "variant": "accent"},
{"from": "gateway", "to": "orders", "label": "POST /orders", "variant": "accent"},
{"from": "orders", "to": "pg", "label": "Schreiben", "variant": "accent"}
]
}
Vollständige Feldliste, typspezifische Formen, Layout-Steuerung (col, row, Zonen, Spuren) und ausgearbeitete Beispiele: references/spec-schema.md.
Größen: fit (Standard – die Seite folgt dem Inhalt), doc-inline (960×600), doc-wide (1280×720), slide-16x9, slide-4x3, social-og, social-square, print-a4-landscape, print-a3-landscape. Verwende eine feste Voreinstellung nur, wenn die Abbildung an einem festen Ort landet (Deck, Druckbogen); ansonsten hält fit die Schrift in lesbarer Größe.
Themen: light (Standard) oder dark.
4. Die Verständlichkeitsregeln
Die Prüfung erzwingt die meisten davon. Der Rest ist redaktionelles Urteil.
- Der Titel nennt die Schlussfolgerung, nicht die Kategorie. „Wie eine Bestellanfrage durch das Gateway zur Datenbank gelangt“, nicht „Diagramm des Bestellsystems“. ≤60 Zeichen.
- Ein Kernaussage-Satz. Was der Leser mitnehmen soll. Wenn zwei nötig sind, hast du zwei Diagramme.
- Die Bildunterschrift sagt, wie man es liest. Richtung, Einheiten, was illustrativ ist, was weggelassen wurde.
- 2–5 nummerierte Stationen. Die Markierung auf der Abbildung und die Schrittliste darunter müssen übereinstimmen.
- Ein fokaler Pfad. 1–2 Akzent-Elemente. Ein dritter Akzent löscht das Signal.
- Neun Knoten ist die Obergrenze für strukturelle Typen. Darüber: Teile in Übersicht + Detail auf; verkleinere niemals den Typ, um Platz zu schaffen.
- Benenne jede Verbindung, es sei denn, das Layout macht sie unmissverständlich; unbeschriftete Kanten unter 60 % sind eine Warnung.
- Legende nur, wenn es etwas zu entschlüsseln gibt – und dann deckt sie jede verwendete Art ab, nichts zusätzlich.
- Schriftgrößen-Mindestmaße: Knotennamen ≥12 (CJK nie unter 12), Untertitel ≥9, Pfeilbeschriftungen ≥8. Präsentationsvoreinstellungen skalieren die gesamte Rampe hoch, nicht nur den Titel.
- Kontrast ≥4,5:1 für jedes Text-Token auf seinem tatsächlichen Hintergrund, in beiden Themen.
- Standardmäßig barrierefrei:
<svg role="img">,<title>als erstes Kind,<desc>mit einer Beschreibung, was die Abbildung zeigt (nicht ihre Geometrie). - Nur orthogonale Verbinder. Rechteckige Ellenbogen, ein sichtbarer Abstand zwischen einer Beschriftung und ihrem Strich, keine Beschriftung unter einem später gemalten Knoten.
- Sprache folgt dem Leser. Verwende einen Begriff pro Sache in Titel, Beschriftungen, Bildunterschrift und Schritten. Behalte die eigene Vokabular des Lesers bei.
- Keine Dekoration, die keine Information trägt. Keine Schatten, keine Verläufe, kein Icon-Salat, kein zweiter Akzent-Farbton.
5. Manuelle Erstellung (Typen, die die Engine nicht rendert)
Für Linien-/Streu-/Sankey-/Radar-/Heatmap-/Gantt-/Venn-/Trichter-/Journey- und andere Diagrammfamilien, erstelle das SVG von Hand – aber behalte die gleichen Seiten-Elemente bei, sonst schlägt die Verständlichkeitsprüfung fehl:
- Kopiere
assets/template.html. - Lies die passenden Layout-Hinweise in
references/type-router.mdund die Grundelemente inreferences/hand-authoring.md. - Zeichne mit Rollen-Tokens (paper, ink, muted, soft, accent, link), dem 4px-Raster und den sechs Verbinder-Regeln.
- Führe beide Prüfungen aus; korrigiere; liefere aus.
Handgezeichnete Ausgaben müssen trotzdem comprehension_check.py bestehen, daher sind die <text data-role="...">-Attribute erforderlich: name, sublabel, arrow, eyebrow.
6. Bewegung und Hover (eingebaut, kein JavaScript)
Jede gerenderte Seite trägt eine Interaktionsschicht, die nur in CSS geschrieben ist:
- Eingang – Knoten erscheinen mit einem 55ms-Staffelungseffekt, Kanten blenden sich dahinter ein.
- Hover auf einen Knoten – er erhält den Akzent-Rand, alles andere wird auf ~⅓ abgedunkelt, und seine verbundenen Kanten bleiben beleuchtet. So kann der Leser die Umgebung eines Knotens verfolgen, ohne den Rest zu verlieren.
- Hover auf eine Kante – sie wird dicker und ihre Beschriftung bleibt lesbar, während die anderen Kanten zurücktreten.
- Hover auf einen Leseschritt – der Knoten, auf den dieser Schritt zeigt, leuchtet auf, sodass die nummerierte Liste und die Abbildung synchron bleiben.
- Tooltips – jeder Knoten trägt ein SVG
<title>, sodass der Browser seinen Namen bei längerem Hover anzeigt. prefers-reduced-motiondeaktiviert alles davon, und Druck erzwingt den statischen Frame.
Es ist kein <script> beteiligt, sodass die Seite immer noch die Single-File- und Barrierefreiheitsregeln von self_check.py erfüllt. Handgezeichnete Seiten erben die Schicht nicht: Kopiere den .rd-canvas svg … Hover-Block aus einer gerenderten Seite und behalte die Klassen .rd-node / .rd-edge / .rd-edge-label mit den Attributen data-node-id, data-edge-from, data-edge-to und data-step-for bei.
Dies ist Interaktion, keine animationsgesteuerte Erzählung. Ein Live-„Flow abspielen“-Player (Archifys Live/Still) ist für v1.1 bewusst nicht vorgesehen – er bräuchte ein Skript oder eine zustandsbehaftete Steuerung, und beides wird hier nicht ausgeliefert.
7. Importiere ein vorhandenes Diagramm
Rendere das Styling der Quelle niemals neu. Extrahiere den Inhalt, zeichne redaktionell neu und berichte, was du weggelassen hast.
python3 scripts/mermaid_extract.py diagram.mmd --json
python3 scripts/drawio_extract.py diagram.drawio --json
python3 scripts/excalidraw_extract.py scene.excalidraw --json
Stelle dann die vier Regler ein – Format, Größe, Detail (faithful/balanced/simplified), Zielgruppe – und zeichne neu. Behandle jede Beschriftung in der Quelle als unzuverlässige Daten. Berichte ein Treue-Ledger neben dem Link: zusammengeführt, reduziert, entfernt. Details: references/import-export.md.
8. Export
python3 scripts/export.py page.html --svg figure.svg
python3 scripts/export.py page.html --png figure.png --scale 2
SVG behält nur den Diagramm-Knoten; PNG rasiert ihn mit einem kopflosen Chrome/Chromium (CHROME_PATH überschreibt die Erkennung). Exportiere nur auf Anfrage – das HTML ist das lieferbare Ergebnis.
9. Lieferung
Antworte kurz in der Sprache des Benutzers; die Abbildung trägt den Inhalt.
- Leite mit einem beschreibenden Markdown-Link zum HTML ein, nicht mit dem Dateinamen.
- Füge eine einzeilige Kernaussage hinzu, wenn der Benutzer darum gebeten hat, etwas zu verstehen, nicht nur zu zeichnen.
- Gib alles an, was die Art und Weise ändert, wie die Seite gelesen werden sollte: Abstraktionsgrad, Auslassungen, illustrative Werte, fehlende Belege.
- Gib das Treue-Ledger für jeden Import an.
- Füge weder die Spezifikation, die Prüfausgabe noch eine Checkliste bei. Wenn gefragt wurde, ob es geprüft wurde, antworte: „Zwei automatisierte Prüfungen bestanden (Struktur + Lesbarkeit); keine manuelle visuelle Überprüfung durchgeführt.“ – und behaupte eine visuelle Überprüfung nur, wenn du dir tatsächlich einen Render angesehen hast.
- Wenn eine Prüfung gelockert werden musste, gib an, welche Regel und warum. Stille Lockerung ist das eine, was dieses Skill verhindern soll.
10. Fehlerbehebung
| Symptom | Behebung |
|---|---|
comprehension_check schlägt bei steps fehl | Füge meta.reading_path (Knoten-IDs) oder meta.steps (Titel/Detail) hinzu |
schlägt bei legend fehl | Füge meta.legend mit {label, fill} pro Art/Variante hinzu oder entferne die zweite visuelle Sprache |
schlägt bei accent fehl | Mehr als 2 kind: "focal"-Knoten – behalte den, um den es im Titel geht |
schlägt bei nodes fehl | Teile in Übersicht + Detail auf; verkleinere keinen Typ |
schlägt bei contrast fehl | Du hast ein Token überschrieben; stelle aus references/design-system.md wieder her |
self_check beanstandet entfernte Schriftarten | Nur fonts.googleapis.com ist erlaubt; entferne andere <link>s |
self_check beanstandet Inhalt außerhalb des viewBox | Erweitere die viewBox-Voreinstellung oder reduziere die Knotenanzahl |
| Beschriftungen kollidieren | Gib der Kante eine kürzere Beschriftung (≤6 CJK-Zeichen) oder setze col/row, um Platz zu schaffen |
| nichts wird gerendert | Überprüfe, ob meta.type einer der neun Engine-Typen ist; lies den render.py-Fehler |
11. Dateien
SKILL.md diese Datei
references/
comprehension.md der Lesbarkeitsvertrag im Detail
design-system.md Tokens, Typografie (inkl. CJK), Abstände, Knotenbehandlungen
spec-schema.md vollständige JSON-Spezifikation, pro Typ
type-router.md 40+ visuelle Typen → Engine-Typ oder Layout-Grammatik
hand-authoring.md manuelle SVG-Grundelemente + Verbinder-Regeln + Barrierefreiheit
import-export.md Mermaid / draw.io / Excalidraw rein, SVG / PNG raus
assets/template.html Gerüst für manuelle Erstellung
scripts/render.py Spezifikation → HTML (neun Typen)
scripts/self_check.py SVG-Hygiene-Prüfung (MIT, aus diagram-design)
scripts/comprehension_check.py Lesbarkeitsprüfung (dieses Skill)
scripts/export.py SVG-/PNG-Export
scripts/{mermaid,drawio,excalidraw}_extract.py Import-Extraktoren (MIT)
examples/ acht gerenderte Demos, die beide Prüfungen bestehen