Skip to content

v0.11.0

Choose a tag to compare

@github-actions github-actions released this 15 Jun 21:47
· 13 commits to master since this release

[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)