v0.11.0
[0.11.0] - 2026-06-15
Bug Fixes
- Disable kuml-asciidoc extension in Antora pipeline (handbook)- Use
url: .for Antora content source (handbook)- Move Antora playbook to repo root (handbook)
Documentation
- Publish to docs.kuml.dev via GitHub Pages (handbook)- Link to kuml.dev website and docs.kuml.dev handbook (readme)
Features
- Add Project block to handbook nav with kuml.dev + GitHub (handbook)
Other
- Squashed commit of the following:
commit aa63f1d65e2ae5a80e67b2ab3d03de00ba803996
Author: Irakli Betchvaia betschwa@web.de
Date: Mon Jun 15 06:53:34 2026 +0200
fix(renderer): SEQ-Fragment-Frame asymmetrisch — Nachbar-Nachrichten nicht mehr verschluckt
Die V3.0.x-Erstiteration hat `FRAGMENT_PADDING` von 8 auf 24 erhöht, um den
horizontalen Atemraum für Guard-Labels zu schaffen. Das war richtig in H,
aber es hat AUCH die vertikale Geometrie geändert: Frame-Top zog sich 24 px
über `(minSeq - 0.5)`-Pfeil-Mittelpunkt hinaus, Frame-Bottom 24 px darunter.
Symptom im Sample "Place Order — API Submit":
- POST /orders (Sequenz 2, direkt vor dem Fragment) saß in der ALT-Box
- confirmation (Sequenz 7, direkt nach dem Fragment) auch
- 400 Bad Request stand zu nah am unteren Rahmenrand und wurde von der
Frame-Linie angeschnitten
Eigentliche Ursache: Die ursprüngliche Symmetrische-Padding-Formel
`(minSeq - 0.5) * ROW - V` / `(maxSeq + 0.5) * ROW + V` war geometrisch
falsch — auch mit V = 8 (vor V3.0.x). Im SysML-2-Test-Sample fiel das nicht
auf, weil dort KEINE Folge-Nachrichten ums Fragment lagen.
**Asymmetrische Geometrie**, weil Nachrichten-Labels 4 px ÜBER der Pfeillinie
sitzen (Baseline) und mit Ascent 11 + Descent 3 ein Label-Hintergrund-Band
von `arrow_y - 15` bis `arrow_y - 1` bilden. Der "freie Korridor" zwischen
zwei Pfeilen ist deshalb NICHT mittig zwischen den Pfeilen, sondern:
prev_label_bottom = arrow_n - 1 (Label-Descent)
next_label_top = arrow_(n+1) - 15 (Label-Ascent)
Korridor-Breite = 18 px
Korridor-Mitte = arrow_n + 8
Für die Frame-Kanten:
- TOP: Mitte des oberen Korridors bei `arrow_minSeq - 24` → `FRAGMENT_TOP_OUTSET = 24`
- BOTTOM: Mitte des unteren Korridors bei `arrow_maxSeq + 8` → `FRAGMENT_BOTTOM_OUTSET = 8`
Beide Konstanten exportiert als private `const val`, neue Formel im UML- und
SysML-2-Renderer:
// UML — Pfeil-Y bei `headBottom + seq * ROW`
frameY = headBottom + minSeq * ROW - FRAGMENT_TOP_OUTSET
frameBottom = headBottom + maxSeq * ROW + FRAGMENT_BOTTOM_OUTSET
// SysML-2 — Pfeil-Y bei `headBottom + (seqNo + 1) * ROW`
frameY = headBottom + (minStartSeqNo + 1) * ROW - FRAGMENT_TOP_OUTSET
frameBottom = headBottom + (maxEndSeqNo + 1) * ROW + FRAGMENT_BOTTOM_OUTSET
H-Padding (24 px) und der Canvas-Padding-Override im KumlSvgRenderer (28 px)
bleiben unverändert — die Rechts-Clipping-Korrektur aus dem vorigen Commit
hängt nicht von der V-Geometrie ab.
`./gradlew check` grün (618 Tasks). Visuelle Verifikation: POST /orders +
confirmation jetzt klar AUSSERHALB der ALT-Box, 400 Bad Request mittig in
der [invalid]-Region. SysML-2-Test-Sample `combined-fragment-alt-two-operands`
ebenfalls verifiziert — keine Regression in der ursprünglich-getesteten
Konfiguration.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
commit 6cb94e4fbda4de4051833b8f63bbae29f156ee25
Author: Irakli Betchvaia betschwa@web.de
Date: Mon Jun 15 06:31:03 2026 +0200
fix(renderer): SEQ-Frame nicht mehr von Canvas geclippt — Padding-Override
Die zwei vorherigen Commits haben `FRAGMENT_PADDING` von 8 auf 24 px erhöht,
damit der Frame links Atemraum für die Guard-Labels schafft. Symmetrisch
ragt der Frame jetzt aber auch 24 px rechts über die rechteste Lifeline
hinaus — und das Default-Canvas-Padding (`SvgRenderOptions.paddingPx = 16`)
reicht dafür nicht. Symptom: ALT-Box rechts in der SVG-`viewBox` abgeschnitten
(8 px Überstand am Beispiel `Place Order — API Submit`: Frame-Right-Edge bei
canvas.width + 56, viewBox-Edge bei canvas.width + 32).
Fix in beiden SEQ-Render-Pfaden (`renderUmlSequence` für UML und
`toSvg(SeqDiagram, …)` für SysML 2): wenn die Interaktion Combined Fragments
enthält, wird `options.paddingPx` auf `max(default, FRAGMENT_PADDING + 4)`
hochgesetzt — also 28 px. Das wirkt sowohl im Lifeline-Shift (Nodes wandern
um zusätzliche 12 px nach rechts) als auch in der Canvas-Größe in
`SvgDocument.render` (Breite + 24 px), weil beide `options.paddingPx` lesen.
Diagramme ohne Fragments bleiben bei 16 px Padding — kein unnötiges Bloat.
Padding-Mathematik:
frame_right = maxLifelineX_shifted + FRAGMENT_PADDING
= canvas.width + padding + 24
viewBox_right = canvas.width + 2 * padding
frame_right ≤ viewBox_right ⟺ padding ≥ FRAGMENT_PADDING
Mit `+4` Sicherheitsmarge (Stroke-Width / Anti-Aliasing) → 28 px.
Konstanten-Quellen: `UML_SEQ_FRAGMENT_PADDING` aus dem UmlSequenceSvg-Commit
und `SYSML2_SEQ_FRAGMENT_PADDING` aus dem Sysml2SequenceSvg-Commit. Doppelte
Wertfestlegung bewusst — die zwei Renderer sind unabhängig voneinander
versionierbar; ein gemeinsamer Konstanten-File hätte die Architektur-
Divergenz aus dem Sysml2SequenceSvg-Header-Kommentar nivelliert.
`./gradlew check` grün (618 Tasks). Visuelle Verifikation per `kuml render`
am Vault-Beispiel: ALT-Box rahmt jetzt symmetrisch um alle Lifelines, kein
Clipping rechts.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
commit 31fe37bcff9e9efa77956104a455e6950b2f86bd
Author: Irakli Betchvaia betschwa@web.de
Date: Mon Jun 15 06:30:38 2026 +0200
fix(renderer): SysML-2-Sequence-Frame — Guard-Labels nicht mehr von Lifeline abgeschnitten
Spiegelt den UML-Fix auf die parallele SysML-2-Seite. Die beiden Sequence-
Renderer sind seit V2.0.x bewusst getrennt (siehe `Sysml2SequenceSvg.kt`-
Header-Kommentar zur Architektur-Divergenz), tragen aber dieselbe Frame-
Geometrie und damit dieselben Defekte:
1. **Guard-Labels durch erste Lifeline geclippt.** Sample
`combined-fragment-alt-two-operands.png` zeigte `[credentials valid]` und
`[credentials invalid]` durch die dashed Zeit-Achse von Lifeline `a`
zerschnitten. Fix identisch zum UML-Renderer: Guard auf `frameX + 4`,
`tagY + tagH + 14`, `FRAGMENT_PADDING` von 8 auf 24.
2. **Labels von dashed Linien zerschnitten.** Neuer Helper
`drawSeqLabelWithWhiteBackground()` mit derselben Höhen-Heuristik
(`BODY_TEXT_ASCENT = 11`, `BODY_TEXT_DESCENT = 3`). Angewendet auf
Message-Labels, Self-Call-Labels, Guard-Labels und die `messageLabel`-
Komponente der `«create»` / `«destroy»` Lifecycle-Nachrichten. Die
Stereotype-Marker selbst (`«create»` / `«destroy»`) bleiben ohne
Hintergrund — sie sitzen 16 px über der Baseline, weit über der
Pfeillinie, also kein Konflikt.
3. **`SYSML2_SEQ_FRAGMENT_PADDING` als `internal const` exportiert.**
Vorbereitung für den Canvas-Padding-Override im Folge-Commit.
Sample-Output-Tests `SEQ renders alt fragment with two operands separated by
dashed line` etc. grün. Deterministischer Byte-Identitäts-Test (`combined
fragment + execution spec render byte-identically`) grün.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
commit 378ec9085e9f9cc3c5f7d71e039c6e34295a03fb
Author: Irakli Betchvaia betschwa@web.de
Date: Mon Jun 15 06:30:16 2026 +0200
fix(renderer): UML-Sequence-Frame — Guard-Labels nicht mehr von Lifeline abgeschnitten
Drei eng verflochtene Defekte in `UmlSequenceSvg`:
1. **Guard-Labels durch erste Lifeline geclippt.** `[valid]` / `[invalid]`
saßen rechts neben dem ALT-Pentagon bei `tagX + 50 + 6 = minLifelineX + 48`,
während die dashed Zeit-Achse der linkesten Lifeline bei `minLifelineX + 70`
(Lifeline-Width / 2) verläuft. Die Achse schnitt mitten durch die Bracket-
Texte.
Fix: Guard-Position auf `frameX + 4` (linker Frame-Rand), `tagY + tagH + 14`
(unter dem ALT-Pentagon statt rechts daneben). `FRAGMENT_PADDING` von 8 px
auf 24 px erhöht — der Frame ragt jetzt 24 px links über die linkeste
Lifeline hinaus, in diesem Atemraum sitzt der Guard.
2. **Nachrichten-Labels von gestrichelten Linien zerschnitten.** Lifeline-
Verticals und Operand-Separatoren kreuzten durch das Innere der Glyphen.
Symptom: `400 Bad Request` saß exakt auf der Separator-Linie zwischen
`[valid]`- und `[invalid]`-Operand.
Fix: neuer Helper `drawLabelWithWhiteBackground()` zeichnet einen weißen
`<rect>` hinter dem Text. Höhen-Heuristik (`BODY_TEXT_ASCENT = 11`,
`BODY_TEXT_DESCENT = 3`) so dimensioniert, dass der Hintergrund die
Glyphen abdeckt, aber knapp ÜBER der Baseline endet — der 4 px unterhalb
der Baseline gezeichnete Pfeilschaft bleibt durchgezogen. Anwendung auf
Message-Labels, Self-Call-Labels und Guard-Labels.
3. **`UML_SEQ_FRAGMENT_PADDING` als `internal const` exportiert.** Vorbereitung
für den Canvas-Padding-Override im zentralen Renderer (Folge-Commit).
`./gradlew check` grün (618 Tasks). Visuelle Regression am Beispiel
`Place Order — API Submit` aus dem Vault verifiziert.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>- Renderer & layout overhaul — SEQ, STM, Activity, Component, Package, C4 (v0.11.0)