◆ Missionslog ERFASST · 6. Mai 2026 STATUS · ÜBERTRAGUNG OFFEN
Missionslog

Feinschliff-Architektur: eine DSL, drei Outputs

Wie Feinschliff aus einer DSL-Grammatik drei Output-Modi rendert: Decks, Architektur-Diagramme und SVG-Infografiken, alle gegen dieselben Brand-Tokens.

feinschliffclaude-codedesign-systemspowerpointarchitecture
Quellcode ↗

Feinschliff-Architektur-Pipeline: Design Brief und DSL fließen durch Parser, Expander und Render Dispatcher zu drei Outputs (PPTX, PNG, SVG), mit Brand Bridge als Token-Quelle

Eine DSL, drei Outputs. Die Pipeline ist linear, der Render-Dispatcher gabelt am Ende. Wenn das System richtig gebaut ist, fließen Brand-Tokens durch jeden Output-Modus, ohne dass der Renderer für jede Modalität Sonderfälle bekommt. Genau diesen Punkt legt Feinschliff offen.

Vier Komponenten. Parser liest .slide.dsl-Dateien und erzeugt DSL-Nodes. Expander macht Slot-Interpolation und löst zusammengesetzte Blöcke auf: Excalidraw-Diagramm-Aufrufe und SVG-Infografik-Blöcke werden hier in vorab gerenderte PNGs umgewandelt. Brand Bridge lädt tokens.json aus dem aktiven Brand-Pack und folgt der Vererbungskette, damit Child-Overrides sauber auf Parent-Brand mergen. Render Dispatcher gabelt am Ende nach Output-Modus: python-pptx für 1920×1080 .pptx, pure-Python (~150ms, Playwright als Fallback) für PNG-Diagramme, brand-aufgelöstes SVG für Infografiken.

Die wirkliche Probe ist nicht die Gabel selbst. Sie ist die Frage: trägt derselbe Code-Pfad vier Marken mit widersprüchlichen Chrome-Regeln? Vier Referenz-Packs spannen den Test-Raum auf. Sie bringen Regeln mit, die nicht gleichzeitig wahr sein können:

  • Pack A: scharfe Ecken überall, keine Schatten, 700/300-Gewichte mit explizit fehlender 500.
  • Pack B: vollständig abgerundete Pillen (radius=9999) für CTAs, schwere OOXML-Schatten, dunkler Canvas.
  • Pack C: ebenfalls scharfe Ecken, aber niemals fettes Display-Gewicht (500 als Maximum), negatives Buchstaben-Tracking.
  • Pack D: maßgeschneidertes Chrome: Tabellenkachel als Hero, OOXML-Gradient, helle Reset-Footer-Zone auf dunklem Canvas.

Wenn der Renderer das alles über dieselben Primitive (add_button, add_chip, add_column(as_card=True)) ohne Sonderfälle abbildet, trägt die Architektur. Sonst war Brand-Pluggable Marketing. Konkret: radius.btn = 0 macht in Pack A scharfe Rechtecke, radius.btn = 9999 macht in Pack B vollrunde Pillen. Gleicher Aufruf, vier Marken, vier Decks.

Die öffentliche Brand-Galerie ist die Probe: 12 Brand-Packs gegen 30+ Layouts, klickbar im Browser. Anspruch steht nicht im README. Anspruch steht in den Pixeln. Falsifizierbar, ohne Setup.

Eine Atlas-Schicht erdet die Planung vor dem Rendern. 39 kuratierte Folien aus 6 Domänen liegen als Korpus im Repo, jeweils mit Thumbnail und Metadaten zu Genre, Headline-Muster und nächstliegendem Feinschliff-Layout. Phase 1 ist das Korpus. Phase 2 ist Retrieval direkt in /deck und kommt später. Erst wenn das System konkrete Muster ziehen kann, statt nur aus Modellprior zu raten, ist die Planungs-Lücke geschlossen.

Eigene Marke einbinden? Eine DESIGN.md im Google-offenen Spec-Format plus ein Bake-Aufruf:

mkdir -p feinschliff/brands/myco
$EDITOR feinschliff/brands/myco/DESIGN.md
uv run python scripts/bake_palette.py from-design-md --brand myco --base feinschliff
FEINSCHLIFF_BRAND=myco /deck "..."

Als Nächstes kommt Drop-in-Support für jede DESIGN.md aus awesome-design-md: Stripe, Vercel, Linear, Notion. Alles, was offen liegt. Brand-Pluggable hängt an einem Code-Pfad. Der Code-Pfad steht. Jetzt geht die Tür für mehr Marken auf.