--- name: kalina-ci description: Use when a PDF, page or slide must carry the KALINA corporate identity. One CSS, one CLI, one source. metadata: version: "1.3.1" stand: "2026-11-02" --- # KALINA CI — Corporate Identity für Dokumente und Seiten Diese Skill-Datei ist der Einstiegspunkt in die KALINA CI. Alles, was nach KALINA aussehen soll — PDF, Bericht, Angebot, Folie, Landingpage — nimmt **diese** Dateien, nicht selbst erfundene Farben und nicht ein nachgebautes Logo. **Die CI ist versioniert.** Änderungen laufen über das Repository (Issue → Branch → PR), nicht ad hoc in einem Projekt. Siehe `docs/aenderungen.md`. ## Was hier liegt | Pfad | Rolle | |---|---| | `css/kalina-ci.css` | Satzvorlage: `@page` A4, Kopfleiste, Tabellen, Plakette, Fußlinie | | `templates/report.html` | Mehrseitiger Bericht (Deckblatt, Abschnitte, Tabellen) | | `templates/page.html` | Einzelne Seite / Handout | | `templates/bild-mit-prompt.html` | Generiertes Bild mit Prompt als Dokument | | `assets/kalina-mark.svg` | Marke (Kreis + K + Beeren), schriftfrei, überall einsetzbar | | `assets/favicon/kalina-favicon.svg` | Favicon-Fassung: K ohne Beeren, weil Beeren bei 16 px zu Matsch werden | | `assets/favicon/kalina-{16,32,48,180,192,512}.png`, `kalina.ico` | fertige Raster, gezeichnet statt gerendert (siehe Regel unten) | | `assets/kalina-wordmark.svg` | Wortmarke — nur verwenden, wo DejaVu Sans liegt | | `assets/kalina-logo-combined.svg` | Marke + Wortmarke | | `assets/favicon/` | 16 / 32 / 180 / 512 px, gerendert aus der Marke | | `scripts/stamp_existing_pdf.py` | Fremd-PDF stempeln (Deckblatt, Fußzeile, optional Kopfb and) | | `tools/kalina-pdf` | CLI: bauen, stempeln, prüfen | | `tokens.json` | Farben, Schriften, Geometrie, Zonen — maschinenlesbar | ## Drei Wege, ein Ergebnis ```bash # 1. Neues Dokument: Vorlage kopieren, «Platzhalter» füllen, bauen cp templates/report.html bericht.html tools/kalina-pdf build bericht.html --stamp --titel "Angebot 2026-17" # 2. Fremdes PDF (Anhang, Behördenpost, Kundenpdf) mit CI versehen tools/kalina-pdf stamp eingang.pdf -o eingang-kalina.pdf --titel "Rechnung 4711" # 3. Nur prüfen: Seiten, Füllgrad je Seite, Seite 1 als PNG tools/kalina-pdf check bericht.pdf --raster raster/ ``` `build` kopiert fehlendes `kalina-ci.css` neben die HTML-Datei, weil weasyprint Stylesheets relativ zur HTML-Datei auflöst. `stamp` lässt das Original unangetastet und schreibt immer eine neue Datei. `check` hat **zwei** Schwellen: `--min-fill` (Standard 0,10) bricht mit Exit 1 ab, weil darunter eine Fast-Leerseite steht — ein Umbruchfehler, kein Inhalt. `--ziel` (0,55) wird nur berichtet: dichter Bericht mit Tabellen und Zeichnungen erreicht das, reiner Fließtext selten. Seite 1 gilt als Deckblatt und wird berichtet, nicht bewertet (`--kein-deckblatt-bonus` schaltet das ab) — ein Deckblatt ist absichtlich dünn. ## Autor und Impressum (verbindlich) **Autor ist immer Kalina** — nicht der ausführende Agent, nicht „KI", nicht Mathias. Grund (Mathias, 23.10.2026): das Kalina-System ist der durchführende Part. Gilt ausdrücklich auch für **Entwürfe**. - **Jede Seite** trägt das **Impressum im Fußband**: Marke, `KALINA · «Dokumenttitel» · Stand …`, Zeile „Erstellt durch das Kalina-System · «Auftrag/Projekt · Ticket»" und **`© «JJJJ» kalina.si`**. Mathias, 23.10.2026: „Alle durchstempeln – es benötigt keine eigene Seite." Keine separate Impressumsseite. Die Vorlagen `report.html`, `page.html`, `bild-mit-prompt.html` tragen das bereits — Platzhalter füllen, nicht löschen. - **Decks:** Autor auf der Titelfolie, auf der Schlussfolie genügt Marke + `© «JJJJ» kalina.si` in einer Zeile. - **HTML:** `` und dieselbe Fußzeile. - **Commit-Autor:** `Kalina `. - **Prüfung vor Auslieferung:** `kalina.si` per Textsuche **auf jeder Seite** nachweisen und das Fußband mindestens einmal als Raster ansehen — Marke sichtbar, Copyright vollständig. Ein Impressum, das allein auf einer leeren Seite landet, ist ein Umbruchfehler: kompakt ins Fußband, nicht als eigener Abschnitt mit `break-inside: avoid`. ## Bestehende PDFs nachstempeln Alte Artefakte tragen oft `ai.m-m.bio` im Fuß und einen Agentennamen als Verfasser. **Nicht aus dem HTML neu bauen:** lokal läuft WeasyPrint 69, die Originale entstanden mit 62.3, und die Dokumentordner haben eigene CSS-Kopien — derselbe Quelltext ergab 155 Wörter weniger und verlagerte Tabellen (gemessen an `buchungsportale-…-v1.pdf`, Seite 5: 157 → 55 Wörter). 1. `scripts/stamp_existing_pdf.py --ohne-deckblatt` setzt Fußlinie, Marke und `KALINA · © kalina.si` auf **jede** Seite, ohne das Layout anzufassen. 2. Das Fußband wird vorher in der **gemessenen** Seitenfarbe gefüllt (häufigste Farbe im Streifen) — sonst steht auf Ink-Seiten ein weißer Balken über dem alten Fuß. 3. Verfasserzelle redigieren (pymupdf `add_redact_annot`), aber nur in Zeilen, die Agentenname **und** „CORP 1" tragen; inhaltliche Nennungen im Fließtext bleiben stehen. 4. Prüfen: Seitenzahl alt = neu, `kalina.si` auf jeder Seite, kein Agentenname mehr, letzte Seite als Raster ansehen. Das Stempel-PDF wächst (~30–40 kB je Seite durch den matplotlib-Bett). Beim Ersetzen in Nextcloud die **Größe** vergleichen, nicht den HTTP-Status; `nc-put.py "" --overwrite` nutzt `nc_webdav_write_file` über MCP (ohne `--overwrite` schlägt das Ersetzen fail-closed fehl). ## Vision lokal (verbindlich) Bildprüfung läuft **lokal auf dem ROG**, nie in der Cloud — gleiches Ergebnis, keine Token-Kosten (Mathias, 23.10.2026). - Modelle am Router `http://192.168.188.187:8100/v1`: `rog-vision` (Gemma4-12B, multimodal), `rog-agent` (Qwen2.5-VL-7B), `rog-ocr` (GLM-OCR für Text im Bild). - Hermes: `auxiliary.vision.model=rog-vision`, `provider=kalinarouter-auto`. Prüfen mit `hermes config get auxiliary.vision`; ändern mit `hermes config set`, nicht per Datei-Edit. - **Nicht `auto` für Bilder**, solange `ollama-cloud` im Auto-Pfad vision-fähig ist — ein belegtes ROG kann sonst still in die Cloud ausweichen. - **Stichprobe statt Bilderlawine:** drei Seiten visuell, den Rest geometrisch (Pixel-Hash, `getBoundingClientRect`, PyMuPDF-Rects). Gemessen: 43 Einzelaufrufe für ein 13-Seiten-PDF kosteten 10 von 30 erlaubten Run-Minuten. ## Regeln, die aus Fehlern entstanden sind - **Marke ja, Wortmarke vorsichtig.** Die Marke (Kreis + K + Beeren) ist schriftfrei und skaliert beliebig. Die Wortmarken-SVG setzt ihre Buchstaben absolut (x = 10/80/150/212/242/319) und ist auf DejaVu Sans Bold vermessen — in einer fremden Schrift stoßen L, i und N zusammen. In Dokumenten und Webseiten die Wortmarke deshalb **als Text** setzen: `KAL` + rotes `i` + `NA`. - **Auf helle Fläche Ink, auf Ink-Fläche Bone.** Bone auf Bone ist unsichtbar; im gerasterten PDF stand dann nur das rote i. - **Wortmarke nicht unter `s ≈ 0.2`.** Darunter ist der i-Schaft ~2 pt lang und der Beeren-Cluster kleiner als 2 pt. In Kopfzeilen `s = 0.24`. - **Marke im Band nie größer als das Band.** 44 mm Marke in 12 mm Band ragt heraus und liegt auf dem fremden Titel. - **Nach jedem Bau die erste Seite rastern und ansehen**, nicht auf Sichtbarkeit schließen: `tools/kalina-pdf check x.pdf --raster raster/`. - **`break-inside: avoid` nur für kurze Abschnitte.** Bei Berichten mit Abschnitten länger als eine Seite erzwingt die Vorlage einen Seitenanfang je Abschnitt und hinterlässt fast leere Vorderseiten (gemessen: 14 Seiten, eine bei 11,6 %; nach Aufhebung 10 Seiten ohne Seite unter 89 %). Im eigenen `