Files
Kalina 78d4ed333c feat(shell): Ptyxis fuer Ubuntu 26 und Wayland einrichten
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).
2026-11-02 19:22:46 +01:00

188 lines
11 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
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.