Ubuntu 26.04 bringt GNOME 50 und damit Ptyxis als Standard-Terminal (Wayland-nativ). install.sh legt die Palette als ~/.local/share/org.gnome.Ptyxis/palettes/KalinaCI.palette ab und haengt sie per gsettings (relocatable Schema org.gnome.Ptyxis.Profile) an jedes Profil; ohne Profil nennt es den Weg von Hand. Neue Vorlage shell/palettes/KalinaCI.palette, README-Abschnitt mit echtem Wayland-Screenshot (74,9 % Tinte, 11,9 % Titelbar, ANSI-Farben innerhalb 2/255).
188 lines
11 KiB
Markdown
188 lines
11 KiB
Markdown
---
|
||
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.2"
|
||
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:** `<meta name="author" content="Kalina">` und dieselbe Fußzeile.
|
||
- **Commit-Autor:** `Kalina <kalina@m-m.bio>`.
|
||
- **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 <in.pdf> <out.pdf> --ohne-deckblatt` setzt Fußlinie, Marke und
|
||
`KALINA · © <Jahr> 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 <datei> "<pfad>" --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 `<style>`:
|
||
`@media print { .abschnitt { break-inside: auto; } }`, `h2, h3 { break-after: avoid }`.
|
||
- **ImageMagick rendert die Marke ohne K.** `magick kalina-mark.svg -resize 32x32 x.png`
|
||
liefert einen dunklen Kreis mit rotem Punkt — die K-Striche fehlen still, weil der
|
||
MSVG-Renderer vererbte `stroke`-Attribute am `<g>` ignoriert. Wer die Marke rastert:
|
||
Attribute an jedes `<path>` schreiben und das Ergebnis **messen** (helle Pixel im
|
||
Kreis zählen), nicht ansehen; oder das Raster mit PIL direkt zeichnen (so entstand
|
||
`assets/favicon/kalina-*.png`) oder einen echten Renderer (librsvg, cairosvg) nutzen.
|
||
- **Favicons brauchen eine eigene Fassung.** Beeren mit r = 2,2 auf einer 240er viewBox
|
||
sind bei 16 px 0,15 px groß: matschig, aber sie verwischen den Kreis. Die Favicon-SVG
|
||
lässt den Cluster weg und verstärkt den Strich.
|
||
- **Füllgrad ohne Kopf- und Fußzone messen** — sonst zählt die Fußzeile als unterster
|
||
Block und jede Seite meldet dieselben ~105 %. `kalina-pdf check` macht das richtig.
|
||
- **Überschrift und lange Tabelle gehören zusammen.** Reißt eine 12-Zeilen-Tabelle
|
||
mit einer Zeile auf die Folgeseite, ist das ein Satzfehler: `break-before: page`
|
||
an die Überschrift oder Tabelle kürzen.
|
||
|
||
## Farben
|
||
|
||
Ink `#0B0F14` · Bone `#F5F5EF` · Kalina-Rot `#C1121F` · Steel `#3A4250` · Muted `#8A94A2`
|
||
|
||
Kalina-Rot trägt auf Ink nur 3,09:1 und ist **Grafik** (Marke, Cursor, Regel), nie Text.
|
||
Text auf Ink ist `#E0454F` (4,70:1). Dieselbe Regel gilt im CSS, im VS-Code-Theme und im
|
||
Shell-Prompt — wer sie bricht, bricht die Lesbarkeit, nicht den Geschmack.
|
||
|
||
## Shell und Terminal (seit 1.3.0)
|
||
|
||
Wer eine Maschine in die CI holen soll: nicht von Hand nachbauen, sondern
|
||
|
||
```bash
|
||
curl -fsSLo install.sh https://gitea.m-m.bio/mm/kalina-ci/raw/branch/main/shell/install.sh
|
||
bash install.sh --dry-run && bash install.sh
|
||
```
|
||
|
||
**zsh ist Pflicht** — der Prompt ist ein zsh-Modul. Das Skript installiert zsh bei Bedarf
|
||
selbst; kann es das nicht (kein Paketmanager, `sudo` ohne Passwort), bricht der Shell-Teil mit
|
||
Exit 1 ab und nennt den Befehl, statt einen wirkungslosen `~/.zshrc`-Eintrag zu hinterlassen.
|
||
Danach `exec zsh` oder neu einloggen, sonst greift die Login-Shell nicht.
|
||
|
||
Das Skript ist idempotent, sichert jede Datei und erkennt foot, ptyxis, qterminal,
|
||
xfce4-terminal sowie xterm. **Ubuntu 26** bringt GNOME 50 und damit **Ptyxis** als
|
||
Standard-Terminal (Wayland): Palette als
|
||
`~/.local/share/org.gnome.Ptyxis/palettes/KalinaCI.palette` ablegen und per
|
||
`gsettings set "org.gnome.Ptyxis.Profile:/org/gnome/Ptyxis/Profiles/<uuid>/" palette "KalinaCI"`
|
||
am Profil eintragen — die Datei allein genuegt nicht. Die Paletten sind gemessen, nicht geraten — die drei Fallen (qtermwidget6
|
||
kennt kein Benutzerverzeichnis, xfconf überstimmt `terminalrc`, foot will `[colors-dark]`)
|
||
stehen in `shell/README.md`.
|
||
|
||
## Wenn ein anderer Agent das Design macht
|
||
|
||
Werkzeuge und Agenten, die eine Seite bauen (Bildgeneratoren, externe Design-Dienste),
|
||
sehen diese Dateien nicht und erfinden sonst ein eigenes Logo — markenfremd und meist
|
||
als schweres Raster-PNG. Also die Marke **mitgeben**: SVG inline einbetten oder als
|
||
Datei beilegen, nie einen Fremdanbieter die Marke neu zeichnen lassen. Danach
|
||
nachsehen, dass das Ergebnis keine Bilder von fremden Hosts zieht.
|