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:

  1. intern/kunden/<slug>.md — Frontmatter (name, status, industry, contracts, projects, contact_main, since) + Stack-Sektion + Pain-Points-Sektion + Historie
  2. Falls existent: intern/kunden/<slug>-*-konzept.md (Konzept-File mit Hebeln/Heatmap, z.B. Beer-Konzept)
  3. Verlinkte intern/projekte/<slug>-*/_index.md
  4. 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 + Skeleton
  • assets/firma/customer-diagrams/_schema/sections.json — vier feste Sektionen
  • assets/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 mit label aus sections.json, fontSize: 28, strokeColor: "#1e1e1e", an (section.x, section.y)
  • Plus ein zweites text mit subtitle, fontSize: 14, strokeColor: "#6b675a", leicht darunter

Komponenten pro Sektion:

SektionWas hier rein gehoert
stackAktuell 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.
datenflussTouchpoints (Web, WhatsApp, Telefon, Email) als touchpoint — links. Pfeile nach rechts zu Voit-Agents. Ganz rechts: Business-Outcomes (Termin, Angebot, Rechnung) als outcome.
voit_schichtKonkret welche Voit-Agents/Workflows/MCPs/Lambdas drueber liegen. Diese Sektion zeigt unsere Wertschoepfung.
statusReine Text-Elemente. Format: ‘Phase:’, ‘Naechster Schritt:’, ‘Letztes Update:’, ‘Risiken:‘. Siehe _schema/README.md ‘Status-Sektion — spezielles Layout’.

Layout-Regeln:

  • Komponenten innerhalb der Bounds (section.x bis section.x + section.width) und section.y + 60 (Reserve fuer Header) bis section.y + section.height
  • groupIds pro Sektion: ["stack"], ["datenfluss"], ["voit_schicht"], ["status"]
  • Pro Komponente: Shape-Element (rectangle/ellipse/diamond) PLUS separates text-Element mit dem Label. Text-Element bekommt gleiche groupIds wie Shape
  • Pfeile (arrow) mit points: [[0,0], [dx,dy]] relativ zu x/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.json erweitern + _schema/README.md updaten. Nicht hier inline-erweitern.
  • Wenn das Layout (4 Sektionen) sich aendert: sections.json updaten + Plan-File docs/plans/2026-05-19-001-... updaten.
  • Bei neuen Kunden: Skill aufrufen mit <slug> — kein Manuelles Anlegen noetig.