customer-diagram
Generiert eine standardisierte Architektur-Karte pro Kunde. Vier feste Sektionen, festes Komponenten-Vokabular, einheitliches Layout — Kunden werden side-by-side vergleichbar.
Hand-drawn-Look: das gerenderte SVG ist clean (kein roughjs). Wenn du den hand-drawn-Excalidraw-Stil willst, oeffne das .excalidraw-File via Drag-and-Drop in app.excalidraw.com.
Ablauf
Schritt 1 — Slug validieren
Input: slug (Argument vom Trigger)
Pruefen:
- slug matched /^[a-z0-9-]+$/
- intern/kunden/<slug>.md existiert
Wenn nein: Abbruch mit Hinweis "Kunde '<slug>' nicht in intern/kunden/ gefunden. Verfuegbare Slugs: <ls-Ausgabe>"
Schritt 2 — Kunden-Kontext lesen
Lies in dieser Reihenfolge:
intern/kunden/<slug>.md— Frontmatter (name,status,industry,contracts,projects,contact_main,since) + Stack-Sektion + Pain-Points-Sektion + Historie- Falls existent:
intern/kunden/<slug>-*-konzept.md(Konzept-File mit Hebeln/Heatmap, z.B. Beer-Konzept) - Verlinkte
intern/projekte/<slug>-*/_index.md - Bei NDA-Kunden (z.B. Becker, Friseur-im-Sueden): Diskretions-Linie der Kunden-Datei beachten. Diagramm bleibt
visibility: internal— generische Komponenten-Namen ok, keine Kunden-Internalia ausplaudern.
Schritt 3 — Schema laden
Lies:
assets/firma/customer-diagrams/_schema/components.json— Komponenten-Typen + Skeletonassets/firma/customer-diagrams/_schema/sections.json— vier feste Sektionenassets/firma/customer-diagrams/_schema/README.md— Element-Beispiele + Generierungs-Regeln
Schritt 4 — Excalidraw-JSON generieren
Erzeuge ein vollstaendiges Excalidraw-JSON nach den Schema-Regeln. Konkret:
Sektions-Header (4x):
- Pro Sektion ein
text-Element mitlabelaus sections.json,fontSize: 28,strokeColor: "#1e1e1e", an(section.x, section.y) - Plus ein zweites
textmitsubtitle,fontSize: 14,strokeColor: "#6b675a", leicht darunter
Komponenten pro Sektion:
| Sektion | Was hier rein gehoert |
|---|---|
stack | Aktuell beim Kunden eingesetzte Tools/Software (lexoffice, sevdesk, gsuite, Cal.com, MF Dach, etc.) als external_api. Eigene MCPs/Repos als mcp_server. Eigene Lambdas/Cron als lambda_cron. Datenbanken als database. |
datenfluss | Touchpoints (Web, WhatsApp, Telefon, Email) als touchpoint — links. Pfeile nach rechts zu Voit-Agents. Ganz rechts: Business-Outcomes (Termin, Angebot, Rechnung) als outcome. |
voit_schicht | Konkret welche Voit-Agents/Workflows/MCPs/Lambdas drueber liegen. Diese Sektion zeigt unsere Wertschoepfung. |
status | Reine Text-Elemente. Format: ‘Phase:’, ‘Naechster Schritt:’, ‘Letztes Update:’, ‘Risiken:‘. Siehe _schema/README.md ‘Status-Sektion — spezielles Layout’. |
Layout-Regeln:
- Komponenten innerhalb der Bounds (
section.xbissection.x + section.width) undsection.y + 60(Reserve fuer Header) bissection.y + section.height groupIdspro Sektion:["stack"],["datenfluss"],["voit_schicht"],["status"]- Pro Komponente: Shape-Element (rectangle/ellipse/diamond) PLUS separates
text-Element mit dem Label. Text-Element bekommt gleichegroupIdswie Shape - Pfeile (
arrow) mitpoints: [[0,0], [dx,dy]]relativ zux/y.endArrowhead: "arrow" - Auto-Layout naive: Komponenten in der Sektion oben-links beginnen, alle 120px nach unten oder 220px nach rechts ein neues Element
Wenn der Kunde mehr als ~8 Komponenten pro Sektion hat: clustere zu sinnvollen Gruppen, zeige nur die wichtigsten. Detail-Listen bleiben im Markdown.
Output: schreibe das vollstaendige JSON nach assets/firma/customer-diagrams/<slug>.excalidraw. Pretty-printed mit 2-Space-Indent.
Schritt 5 — SVG + HTML rendern
cd /Users/marvinkuehlmann/source/agentic-ventures
node intern/capabilities/skills/customer-diagram/render.mjs <slug>Erwartete Ausgabe:
Rendered:
/.../<slug>.svg
/.../<slug>.html
Bei Fehler: Stderr-Output zeigt Exit-Code + Hinweis. Haeufige Faelle:
- Exit 1: ungueltiger Slug (nur a-z, 0-9, ’-’)
- Exit 2: Source-File nicht gefunden — meist weil Schritt 4 nicht geschrieben hat
- Exit 3: Source-File ist kein valides Excalidraw-JSON — Output von Schritt 4 pruefen
- Exit 4: Render fehlgeschlagen — Stderr-Output zeigt Detail
Schritt 6 — Marvin den HTML-Pfad zeigen
Berichte als Markdown-Link den Marvin anklicken kann:
Diagramm fertig: [<slug>.html](assets/firma/customer-diagrams/<slug>.html)
Source (in app.excalidraw.com editierbar): [<slug>.excalidraw](assets/firma/customer-diagrams/<slug>.excalidraw)
Plus 1-2 Saetze was im Diagramm steht (welche Komponenten, welcher Status), damit Marvin sofort weiss ob das passt.
Wann der Skill ausgeloest wird
Marvin tippt eine dieser Trigger-Phrasen:
- „diagramm fuer beer”
- „architektur-karte fuer becker”
- „kunden-diagramm friseur-im-sueden”
- „visualisier den X-stack”
- „update das kunden-diagramm fuer Y”
- „beer-architektur regenerieren”
Bei „regenerieren”/„update”: vorhandene .excalidraw-Datei laden, nicht von scratch ueberschreiben — nur die Sektionen die sich aendern aktualisieren. Marvin kann manuelle Edits im Excalidraw-File gemacht haben die nicht verlorengehen sollen.
Edge Cases
- Kunde existiert nicht (z.B. typo): Klare Fehlermeldung mit Liste verfuegbarer Slugs aus
intern/kunden/. - Kunde hat sparse Markdown (z.B. Becker mit NDA-Schutz, wenig Detail in Public-File): generischer Skeleton mit „tbd”-Platzhaltern statt Crash. Frontmatter-Felder reichen fuer Header + Status-Sektion.
- Konzept-File mit vielen Hebeln (z.B. Beer mit 19 Hebeln): clustern, nicht alle 19 als Voit-Schicht-Komponenten zeigen. Max 6-8 Komponenten pro Sektion.
- Manuelle Edits im .excalidraw sollen erhalten bleiben: bei „update X” inkrementell arbeiten, nicht ueberschreiben (siehe Trigger oben).
- NDA-Beachtung: bei Becker + Friseur-im-Sueden CLAUDE.md Rule 22 — keine internen Details in der HTML, keine Drittpartei-Sichtbarkeit anvisieren. Diagramm bleibt im Vault.
Verwandte Files
- Schema-Source-of-Truth: README
- HTML-Template:
assets/firma/customer-diagrams/_template/customer.html - Render-Script:
intern/capabilities/skills/customer-diagram/render.mjs - Plan:
docs/plans/2026-05-19-001-feat-customer-diagram-system-plan.md - Pattern-Map (warum Excalidraw und nicht Mermaid): technische-zeichnungen-mcp-landschaft
Pflege
- Wenn neue Komponenten-Typen gebraucht werden:
components.jsonerweitern +_schema/README.mdupdaten. Nicht hier inline-erweitern. - Wenn das Layout (4 Sektionen) sich aendert:
sections.jsonupdaten + Plan-Filedocs/plans/2026-05-19-001-...updaten. - Bei neuen Kunden: Skill aufrufen mit
<slug>— kein Manuelles Anlegen noetig.