Quelltextformatierung

Change-Id: I51c63959e75af9373625a52b74d1d31f727a67ed
diff --git a/src/main/java/eu/mulk/aendggner/aenderung/Aenderungsbefehl.java b/src/main/java/eu/mulk/aendggner/aenderung/Aenderungsbefehl.java
index 606383f..4117922 100644
--- a/src/main/java/eu/mulk/aendggner/aenderung/Aenderungsbefehl.java
+++ b/src/main/java/eu/mulk/aendggner/aenderung/Aenderungsbefehl.java
@@ -73,9 +73,9 @@
    * @param vorher {@code true} bei „Vor …“, {@code false} bei „Nach …“.
    * @param bezeichnung die Bezeichnung des neuen Elements (z.B. „28a“, „5a“); {@code null}, wenn
    *     der Befehl keine nennt (z.B. „folgender Satz“).
-   * @param anker bei „Vor den Wörtern „Aus dem Bereich Verkehr:“ wird folgender Absatz 5
-   *     eingefügt“ der Wortanker, der die Position innerhalb von {@code stelle} bestimmt;
-   *     {@code null}, wenn die Position wie üblich aus der Struktur folgt.
+   * @param anker bei „Vor den Wörtern „Aus dem Bereich Verkehr:“ wird folgender Absatz 5 eingefügt“
+   *     der Wortanker, der die Position innerhalb von {@code stelle} bestimmt; {@code null}, wenn
+   *     die Position wie üblich aus der Struktur folgt.
    */
   record StrukturEinfuegung(
       Stelle stelle,
diff --git a/src/main/java/eu/mulk/aendggner/aenderung/Stelle.java b/src/main/java/eu/mulk/aendggner/aenderung/Stelle.java
index 1c63a5f..69e6837 100644
--- a/src/main/java/eu/mulk/aendggner/aenderung/Stelle.java
+++ b/src/main/java/eu/mulk/aendggner/aenderung/Stelle.java
@@ -29,8 +29,8 @@
           Absatzbezeichnung {}
 
   /**
-   * „§ 5“, „§ 28a“, im bayerischen Landesrecht „Art. 5“ — die Normnummer ohne Sigel, dazu das
-   * Sigel selbst („§“ oder „Art.“).
+   * „§ 5“, „§ 28a“, im bayerischen Landesrecht „Art. 5“ — die Normnummer ohne Sigel, dazu das Sigel
+   * selbst („§“ oder „Art.“).
    */
   public record Paragraph(String nummer, String sigel) implements Komponente {
     public Paragraph(String nummer) {
diff --git a/src/main/java/eu/mulk/aendggner/aenderung/parse/ZitatExtraktor.java b/src/main/java/eu/mulk/aendggner/aenderung/parse/ZitatExtraktor.java
index d4df176..4b9d511 100644
--- a/src/main/java/eu/mulk/aendggner/aenderung/parse/ZitatExtraktor.java
+++ b/src/main/java/eu/mulk/aendggner/aenderung/parse/ZitatExtraktor.java
@@ -170,8 +170,8 @@
       Pattern.compile("^(?:\\d+[a-z]?\\.|[a-z]{1,3}\\))[ \\t]");
 
   /**
-   * Wahr, wenn das öffnende Anführungszeichen an Position {@code i} ein Fortführungszeichen ist:
-   * Es steht am Zeilenanfang innerhalb eines offenen Zitats und ihm folgt unmittelbar ein
+   * Wahr, wenn das öffnende Anführungszeichen an Position {@code i} ein Fortführungszeichen ist: Es
+   * steht am Zeilenanfang innerhalb eines offenen Zitats und ihm folgt unmittelbar ein
    * Aufzählungsmarker.
    */
   private static boolean istFortfuehrungszeichen(String text, int i) {
@@ -191,7 +191,8 @@
    * Stammgesetze zitieren ihre Normköpfe als „Art. N“, nicht als „Artikel N“ — zitierter Inhalt
    * läuft hier also nicht versehentlich auf.
    */
-  private static final Pattern ARTIKEL_GRENZE = Pattern.compile("^Artikel[ \\t]+\\d+[a-z]?[ \\t]*$");
+  private static final Pattern ARTIKEL_GRENZE =
+      Pattern.compile("^Artikel[ \\t]+\\d+[a-z]?[ \\t]*$");
 
   /** Wahr, wenn die bei {@code von} beginnende Zeile eine Artikel-Überschrift ist. */
   private static boolean beginntArtikelUeberschrift(String text, int von) {
diff --git a/src/main/java/eu/mulk/aendggner/anwendung/BefehlAnwender.java b/src/main/java/eu/mulk/aendggner/anwendung/BefehlAnwender.java
index d8e710c..b8540c5 100644
--- a/src/main/java/eu/mulk/aendggner/anwendung/BefehlAnwender.java
+++ b/src/main/java/eu/mulk/aendggner/anwendung/BefehlAnwender.java
@@ -2,14 +2,14 @@
 
 import eu.mulk.aendggner.aenderung.Aenderungsbefehl;
 import eu.mulk.aendggner.aenderung.Aenderungsbefehl.Anfuegung;
-import eu.mulk.aendggner.aenderung.Aenderungsbefehl.Ebene;
 import eu.mulk.aendggner.aenderung.Aenderungsbefehl.Aufhebung;
+import eu.mulk.aendggner.aenderung.Aenderungsbefehl.Ebene;
 import eu.mulk.aendggner.aenderung.Aenderungsbefehl.Ersetzung;
 import eu.mulk.aendggner.aenderung.Aenderungsbefehl.FussnotenAufhebung;
 import eu.mulk.aendggner.aenderung.Aenderungsbefehl.GliederungsUeberschriften;
-import eu.mulk.aendggner.aenderung.Aenderungsbefehl.SatznummerierungStreichung;
 import eu.mulk.aendggner.aenderung.Aenderungsbefehl.Neufassung;
 import eu.mulk.aendggner.aenderung.Aenderungsbefehl.Sammelbefehl;
+import eu.mulk.aendggner.aenderung.Aenderungsbefehl.SatznummerierungStreichung;
 import eu.mulk.aendggner.aenderung.Aenderungsbefehl.Streichung;
 import eu.mulk.aendggner.aenderung.Aenderungsbefehl.StrukturEinfuegung;
 import eu.mulk.aendggner.aenderung.Aenderungsbefehl.StrukturErsetzung;
@@ -298,7 +298,8 @@
   private static List<StrukturErsetzung> ersetzungen(Aenderungsbefehl befehl) {
     return switch (befehl) {
       case StrukturErsetzung e -> List.of(e);
-      case Sammelbefehl s -> s.teilbefehle().stream().flatMap(t -> ersetzungen(t).stream()).toList();
+      case Sammelbefehl s ->
+          s.teilbefehle().stream().flatMap(t -> ersetzungen(t).stream()).toList();
       default -> List.of();
     };
   }
@@ -374,8 +375,7 @@
     // Führende Eigenbezeichnung („Abschnitt 2 …“ oder „2. Abschnitt …“) aus dem Zitat entfernen.
     var label = Pattern.compile("^(\\d+[a-z]?\\.\\s+\\S+|\\S+\\s+\\d+[a-z]?)\\s+").matcher(titel);
     if (label.find()
-        && kanonischeBezeichnung(label.group(1))
-            .equals(kanonischeBezeichnung(alt.bezeichnung()))) {
+        && kanonischeBezeichnung(label.group(1)).equals(kanonischeBezeichnung(alt.bezeichnung()))) {
       titel = titel.substring(label.end()).strip();
     } else if (titel.startsWith(alt.bezeichnung())) {
       titel = titel.substring(alt.bezeichnung().length()).strip();
@@ -395,7 +395,9 @@
     return angewandt(befehl, alt.bezeichnung());
   }
 
-  /** „Der bisherige Abschnitt 2 wird zu Abschnitt 3.“ — Bezeichnung der Gliederungseinheit umsetzen. */
+  /**
+   * „Der bisherige Abschnitt 2 wird zu Abschnitt 3.“ — Bezeichnung der Gliederungseinheit umsetzen.
+   */
   private static AngewandteAenderung wendeGliederungUmnummerierungAn(
       List<Gliederung> gliederungen, Umnummerierung befehl) {
     int idx = findeGliederung(gliederungen, befehl.stelle().gliederungsPfad());
@@ -451,12 +453,12 @@
         if (idx < 0) {
           return manuell(
               befehl,
-              "Gliederungseinheit nicht gefunden: "
-                  + pfad.get(pfad.size() - 1).bezeichnung());
+              "Gliederungseinheit nicht gefunden: " + pfad.get(pfad.size() - 1).bezeichnung());
         }
         indizes.add(idx);
       }
-      var alte = indizes.stream().map(gliederungen::get).collect(java.util.stream.Collectors.toSet());
+      var alte =
+          indizes.stream().map(gliederungen::get).collect(java.util.stream.Collectors.toSet());
       int einfuegePos = java.util.Collections.min(indizes);
       indizes.sort(java.util.Comparator.reverseOrder());
       for (int idx : indizes) {
@@ -479,7 +481,9 @@
     }
     var anker = normen.get(aufloesung.normIndex());
     int gliederungsPos =
-        anker.gliederung() != null ? gliederungen.indexOf(anker.gliederung()) + 1 : gliederungen.size();
+        anker.gliederung() != null
+            ? gliederungen.indexOf(anker.gliederung()) + 1
+            : gliederungen.size();
     if (gliederungsPos == 0) {
       gliederungsPos = gliederungen.size();
     }
@@ -513,7 +517,8 @@
       gefunden = -1;
       for (int i = 0; i < gliederungen.size(); i++) {
         var g = gliederungen.get(i);
-        if (kanonischeBezeichnung(g.bezeichnung()).equals(kanonischeBezeichnung(einheit.bezeichnung()))
+        if (kanonischeBezeichnung(g.bezeichnung())
+                .equals(kanonischeBezeichnung(einheit.bezeichnung()))
             && (g.kennzahl() == null || g.kennzahl().startsWith(praefix))) {
           gefunden = i;
           break;
@@ -542,34 +547,39 @@
         normen,
         befehl,
         ohneFussnoten(
-        text -> {
-          if (befehl.amEnde()) {
-            var gestutzt = text.stripTrailing();
-            if (!gestutzt.endsWith(befehl.alt())) {
-              return TextErgebnis.fehler("Der Text endet nicht mit „" + befehl.alt() + "“.");
-            }
-            var rumpf = gestutzt.substring(0, gestutzt.length() - befehl.alt().length());
-            // Tritt an die Stelle des Satzzeichens ein Klammerzusatz („Der Punkt am Ende wird
-            // durch die Angabe „(Gesellschaftsdialog).“ ersetzt“), gehört davor ein Leerzeichen —
-            // so setzt es auch die amtliche Nachfassung.
-            var fuge =
-                befehl.neu().startsWith("(")
-                        && !rumpf.isEmpty()
-                        && Character.isLetterOrDigit(rumpf.charAt(rumpf.length() - 1))
-                    ? " "
-                    : "";
-            return TextErgebnis.ok(rumpf + fuge + befehl.neu());
-          }
-          int anzahl = zaehleVorkommen(text, befehl.alt());
-          if (anzahl == 0) {
-            return TextErgebnis.fehler("„" + befehl.alt() + "“ kommt im Zieltext nicht vor.");
-          }
-          if (anzahl > 1 && !befehl.jeweils()) {
-            return TextErgebnis.fehler(
-                "„" + befehl.alt() + "“ kommt " + anzahl + "-mal vor (ohne „jeweils“ mehrdeutig).");
-          }
-          return TextErgebnis.ok(text.replace(befehl.alt(), befehl.neu()));
-        }));
+            text -> {
+              if (befehl.amEnde()) {
+                var gestutzt = text.stripTrailing();
+                if (!gestutzt.endsWith(befehl.alt())) {
+                  return TextErgebnis.fehler("Der Text endet nicht mit „" + befehl.alt() + "“.");
+                }
+                var rumpf = gestutzt.substring(0, gestutzt.length() - befehl.alt().length());
+                // Tritt an die Stelle des Satzzeichens ein Klammerzusatz („Der Punkt am Ende wird
+                // durch die Angabe „(Gesellschaftsdialog).“ ersetzt“), gehört davor ein Leerzeichen
+                // —
+                // so setzt es auch die amtliche Nachfassung.
+                var fuge =
+                    befehl.neu().startsWith("(")
+                            && !rumpf.isEmpty()
+                            && Character.isLetterOrDigit(rumpf.charAt(rumpf.length() - 1))
+                        ? " "
+                        : "";
+                return TextErgebnis.ok(rumpf + fuge + befehl.neu());
+              }
+              int anzahl = zaehleVorkommen(text, befehl.alt());
+              if (anzahl == 0) {
+                return TextErgebnis.fehler("„" + befehl.alt() + "“ kommt im Zieltext nicht vor.");
+              }
+              if (anzahl > 1 && !befehl.jeweils()) {
+                return TextErgebnis.fehler(
+                    "„"
+                        + befehl.alt()
+                        + "“ kommt "
+                        + anzahl
+                        + "-mal vor (ohne „jeweils“ mehrdeutig).");
+              }
+              return TextErgebnis.ok(text.replace(befehl.alt(), befehl.neu()));
+            }));
   }
 
   private static AngewandteAenderung wendeStreichungAn(List<Norm> normen, Streichung befehl) {
@@ -577,19 +587,21 @@
         normen,
         befehl,
         ohneFussnoten(
-        text -> {
-          int anzahl = zaehleVorkommen(text, befehl.woerter());
-          if (anzahl == 0) {
-            return TextErgebnis.fehler("„" + befehl.woerter() + "“ kommt im Zieltext nicht vor.");
-          }
-          if (anzahl > 1) {
-            return TextErgebnis.fehler("„" + befehl.woerter() + "“ kommt " + anzahl + "-mal vor.");
-          }
-          return TextErgebnis.ok(
-              text.replace(befehl.woerter(), "")
-                  .replaceAll("  +", " ")
-                  .replaceAll(" ([,;.])", "$1"));
-        }));
+            text -> {
+              int anzahl = zaehleVorkommen(text, befehl.woerter());
+              if (anzahl == 0) {
+                return TextErgebnis.fehler(
+                    "„" + befehl.woerter() + "“ kommt im Zieltext nicht vor.");
+              }
+              if (anzahl > 1) {
+                return TextErgebnis.fehler(
+                    "„" + befehl.woerter() + "“ kommt " + anzahl + "-mal vor.");
+              }
+              return TextErgebnis.ok(
+                  text.replace(befehl.woerter(), "")
+                      .replaceAll("  +", " ")
+                      .replaceAll(" ([,;.])", "$1"));
+            }));
   }
 
   private static AngewandteAenderung wendeWoerterEinfuegungAn(
@@ -598,50 +610,57 @@
         normen,
         befehl,
         ohneFussnoten(
-        text ->
-            switch (befehl.anker()) {
-              case WortAnker.NachWoertern nach -> {
-                var pruefung = eindeutigeFundstelle(text, nach.woerter());
-                if (pruefung.fehler() != null) {
-                  yield TextErgebnis.fehler(pruefung.fehler());
-                }
-                int ende = pruefung.index() + nach.woerter().length();
-                yield TextErgebnis.ok(
-                    text.substring(0, ende) + fuge(befehl.woerter()) + befehl.woerter()
-                        + text.substring(ende));
-              }
-              case WortAnker.VorWoertern vor -> {
-                var pruefung = eindeutigeFundstelle(text, vor.woerter());
-                if (pruefung.fehler() != null) {
-                  yield TextErgebnis.fehler(pruefung.fehler());
-                }
-                yield TextErgebnis.ok(
-                    text.substring(0, pruefung.index())
-                        + befehl.woerter()
-                        + " "
-                        + text.substring(pruefung.index()));
-              }
-              case WortAnker.VorKommaAmEnde ignoriert -> {
-                var gestutzt = text.stripTrailing();
-                if (!gestutzt.endsWith(",")) {
-                  yield TextErgebnis.fehler("Der Zieltext endet nicht mit einem Komma.");
-                }
-                yield TextErgebnis.ok(
-                    gestutzt.substring(0, gestutzt.length() - 1) + " " + befehl.woerter() + ",");
-              }
-              case WortAnker.AmEnde ignoriert -> {
-                var gestutzt = text.stripTrailing();
-                if (gestutzt.endsWith(".") || gestutzt.endsWith(",") || gestutzt.endsWith(";")) {
-                  var satzzeichen = gestutzt.charAt(gestutzt.length() - 1);
-                  yield TextErgebnis.ok(
-                      gestutzt.substring(0, gestutzt.length() - 1)
-                          + " "
-                          + befehl.woerter()
-                          + satzzeichen);
-                }
-                yield TextErgebnis.ok(gestutzt + " " + befehl.woerter());
-              }
-            }));
+            text ->
+                switch (befehl.anker()) {
+                  case WortAnker.NachWoertern nach -> {
+                    var pruefung = eindeutigeFundstelle(text, nach.woerter());
+                    if (pruefung.fehler() != null) {
+                      yield TextErgebnis.fehler(pruefung.fehler());
+                    }
+                    int ende = pruefung.index() + nach.woerter().length();
+                    yield TextErgebnis.ok(
+                        text.substring(0, ende)
+                            + fuge(befehl.woerter())
+                            + befehl.woerter()
+                            + text.substring(ende));
+                  }
+                  case WortAnker.VorWoertern vor -> {
+                    var pruefung = eindeutigeFundstelle(text, vor.woerter());
+                    if (pruefung.fehler() != null) {
+                      yield TextErgebnis.fehler(pruefung.fehler());
+                    }
+                    yield TextErgebnis.ok(
+                        text.substring(0, pruefung.index())
+                            + befehl.woerter()
+                            + " "
+                            + text.substring(pruefung.index()));
+                  }
+                  case WortAnker.VorKommaAmEnde ignoriert -> {
+                    var gestutzt = text.stripTrailing();
+                    if (!gestutzt.endsWith(",")) {
+                      yield TextErgebnis.fehler("Der Zieltext endet nicht mit einem Komma.");
+                    }
+                    yield TextErgebnis.ok(
+                        gestutzt.substring(0, gestutzt.length() - 1)
+                            + " "
+                            + befehl.woerter()
+                            + ",");
+                  }
+                  case WortAnker.AmEnde ignoriert -> {
+                    var gestutzt = text.stripTrailing();
+                    if (gestutzt.endsWith(".")
+                        || gestutzt.endsWith(",")
+                        || gestutzt.endsWith(";")) {
+                      var satzzeichen = gestutzt.charAt(gestutzt.length() - 1);
+                      yield TextErgebnis.ok(
+                          gestutzt.substring(0, gestutzt.length() - 1)
+                              + " "
+                              + befehl.woerter()
+                              + satzzeichen);
+                    }
+                    yield TextErgebnis.ok(gestutzt + " " + befehl.woerter());
+                  }
+                }));
   }
 
   // --- Strukturoperationen -------------------------------------------------------------------
@@ -876,7 +895,8 @@
     var text = absatz.text();
     var einrueckung = einrueckungVon(text, von);
     var ersatz = rueckeZitatEin(normalisiereZitatText(befehl.text()), einrueckung);
-    absaetze.set(f1.absatzIndex(), absatz.mitText(text.substring(0, von) + ersatz + text.substring(bis)));
+    absaetze.set(
+        f1.absatzIndex(), absatz.mitText(text.substring(0, von) + ersatz + text.substring(bis)));
     normen.set(f1.normIndex(), norm.mitAbsaetzen(absaetze));
     return angewandt(befehl, norm.enbez());
   }
@@ -911,8 +931,7 @@
           yield angewandt(befehl, neue.stream().map(Norm::enbez).toList());
         }
 
-        var sigelNeu =
-            befehl.stelle().paragraph().map(Stelle.Paragraph::sigel).orElse("§");
+        var sigelNeu = befehl.stelle().paragraph().map(Stelle.Paragraph::sigel).orElse("§");
         var enbezNeu = sigelNeu + " " + befehl.bezeichnung();
         if (StellenAufloeser.normIndex(gesetzAus(normen), enbezNeu) >= 0) {
           yield manuell(befehl, enbezNeu + " existiert bereits im Stammgesetz.");
@@ -1016,7 +1035,10 @@
                       normalisiereZitatText(befehl.text()), einrueckungVon(text, zeilenAnfang));
               return TextErgebnis.ok(
                   befehl.vorher()
-                      ? text.substring(0, zeilenAnfang) + block + "\n" + text.substring(zeilenAnfang)
+                      ? text.substring(0, zeilenAnfang)
+                          + block
+                          + "\n"
+                          + text.substring(zeilenAnfang)
                       : text.substring(0, zeilenEnde) + "\n" + block + text.substring(zeilenEnde));
             }));
   }
@@ -1176,8 +1198,10 @@
       var absaetze = new ArrayList<>(norm.absaetze());
       int quelleIdx = fundstelle.absatzIndex();
       var neueNummer = neuAbsatz.get().nummer();
-      // Ein leerer Platzhalter-Absatz mit der Zielnummer (weggefallen/gegenstandslos) wird durch die
-      // Umnummerierung überschrieben (analog zur Norm-Umnummerierung auf eine weggefallene Zielnorm).
+      // Ein leerer Platzhalter-Absatz mit der Zielnummer (weggefallen/gegenstandslos) wird durch
+      // die
+      // Umnummerierung überschrieben (analog zur Norm-Umnummerierung auf eine weggefallene
+      // Zielnorm).
       for (int i = absaetze.size() - 1; i >= 0; i--) {
         if (i != quelleIdx
             && neueNummer.equals(absaetze.get(i).nummer())
@@ -1208,8 +1232,11 @@
                     .matcher(text.substring(bereich.von(), bereich.bis()));
             if (!marke.find()) {
               return TextErgebnis.fehler(
-                  "„" + alteMarke + "“ steht nicht am Anfang von "
-                      + befehl.stelle().anzeigeText() + ".");
+                  "„"
+                      + alteMarke
+                      + "“ steht nicht am Anfang von "
+                      + befehl.stelle().anzeigeText()
+                      + ".");
             }
             var umbenannt =
                 text.substring(0, bereich.von())
@@ -1235,9 +1262,11 @@
         var absaetze = new ArrayList<>(norm.absaetze());
         var absatz = absaetze.get(fundstelle.absatzIndex());
         var text = absatz.text();
-        var marker = Superskript.LAUF.matcher(text).region(fundstelle.bereich().von(), fundstelle.bereich().bis());
-        if (marker.lookingAt()
-            && Superskript.istSatzanfang(text, marker.start(), marker.end())) {
+        var marker =
+            Superskript.LAUF
+                .matcher(text)
+                .region(fundstelle.bereich().von(), fundstelle.bereich().bis());
+        if (marker.lookingAt() && Superskript.istSatzanfang(text, marker.start(), marker.end())) {
           var neuerText =
               text.substring(0, marker.start())
                   + Superskript.zuSuperskript(neuSatz.nummer())
@@ -1279,7 +1308,9 @@
    */
   private static String entferneWeggefallenenPlatzhalter(String text, String marke) {
     return text.replaceFirst(
-        "(?m)^[ \\t]*" + Pattern.quote(marke) + "[ \\t]+\\((?:weggefallen|gegenstandslos|aufgehoben)\\)\\n?",
+        "(?m)^[ \\t]*"
+            + Pattern.quote(marke)
+            + "[ \\t]+\\((?:weggefallen|gegenstandslos|aufgehoben)\\)\\n?",
         "");
   }
 
@@ -1310,8 +1341,7 @@
     // Steht genau ein unnummerierter Absatz zwischen nummerierten (bayerische Folge „Dem Wortlaut
     // werden … Abs. 1 bis 4 vorangestellt“ → „Der bisherige Wortlaut wird Abs. 5“), erhält nur
     // dieser die Nummer. Sind alle Absätze unnummeriert, wird der Gesamtwortlaut zu einem Absatz.
-    var unnummerierte =
-        norm.absaetze().stream().filter(a -> a.nummer() == null).toList();
+    var unnummerierte = norm.absaetze().stream().filter(a -> a.nummer() == null).toList();
     if (unnummerierte.size() == 1 && norm.absaetze().size() > 1) {
       var absaetze = new ArrayList<>(norm.absaetze());
       int idx = absaetze.indexOf(unnummerierte.get(0));
@@ -1427,11 +1457,7 @@
     if (!fehlend.isEmpty()) {
       return manuell(
           befehl,
-          "Fußnote "
-              + String.join(", ", fehlend)
-              + " kommt in "
-              + norm.enbez()
-              + " nicht vor.");
+          "Fußnote " + String.join(", ", fehlend) + " kommt in " + norm.enbez() + " nicht vor.");
     }
     normen.set(aufloesung.normIndex(), norm.mitAbsaetzen(absaetze));
     return angewandt(befehl, norm.enbez());
@@ -1475,7 +1501,11 @@
       betroffene.addAll(ergebnis.betroffeneEnbez());
       if (ergebnis.status() != Status.ANGEWANDT) {
         meldungen[index] =
-            "Teil " + (index + 1) + " (" + teil.stelle().anzeigeText() + "): "
+            "Teil "
+                + (index + 1)
+                + " ("
+                + teil.stelle().anzeigeText()
+                + "): "
                 + ergebnis.begruendung();
       }
     }
@@ -1742,7 +1772,8 @@
 
   /**
    * Zerlegt einen Zitatblock mehrerer Paragraphen an den §-Überschriften (nicht an Querverweisen)
-   * und parst jeden Abschnitt zu einer {@link Norm}. Die Gliederung wird von der Vorlage übernommen.
+   * und parst jeden Abschnitt zu einer {@link Norm}. Die Gliederung wird von der Vorlage
+   * übernommen.
    */
   private static List<Norm> parseNormenBlock(String block, @Nullable Gliederung gliederung) {
     var normen = new ArrayList<Norm>();
@@ -1868,10 +1899,10 @@
   }
 
   /**
-   * Rückt die kanonischen Zitatzeilen auf die Ziel-Einrückung um: Aufzählungszeilen (und die
-   * erste Zeile) auf {@code einrueckung}, Fortsetzungszeilen — etwa der Definitionstext unter
-   * einer Kurzüberschrift — zwei Zeichen tiefer, damit sie Kindzeilen der Einheit bleiben
-   * (dieselbe Form, die der ContentFlattener aus dem Stammgesetz-XML erzeugt).
+   * Rückt die kanonischen Zitatzeilen auf die Ziel-Einrückung um: Aufzählungszeilen (und die erste
+   * Zeile) auf {@code einrueckung}, Fortsetzungszeilen — etwa der Definitionstext unter einer
+   * Kurzüberschrift — zwei Zeichen tiefer, damit sie Kindzeilen der Einheit bleiben (dieselbe Form,
+   * die der ContentFlattener aus dem Stammgesetz-XML erzeugt).
    */
   private static String rueckeZitatEin(String zitat, String einrueckung) {
     var sb = new StringBuilder();
diff --git a/src/main/java/eu/mulk/aendggner/anwendung/InhaltsuebersichtAnwender.java b/src/main/java/eu/mulk/aendggner/anwendung/InhaltsuebersichtAnwender.java
index e9f84b6..acd42d7 100644
--- a/src/main/java/eu/mulk/aendggner/anwendung/InhaltsuebersichtAnwender.java
+++ b/src/main/java/eu/mulk/aendggner/anwendung/InhaltsuebersichtAnwender.java
@@ -74,12 +74,13 @@
   /** Die adressierte Angabe: die §-/Gliederungs-Komponenten hinter der Inhaltsübersichts-Marke. */
   private static List<Stelle.Komponente> zielKette(Stelle stelle) {
     return stelle.komponenten().stream()
-        .filter(
-            k -> k instanceof Stelle.Paragraph || k instanceof Stelle.Gliederungseinheit)
+        .filter(k -> k instanceof Stelle.Paragraph || k instanceof Stelle.Gliederungseinheit)
         .toList();
   }
 
-  /** Ersetzt die Zeilen von {@code von} bis {@code bis} durch die Angaben des Zitats (oder nichts). */
+  /**
+   * Ersetzt die Zeilen von {@code von} bis {@code bis} durch die Angaben des Zitats (oder nichts).
+   */
   private static AngewandteAenderung ersetzeZeilen(
       List<Norm> normen,
       Aenderungsbefehl befehl,
@@ -139,8 +140,7 @@
 
   // --- Zeilenmodell ----------------------------------------------------------------------------
 
-  private record Zeilenfund(
-      int absatzIndex, int vonZeile, int bisZeile, @Nullable String fehler) {
+  private record Zeilenfund(int absatzIndex, int vonZeile, int bisZeile, @Nullable String fehler) {
     static Zeilenfund fehlgeschlagen(String begruendung) {
       return new Zeilenfund(-1, -1, -1, begruendung);
     }
@@ -148,8 +148,8 @@
 
   /**
    * Findet die (norm-weit eindeutige) Zeile der adressierten Angabe. Die Kette wird verschachtelt
-   * aufgelöst: „Teil 2 Abschnitt 4“ sucht die Abschnitt-Zeile erst hinter der Teil-2-Zeile (und
-   * vor dem nächsten Teil), sodass gleichnamige Abschnitte anderer Teile nicht stören.
+   * aufgelöst: „Teil 2 Abschnitt 4“ sucht die Abschnitt-Zeile erst hinter der Teil-2-Zeile (und vor
+   * dem nächsten Teil), sodass gleichnamige Abschnitte anderer Teile nicht stören.
    */
   private static Zeilenfund findeZeile(Norm norm, List<Stelle.Komponente> kette) {
     var ziel = kette.get(kette.size() - 1);
diff --git a/src/main/java/eu/mulk/aendggner/anwendung/SatzTeiler.java b/src/main/java/eu/mulk/aendggner/anwendung/SatzTeiler.java
index b457cf2..3360bc6 100644
--- a/src/main/java/eu/mulk/aendggner/anwendung/SatzTeiler.java
+++ b/src/main/java/eu/mulk/aendggner/anwendung/SatzTeiler.java
@@ -11,8 +11,8 @@
  * Zerlegt einen Absatztext in Sätze im Rechtssinne, mit einer Stoppliste für juristische
  * Abkürzungen und Datumsangaben („Abs.“, „31. März 2021“).
  *
- * <p>Trägt der Text amtliche Satznummern als Unicode-Superskripte (bayerisches Landesrecht,
- * „¹Die freilebende Tierwelt …“), wird exakt an diesen geteilt statt heuristisch.
+ * <p>Trägt der Text amtliche Satznummern als Unicode-Superskripte (bayerisches Landesrecht, „¹Die
+ * freilebende Tierwelt …“), wird exakt an diesen geteilt statt heuristisch.
  */
 public final class SatzTeiler {
 
@@ -182,8 +182,8 @@
   /**
    * Punkt einer Aufzählungsmarke am Zeilenanfang („… folgende Aufgaben ⏎ 1. Erlaß von Satzungen
    * …“). Er beendet keinen Satz: die Glieder einer Aufzählung gehören zum tragenden Satz. Die
-   * Beschränkung auf den Zeilenanfang unterscheidet die Marke von einer Zahl am Satzende („… beträgt
-   * 30. Die Frist …“).
+   * Beschränkung auf den Zeilenanfang unterscheidet die Marke von einer Zahl am Satzende („…
+   * beträgt 30. Die Frist …“).
    */
   private static boolean istAufzaehlungsMarke(String text, int punktPosition) {
     var wort = wortVor(text, punktPosition);
diff --git a/src/main/java/eu/mulk/aendggner/anwendung/StellenAufloeser.java b/src/main/java/eu/mulk/aendggner/anwendung/StellenAufloeser.java
index dd8409e..ff77279 100644
--- a/src/main/java/eu/mulk/aendggner/anwendung/StellenAufloeser.java
+++ b/src/main/java/eu/mulk/aendggner/anwendung/StellenAufloeser.java
@@ -164,7 +164,9 @@
       }
       bereich =
           zeilenBlock(
-              text, labelRegex, bereich != null ? bereich : new SatzTeiler.SatzBereich(0, text.length()));
+              text,
+              labelRegex,
+              bereich != null ? bereich : new SatzTeiler.SatzBereich(0, text.length()));
       if (bereich == null) {
         return null;
       }
diff --git a/src/main/java/eu/mulk/aendggner/gesetz/Gliederung.java b/src/main/java/eu/mulk/aendggner/gesetz/Gliederung.java
index 7a09093..00106d2 100644
--- a/src/main/java/eu/mulk/aendggner/gesetz/Gliederung.java
+++ b/src/main/java/eu/mulk/aendggner/gesetz/Gliederung.java
@@ -6,8 +6,8 @@
  * Eine Gliederungseinheit (z.B. „Teil 2 — Anforderungen an zu errichtende Gebäude“ oder „2.
  * Abschnitt — Koordinierung und Früherkennung“).
  *
- * @param kennzahl die hierarchie-kodierende Gliederungskennzahl aus dem gii-XML (z.B. {@code 020020}
- *     für Abschnitt 2 in Teil 2); {@code null} bei anderweitig konstruierten Einheiten.
+ * @param kennzahl die hierarchie-kodierende Gliederungskennzahl aus dem gii-XML (z.B. {@code
+ *     020020} für Abschnitt 2 in Teil 2); {@code null} bei anderweitig konstruierten Einheiten.
  * @param bezeichnung die relative Bezeichnung („Teil 2“, „Abschnitt 2“).
  * @param titel die Überschrift der Einheit ({@code null} bei titellosen Einheiten).
  */
diff --git a/src/main/java/eu/mulk/aendggner/gesetz/Superskript.java b/src/main/java/eu/mulk/aendggner/gesetz/Superskript.java
index 733c1f7..4ba8304 100644
--- a/src/main/java/eu/mulk/aendggner/gesetz/Superskript.java
+++ b/src/main/java/eu/mulk/aendggner/gesetz/Superskript.java
@@ -46,9 +46,9 @@
   }
 
   /**
-   * Wahr, wenn {@code text} mindestens eine amtliche Satznummer am Satzanfang trägt. Dient dazu, die
-   * Schreibweise eines Stammgesetzes zu erkennen (Landesrecht mit amtlicher Satzzählung behält seine
-   * Superskripte, Bundesrecht ohne solche verwirft sie).
+   * Wahr, wenn {@code text} mindestens eine amtliche Satznummer am Satzanfang trägt. Dient dazu,
+   * die Schreibweise eines Stammgesetzes zu erkennen (Landesrecht mit amtlicher Satzzählung behält
+   * seine Superskripte, Bundesrecht ohne solche verwirft sie).
    */
   public static boolean traegtSatznummern(String text) {
     var m = LAUF.matcher(text);
diff --git a/src/main/java/eu/mulk/aendggner/gesetz/land/LandesRechtLoader.java b/src/main/java/eu/mulk/aendggner/gesetz/land/LandesRechtLoader.java
index ecb10f8..c64ca21 100644
--- a/src/main/java/eu/mulk/aendggner/gesetz/land/LandesRechtLoader.java
+++ b/src/main/java/eu/mulk/aendggner/gesetz/land/LandesRechtLoader.java
@@ -6,17 +6,17 @@
 import eu.mulk.aendggner.gesetz.Gesetz;
 import java.io.IOException;
 import java.nio.charset.StandardCharsets;
-import java.text.Normalizer;
 import java.nio.file.Files;
 import java.nio.file.Path;
+import java.text.Normalizer;
 import org.apache.tika.Tika;
 import org.jboss.logging.Logger;
 
 /**
  * Liest ein Stammgesetz des Landesrechts aus der konsolidierten Fassung — als PDF oder als
  * kanonischer Klartext. Deckt bayerisches Landesrecht (Gliederung in {@code Art.}, amtliche
- * Satznummern) ebenso ab wie die {@code §}-gegliederten Gesetze der übrigen Länder; das Sigel
- * folgt je Norm aus dem Text (siehe {@link LandesRechtTextParser}).
+ * Satznummern) ebenso ab wie die {@code §}-gegliederten Gesetze der übrigen Länder; das Sigel folgt
+ * je Norm aus dem Text (siehe {@link LandesRechtTextParser}).
  *
  * <p>PDFs durchlaufen dieselbe Aufbereitung wie Änderungsgesetze (Fontgrößen-Filter mit
  * Superskript-Erhalt, Textbereinigung); der bereinigte Lineartext ist zugleich das dokumentierte
@@ -56,7 +56,7 @@
 
   /**
    * Stellt einen vom Zeilen-Reflow an das Satzende der Vornorm geklebten Normkopf („… verlangen.
-   * Art. 17  Jagderlaubnis“) wieder auf eine eigene Zeile. Das doppelte Leerzeichen zwischen
+   * Art. 17 Jagderlaubnis“) wieder auf eine eigene Zeile. Das doppelte Leerzeichen zwischen
    * Norm-Nummer und Titel unterscheidet den Normkopf von gewöhnlichen Querverweisen.
    */
   private static String nachSatzendeGetrennteNormkoepfe(String text) {
diff --git a/src/main/java/eu/mulk/aendggner/gesetz/land/LandesRechtTextParser.java b/src/main/java/eu/mulk/aendggner/gesetz/land/LandesRechtTextParser.java
index 6c58c49..a256243 100644
--- a/src/main/java/eu/mulk/aendggner/gesetz/land/LandesRechtTextParser.java
+++ b/src/main/java/eu/mulk/aendggner/gesetz/land/LandesRechtTextParser.java
@@ -57,20 +57,22 @@
   // nachgestelltem Schlüsselwort („I. Abschnitt“, Muster GLIEDERUNG). Der Titel steht — nach der
   // kanonischen Aufbereitung — mit doppeltem Leerzeichen auf derselben Zeile.
   private static final Pattern GLIEDERUNG_ARABISCH =
-      Pattern.compile("^(Buch|Teil|Kapitel|Abschnitt|Unterabschnitt|Titel) (\\d+[a-z]?)\\s+(\\S.*)$");
+      Pattern.compile(
+          "^(Buch|Teil|Kapitel|Abschnitt|Unterabschnitt|Titel) (\\d+[a-z]?)\\s+(\\S.*)$");
 
   // Römische Gliederung ohne Schlüsselwort („I. Rechtsform und Aufgaben“, NRW). Sie ist nur an der
   // Stellung erkennbar, deshalb gilt dieselbe Absicherung wie für UNTER_GLIEDERUNG: kurzer,
   // großgeschriebener, satzzeichenfreier Titel und ein Normkopf oder eine weitere Überschrift als
   // nächste nicht-leere Zeile.
-  private static final Pattern GLIEDERUNG_ROEMISCH = Pattern.compile("^([IVXLCDM]+)\\.\\s+(\\S.*)$");
+  private static final Pattern GLIEDERUNG_ROEMISCH =
+      Pattern.compile("^([IVXLCDM]+)\\.\\s+(\\S.*)$");
 
   private static final Pattern UNTER_GLIEDERUNG = Pattern.compile("^(\\d+[a-z]?)\\.\\s+(\\S.*)$");
 
   /**
    * Die Inhaltsübersicht ist eine Norm ohne Sigel; Angabe-Befehle adressieren sie unter genau
-   * diesem Namen (siehe {@code InhaltsuebersichtAnwender}). Ihre Zeilen tragen das
-   * Übersichtsformat „§ N | Titel“.
+   * diesem Namen (siehe {@code InhaltsuebersichtAnwender}). Ihre Zeilen tragen das Übersichtsformat
+   * „§ N | Titel“.
    */
   private static final String INHALTSUEBERSICHT = "Inhaltsübersicht";
 
@@ -81,12 +83,14 @@
       Pattern.compile(
           "^(§|Art\\.)\\s+(\\d+[a-z]?)\\s+"
               // Querverweis-Schlüsselwörter nur als ganzes Wort ausschließen: „§ 4 Satz 2“ ist ein
-              // Verweis, „§ 4 Satzungen“ dagegen ein Normtitel. Der Schutz „(?![a-zäöüß])“ verhindert,
+              // Verweis, „§ 4 Satzungen“ dagegen ein Normtitel. Der Schutz „(?![a-zäöüß])“
+              // verhindert,
               // dass „Satz“ auch „Satzungen“, „Nummer“ auch „Nummerierung“ trifft.
               + "(?!(?:Absatz|Abs\\.|Satz|Sätze|Nummer|Nr\\.|Buchstabe|Buchst\\."
               + "|und|bis|oder|sowie|des|der|dieses)(?![a-zäöüß]))"
               // Der Titel endet nicht auf einen Punkt: ein Normkopf trägt eine Überschrift, keinen
-              // ganzen Satz. So wird ein am Zeilenanfang stehender Querverweis-Satz („§ 7 GAPInVeKoSG
+              // ganzen Satz. So wird ein am Zeilenanfang stehender Querverweis-Satz („§ 7
+              // GAPInVeKoSG
               // findet entsprechend Anwendung.“) nicht fälschlich als Normkopf „§ 7“ gelesen.
               + "((?:\\p{Lu}|\\().*[^.])\\s*$");
 
@@ -210,8 +214,7 @@
           gliederungsZaehler++;
           elternKennzahl = String.format("%03d", gliederungsZaehler);
           aktuelleGliederung =
-              new Gliederung(
-                  elternKennzahl, roemisch.group(1) + ".", roemisch.group(2).strip());
+              new Gliederung(elternKennzahl, roemisch.group(1) + ".", roemisch.group(2).strip());
           gliederungen.add(aktuelleGliederung);
         } else {
           var kennzahl =
@@ -278,8 +281,8 @@
   }
 
   /**
-   * Ein Normkopf eröffnet nur dann eine neue Norm, wenn seine Nummer hinter der letzten liegt —
-   * das fängt Querverweise ab, die die Negativliste nicht ausschließt.
+   * Ein Normkopf eröffnet nur dann eine neue Norm, wenn seine Nummer hinter der letzten liegt — das
+   * fängt Querverweise ab, die die Negativliste nicht ausschließt.
    */
   private static boolean istNeuerNormKopf(String nummer, int letzteNormNummer) {
     return numerisch(nummer) >= letzteNormNummer;
@@ -315,10 +318,7 @@
   }
 
   private static Norm baueNorm(
-      String enbez,
-      @Nullable String titel,
-      @Nullable Gliederung gliederung,
-      List<String> zeilen) {
+      String enbez, @Nullable String titel, @Nullable Gliederung gliederung, List<String> zeilen) {
     boolean weggefallen = titel != null && WEGGEFALLEN_TITEL.matcher(titel).matches();
 
     var absaetze = new ArrayList<Absatz>();
diff --git a/src/main/java/eu/mulk/aendggner/synopse/SynopseBuilder.java b/src/main/java/eu/mulk/aendggner/synopse/SynopseBuilder.java
index 1568aa9..ce4f1a1 100644
--- a/src/main/java/eu/mulk/aendggner/synopse/SynopseBuilder.java
+++ b/src/main/java/eu/mulk/aendggner/synopse/SynopseBuilder.java
@@ -50,13 +50,13 @@
     var manuell =
         anwendung.protokoll().stream().filter(a -> a.status() == Status.MANUELL_PRUEFEN).toList();
 
-    return new Synopse(alt, neu, eintraege, gliederungsAenderungen(alt, neu), manuell, parseWarnungen);
+    return new Synopse(
+        alt, neu, eintraege, gliederungsAenderungen(alt, neu), manuell, parseWarnungen);
   }
 
   /**
-   * Paart die Gliederungseinheiten nach Kennzahl und sammelt die mit geänderter Überschrift.
-   * Neu eingefügte Einheiten (ohne Kennzahl und ohne Alt-Pendant) erscheinen mit {@code alt ==
-   * null}.
+   * Paart die Gliederungseinheiten nach Kennzahl und sammelt die mit geänderter Überschrift. Neu
+   * eingefügte Einheiten (ohne Kennzahl und ohne Alt-Pendant) erscheinen mit {@code alt == null}.
    */
   private static List<Synopse.GliederungsAenderung> gliederungsAenderungen(Gesetz alt, Gesetz neu) {
     var aenderungen = new ArrayList<Synopse.GliederungsAenderung>();
diff --git a/src/main/java/eu/mulk/aendggner/web/Multipart.java b/src/main/java/eu/mulk/aendggner/web/Multipart.java
index 3e5a059..745443b 100644
--- a/src/main/java/eu/mulk/aendggner/web/Multipart.java
+++ b/src/main/java/eu/mulk/aendggner/web/Multipart.java
@@ -17,7 +17,8 @@
   private static final Pattern BOUNDARY_PATTERN = Pattern.compile("boundary=\"?([^\";]+)\"?");
   private static final Pattern NAME_PATTERN = Pattern.compile("name=\"([^\"]*)\"");
   private static final Pattern FILENAME_PATTERN = Pattern.compile("filename=\"([^\"]*)\"");
-  private static final byte[] HEADER_BODY_SEPARATOR = "\r\n\r\n".getBytes(StandardCharsets.ISO_8859_1);
+  private static final byte[] HEADER_BODY_SEPARATOR =
+      "\r\n\r\n".getBytes(StandardCharsets.ISO_8859_1);
 
   private Multipart() {}
 
@@ -33,7 +34,9 @@
     var delimiter = ("--" + boundary).getBytes(StandardCharsets.ISO_8859_1);
 
     var positions = new ArrayList<Integer>();
-    for (int i = indexOf(body, delimiter, 0); i >= 0; i = indexOf(body, delimiter, i + delimiter.length)) {
+    for (int i = indexOf(body, delimiter, 0);
+        i >= 0;
+        i = indexOf(body, delimiter, i + delimiter.length)) {
       positions.add(i);
     }
 
diff --git a/src/main/java/eu/mulk/aendggner/web/StaticHandler.java b/src/main/java/eu/mulk/aendggner/web/StaticHandler.java
index 8cdf6e5..24a6e41 100644
--- a/src/main/java/eu/mulk/aendggner/web/StaticHandler.java
+++ b/src/main/java/eu/mulk/aendggner/web/StaticHandler.java
@@ -7,7 +7,10 @@
 import java.io.UncheckedIOException;
 import java.nio.charset.StandardCharsets;
 
-/** Liefert eine einzelne, beim Start einmal geladene statische Ressource aus (Formular, Impressum, CSS, …). */
+/**
+ * Liefert eine einzelne, beim Start einmal geladene statische Ressource aus (Formular, Impressum,
+ * CSS, …).
+ */
 final class StaticHandler implements HttpHandler {
 
   private final byte[] content;
@@ -48,7 +51,8 @@
     }
   }
 
-  private static void sendText(HttpExchange exchange, int status, String message) throws IOException {
+  private static void sendText(HttpExchange exchange, int status, String message)
+      throws IOException {
     var body = message.getBytes(StandardCharsets.UTF_8);
     exchange.getResponseHeaders().set("Content-Type", "text/plain; charset=utf-8");
     exchange.sendResponseHeaders(status, body.length);
diff --git a/src/main/java/eu/mulk/aendggner/web/UploadHandler.java b/src/main/java/eu/mulk/aendggner/web/UploadHandler.java
index 8765ac3..efcb512 100644
--- a/src/main/java/eu/mulk/aendggner/web/UploadHandler.java
+++ b/src/main/java/eu/mulk/aendggner/web/UploadHandler.java
@@ -21,19 +21,20 @@
 import java.util.concurrent.TimeoutException;
 
 /**
- * {@code POST /synopse} — nimmt Stammgesetz- und Änderungsgesetz-Datei(en) per
- * {@code multipart/form-data} entgegen, ruft {@link Pipeline#erzeugeSynopse} auf und liefert das
- * erzeugte HTML zurück.
+ * {@code POST /synopse} — nimmt Stammgesetz- und Änderungsgesetz-Datei(en) per {@code
+ * multipart/form-data} entgegen, ruft {@link Pipeline#erzeugeSynopse} auf und liefert das erzeugte
+ * HTML zurück.
  *
- * <p>Hochgeladene Dateien landen ausschließlich als temporäre Dateien für die Dauer der Anfrage
- * und werden danach in jedem Fall gelöscht — es wird nichts dauerhaft gespeichert. Die eigentliche
+ * <p>Hochgeladene Dateien landen ausschließlich als temporäre Dateien für die Dauer der Anfrage und
+ * werden danach in jedem Fall gelöscht — es wird nichts dauerhaft gespeichert. Die eigentliche
  * Verarbeitung läuft auf einem auf die Kernzahl begrenzten Thread-Pool mit fester Warteschlange;
  * bei Überlast wird sofort mit {@code 503} abgelehnt, statt unbegrenzt Arbeit anzunehmen.
  */
 final class UploadHandler implements HttpHandler {
 
   private static final long MAX_PART_BYTES = 15L * 1024 * 1024; // 15 MB je Datei
-  private static final long MAX_BODY_BYTES = 40L * 1024 * 1024; // Sicherheitsnetz für die gesamte Anfrage
+  private static final long MAX_BODY_BYTES =
+      40L * 1024 * 1024; // Sicherheitsnetz für die gesamte Anfrage
   private static final long TIMEOUT_SECONDS = 30;
 
   private final ExecutorService pipelinePool;
@@ -77,7 +78,8 @@
                 try {
                   Files.deleteIfExists(path);
                 } catch (IOException ignored) {
-                  // Aufräumen ist best effort; ein verwaistes Temp-File blockiert die Antwort nicht.
+                  // Aufräumen ist best effort; ein verwaistes Temp-File blockiert die Antwort
+                  // nicht.
                 }
               });
     } catch (IOException ignored) {
@@ -169,7 +171,8 @@
       var future = pipelinePool.submit(job);
       ergebnis = future.get(TIMEOUT_SECONDS, TimeUnit.SECONDS);
     } catch (RejectedExecutionException e) {
-      sendText(exchange, 503, "Der Dienst ist gerade ausgelastet. Bitte in Kürze erneut versuchen.");
+      sendText(
+          exchange, 503, "Der Dienst ist gerade ausgelastet. Bitte in Kürze erneut versuchen.");
       return;
     } catch (TimeoutException e) {
       sendText(exchange, 504, "Die Verarbeitung hat zu lange gedauert und wurde abgebrochen.");
@@ -215,7 +218,8 @@
     return filename.replaceAll("[^A-Za-z0-9._-]", "_");
   }
 
-  private static void sendText(HttpExchange exchange, int status, String message) throws IOException {
+  private static void sendText(HttpExchange exchange, int status, String message)
+      throws IOException {
     var body = message.getBytes(StandardCharsets.UTF_8);
     exchange.getResponseHeaders().set("Content-Type", "text/plain; charset=utf-8");
     exchange.sendResponseHeaders(status, body.length);
diff --git a/src/main/java/eu/mulk/aendggner/web/WebMain.java b/src/main/java/eu/mulk/aendggner/web/WebMain.java
index 9d71558..815f0db 100644
--- a/src/main/java/eu/mulk/aendggner/web/WebMain.java
+++ b/src/main/java/eu/mulk/aendggner/web/WebMain.java
@@ -34,7 +34,8 @@
         "/datenschutz",
         new StaticHandler("/eu/mulk/aendggner/web/datenschutz.html", "text/html; charset=utf-8"));
     server.createContext(
-        "/style.css", new StaticHandler("/eu/mulk/aendggner/web/style.css", "text/css; charset=utf-8"));
+        "/style.css",
+        new StaticHandler("/eu/mulk/aendggner/web/style.css", "text/css; charset=utf-8"));
     server.createContext("/synopse", new UploadHandler());
 
     server.start();
diff --git a/src/test/java/eu/mulk/aendggner/aenderung/parse/AenderungsgesetzParserTest.java b/src/test/java/eu/mulk/aendggner/aenderung/parse/AenderungsgesetzParserTest.java
index 2dc53bb..79e257e 100644
--- a/src/test/java/eu/mulk/aendggner/aenderung/parse/AenderungsgesetzParserTest.java
+++ b/src/test/java/eu/mulk/aendggner/aenderung/parse/AenderungsgesetzParserTest.java
@@ -93,8 +93,7 @@
   @Test
   void eingebettetesRahmenzielSetztKontext() {
     var bayUig =
-        new Gesetz(
-            "BayUIG", "Bayerisches Umweltinformationsgesetz", null, List.of(), List.of());
+        new Gesetz("BayUIG", "Bayerisches Umweltinformationsgesetz", null, List.of(), List.of());
     var text =
         """
         § 3
@@ -113,8 +112,7 @@
     // aus der Zitierkette der Änderungshistorie.
     assertThat(ergebnis.befehle())
         .allSatisfy(
-            befehl ->
-                assertThat(befehl.stelle().anzeigeText()).startsWith("Art. 7 Absatz 2"));
+            befehl -> assertThat(befehl.stelle().anzeigeText()).startsWith("Art. 7 Absatz 2"));
   }
 
   @Test
diff --git a/src/test/java/eu/mulk/aendggner/aenderung/parse/BefehlErkennerTest.java b/src/test/java/eu/mulk/aendggner/aenderung/parse/BefehlErkennerTest.java
index 46c5ad6..cbf790b 100644
--- a/src/test/java/eu/mulk/aendggner/aenderung/parse/BefehlErkennerTest.java
+++ b/src/test/java/eu/mulk/aendggner/aenderung/parse/BefehlErkennerTest.java
@@ -225,8 +225,7 @@
     // 17/2026): Die Position der neuen Einheit bestimmt ein Wortanker, das Ziel erbt der Befehl aus
     // dem Rahmen („Nummer 23“ der Anlage).
     var kontext =
-        new Stelle(
-            List.of(new Stelle.Gliederungseinheit("Anlage", ""), new Stelle.NummerNr("23")));
+        new Stelle(List.of(new Stelle.Gliederungseinheit("Anlage", ""), new Stelle.NummerNr("23")));
     var befehl =
         erkenne(
             "Vor den Wörtern „Aus dem Bereich Verkehr:“ wird folgender Absatz 5 eingefügt:"
@@ -239,8 +238,7 @@
     assertThat(einfuegung.vorher()).isTrue();
     assertThat(einfuegung.ebene()).isEqualTo(Ebene.ABSATZ);
     assertThat(einfuegung.bezeichnung()).isEqualTo("5");
-    assertThat(einfuegung.anker())
-        .isEqualTo(new WortAnker.VorWoertern("Aus dem Bereich Verkehr:"));
+    assertThat(einfuegung.anker()).isEqualTo(new WortAnker.VorWoertern("Aus dem Bereich Verkehr:"));
     assertThat(einfuegung.text()).startsWith("(5) die Identifizierung");
   }
 
@@ -486,9 +484,11 @@
     assertThat(befehl).containsInstanceOf(Sammelbefehl.class);
     var teile = ((Sammelbefehl) befehl.orElseThrow()).teilbefehle();
     assertThat(teile).hasSize(2).allMatch(t -> t instanceof Streichung);
-    assertThat(teile).extracting(t -> t.stelle().anzeigeText())
+    assertThat(teile)
+        .extracting(t -> t.stelle().anzeigeText())
         .containsExactly("§ 3 Absatz 1 Satz 2", "§ 3 Absatz 4");
-    assertThat(((Streichung) teile.get(0)).woerter()).isEqualTo("in Bezug auf § 2 Abs. 1 Nr. 1 bis 4");
+    assertThat(((Streichung) teile.get(0)).woerter())
+        .isEqualTo("in Bezug auf § 2 Abs. 1 Nr. 1 bis 4");
   }
 
   @Test
@@ -502,7 +502,8 @@
     assertThat(befehl).containsInstanceOf(Sammelbefehl.class);
     var teile = ((Sammelbefehl) befehl.orElseThrow()).teilbefehle();
     assertThat(teile).hasSize(2).allMatch(t -> t instanceof Ersetzung);
-    assertThat(teile).extracting(t -> t.stelle().anzeigeText())
+    assertThat(teile)
+        .extracting(t -> t.stelle().anzeigeText())
         .containsExactly("§ 20 Absatz 1 Satz 1", "§ 20 Absatz 2 Satz 2");
     assertThat(((Ersetzung) teile.get(0)).neu()).isEqualTo("Lebensalters");
   }
@@ -518,7 +519,8 @@
     assertThat(befehl).containsInstanceOf(Sammelbefehl.class);
     var teile = ((Sammelbefehl) befehl.orElseThrow()).teilbefehle();
     assertThat(teile).hasSize(2).allMatch(t -> t instanceof WoerterEinfuegung);
-    assertThat(teile).extracting(t -> t.stelle().anzeigeText())
+    assertThat(teile)
+        .extracting(t -> t.stelle().anzeigeText())
         .containsExactly("§ 30 Absatz 2 Satz 1", "§ 30 Absatz 3");
   }
 
@@ -533,9 +535,11 @@
     var teile = ((Sammelbefehl) befehl.orElseThrow()).teilbefehle();
     assertThat(teile).hasSize(3).allMatch(t -> t instanceof Umnummerierung);
     // Absteigend, damit die Anwendung keine Labels kollidieren lässt: 4→5, 3→4, 2→3.
-    assertThat(teile).extracting(t -> t.stelle().anzeigeText())
+    assertThat(teile)
+        .extracting(t -> t.stelle().anzeigeText())
         .containsExactly("§ 5 Absatz 4", "§ 5 Absatz 3", "§ 5 Absatz 2");
-    assertThat(teile).extracting(t -> ((Umnummerierung) t).neu().anzeigeText())
+    assertThat(teile)
+        .extracting(t -> ((Umnummerierung) t).neu().anzeigeText())
         .containsExactly("§ 5 Absatz 5", "§ 5 Absatz 4", "§ 5 Absatz 3");
   }
 
@@ -563,7 +567,8 @@
             Stelle.LEER);
     var teile = ((Sammelbefehl) befehl.orElseThrow()).teilbefehle();
     assertThat(teile).hasSize(2).allMatch(t -> t instanceof Ersetzung);
-    assertThat(teile).extracting(t -> t.stelle().anzeigeText())
+    assertThat(teile)
+        .extracting(t -> t.stelle().anzeigeText())
         .containsExactly("Absatz 1 Satz 1", "Absatz 1 Satz 2");
   }
 
@@ -614,19 +619,23 @@
   @Test
   void bereichsAufhebungWirdSammelbefehl() {
     var teile =
-        ((Sammelbefehl) erkenne("Die Nummern 1 bis 3 werden aufgehoben.", Stelle.LEER).orElseThrow())
+        ((Sammelbefehl)
+                erkenne("Die Nummern 1 bis 3 werden aufgehoben.", Stelle.LEER).orElseThrow())
             .teilbefehle();
     assertThat(teile).hasSize(3).allMatch(t -> t instanceof Aufhebung);
-    assertThat(teile).extracting(t -> t.stelle().anzeigeText())
+    assertThat(teile)
+        .extracting(t -> t.stelle().anzeigeText())
         .containsExactly("Nummer 1", "Nummer 2", "Nummer 3");
   }
 
   @Test
   void koordinierteAufhebungWirdSammelbefehl() {
     var teile =
-        ((Sammelbefehl) erkenne("Die Absätze 4 und 5 werden aufgehoben.", Stelle.LEER).orElseThrow())
+        ((Sammelbefehl)
+                erkenne("Die Absätze 4 und 5 werden aufgehoben.", Stelle.LEER).orElseThrow())
             .teilbefehle();
-    assertThat(teile).extracting(t -> t.stelle().anzeigeText())
+    assertThat(teile)
+        .extracting(t -> t.stelle().anzeigeText())
         .containsExactly("Absatz 4", "Absatz 5");
   }
 
@@ -639,9 +648,11 @@
             .teilbefehle();
     assertThat(teile).hasSize(3).allMatch(t -> t instanceof Umnummerierung);
     // Absteigend: 6→10, 5→9, 4→8.
-    assertThat(teile).extracting(t -> t.stelle().anzeigeText())
+    assertThat(teile)
+        .extracting(t -> t.stelle().anzeigeText())
         .containsExactly("Nummer 6", "Nummer 5", "Nummer 4");
-    assertThat(teile).extracting(t -> ((Umnummerierung) t).neu().anzeigeText())
+    assertThat(teile)
+        .extracting(t -> ((Umnummerierung) t).neu().anzeigeText())
         .containsExactly("Nummer 10", "Nummer 9", "Nummer 8");
   }
 
@@ -656,7 +667,8 @@
                     .orElseThrow())
             .teilbefehle();
     assertThat(teile).hasSize(3).allMatch(t -> t instanceof Neufassung);
-    assertThat(teile).extracting(t -> t.stelle().anzeigeText())
+    assertThat(teile)
+        .extracting(t -> t.stelle().anzeigeText())
         .containsExactly("§ 52", "§ 53", "§ 54");
   }
 
@@ -704,7 +716,9 @@
             new Stelle(List.of(new Stelle.Paragraph("64"))));
     var b = befehl.orElseThrow();
     assertThat(b).isInstanceOf(Aufhebung.class);
-    assertThat(b.stelle().absatzbezeichnung()).get().extracting(Stelle.Absatzbezeichnung::nummer)
+    assertThat(b.stelle().absatzbezeichnung())
+        .get()
+        .extracting(Stelle.Absatzbezeichnung::nummer)
         .isEqualTo("2");
   }
 
@@ -737,7 +751,8 @@
         ((Sammelbefehl) erkenne("Die §§ 34 bis 39 werden gestrichen.", Stelle.LEER).orElseThrow())
             .teilbefehle();
     assertThat(teile).hasSize(6).allMatch(t -> t instanceof Aufhebung);
-    assertThat(teile).extracting(t -> t.stelle().anzeigeText())
+    assertThat(teile)
+        .extracting(t -> t.stelle().anzeigeText())
         .containsExactly("§ 34", "§ 35", "§ 36", "§ 37", "§ 38", "§ 39");
   }
 
@@ -774,7 +789,8 @@
                     .orElseThrow())
             .teilbefehle();
     assertThat(teile).hasSize(4).allMatch(t -> t instanceof Umnummerierung);
-    assertThat(teile).extracting(t -> t.stelle().anzeigeText())
+    assertThat(teile)
+        .extracting(t -> t.stelle().anzeigeText())
         .containsExactly("§ 108 Absatz 7", "§ 108 Absatz 6", "§ 108 Absatz 5", "§ 108 Absatz 4");
   }
 
@@ -806,11 +822,13 @@
   @Test
   void koordinierteParagraphUmnummerierung() {
     var teile =
-        ((Sammelbefehl) erkenne("Die §§ 46 und 47 werden zu den §§ 34 und 35.", Stelle.LEER).orElseThrow())
+        ((Sammelbefehl)
+                erkenne("Die §§ 46 und 47 werden zu den §§ 34 und 35.", Stelle.LEER).orElseThrow())
             .teilbefehle();
     assertThat(teile).hasSize(2).allMatch(t -> t instanceof Umnummerierung);
     assertThat(teile).extracting(t -> t.stelle().anzeigeText()).containsExactly("§ 46", "§ 47");
-    assertThat(teile).extracting(t -> ((Umnummerierung) t).neu().anzeigeText())
+    assertThat(teile)
+        .extracting(t -> ((Umnummerierung) t).neu().anzeigeText())
         .containsExactly("§ 34", "§ 35");
   }
 
@@ -884,6 +902,7 @@
     assertThat(teile).extracting(t -> ((Ersetzung) t).alt()).containsExactly("a", "c");
     assertThat(teile).extracting(t -> ((Ersetzung) t).neu()).containsExactly("b", "d");
   }
+
   // --- Welle-4-Formen --------------------------------------------------------------------------
 
   @Test
@@ -920,7 +939,8 @@
             kontext);
 
     assertThat(befehl).containsInstanceOf(Neufassung.class);
-    assertThat(befehl.orElseThrow().stelle().anzeigeText()).isEqualTo("Inhaltsübersicht Abschnitt 2");
+    assertThat(befehl.orElseThrow().stelle().anzeigeText())
+        .isEqualTo("Inhaltsübersicht Abschnitt 2");
   }
 
   @Test
@@ -1300,7 +1320,8 @@
   @Test
   void erkenntSatzzeichenErsetzungOhneStelle() {
     var befehl =
-        erkenne("Der Punkt am Ende wird durch die Angabe „(Gesellschaftsdialog).“ ersetzt.",
+        erkenne(
+            "Der Punkt am Ende wird durch die Angabe „(Gesellschaftsdialog).“ ersetzt.",
             PARAGRAPH_5);
 
     assertThat(befehl).containsInstanceOf(Ersetzung.class);
diff --git a/src/test/java/eu/mulk/aendggner/aenderung/parse/StellenParserTest.java b/src/test/java/eu/mulk/aendggner/aenderung/parse/StellenParserTest.java
index d5b960a..e32489a 100644
--- a/src/test/java/eu/mulk/aendggner/aenderung/parse/StellenParserTest.java
+++ b/src/test/java/eu/mulk/aendggner/aenderung/parse/StellenParserTest.java
@@ -23,22 +23,23 @@
   void parstMehrfachMitGemeinsamemPraefix() {
     // Zweites Segment erbt „§ 3“, ersetzt aber ab „Absatz“.
     var stellen = StellenParser.parseMehrfach("§ 3 Absatz 1 Satz 2 und Absatz 4");
-    assertThat(stellen).extracting(Stelle::anzeigeText)
+    assertThat(stellen)
+        .extracting(Stelle::anzeigeText)
         .containsExactly("§ 3 Absatz 1 Satz 2", "§ 3 Absatz 4");
   }
 
   @Test
   void parstMehrfachMitSatzTiefe() {
     var stellen = StellenParser.parseMehrfach("§ 20 Absatz 1 Satz 1 und Absatz 2 Satz 2");
-    assertThat(stellen).extracting(Stelle::anzeigeText)
+    assertThat(stellen)
+        .extracting(Stelle::anzeigeText)
         .containsExactly("§ 20 Absatz 1 Satz 1", "§ 20 Absatz 2 Satz 2");
   }
 
   @Test
   void parstMehrfachMitKomma() {
     var stellen = StellenParser.parseMehrfach("§ 1, § 2 und § 3");
-    assertThat(stellen).extracting(Stelle::anzeigeText)
-        .containsExactly("§ 1", "§ 2", "§ 3");
+    assertThat(stellen).extracting(Stelle::anzeigeText).containsExactly("§ 1", "§ 2", "§ 3");
   }
 
   @Test
@@ -57,14 +58,16 @@
   void bloßeNummerErbtKomponentenart() {
     // „Absatz 1 und 5“: das „5“ erbt die Komponentenart „Absatz“ der letzten Komponente.
     var stellen = StellenParser.parseMehrfach("§ 7 Absatz 1 und 5");
-    assertThat(stellen).extracting(Stelle::anzeigeText)
+    assertThat(stellen)
+        .extracting(Stelle::anzeigeText)
         .containsExactly("§ 7 Absatz 1", "§ 7 Absatz 5");
   }
 
   @Test
   void bloßeNummerNachSatz() {
     var stellen = StellenParser.parseMehrfach("Absatz 1 Satz 1 und 2");
-    assertThat(stellen).extracting(Stelle::anzeigeText)
+    assertThat(stellen)
+        .extracting(Stelle::anzeigeText)
         .containsExactly("Absatz 1 Satz 1", "Absatz 1 Satz 2");
   }
 
@@ -94,10 +97,12 @@
   void parstBayerischenBereichMitAbkuerzung() {
     // „In den Abs. 4 und 5“ und Bereiche wie „Art. 4 bis 6“ mit erhaltenem Sigel.
     var stellen = StellenParser.parseMehrfach("Art. 4 Abs. 3, Art. 5 Abs. 2 und Art. 11 Abs. 6");
-    assertThat(stellen).extracting(Stelle::anzeigeText)
+    assertThat(stellen)
+        .extracting(Stelle::anzeigeText)
         .containsExactly("Art. 4 Absatz 3", "Art. 5 Absatz 2", "Art. 11 Absatz 6");
     var bereich = StellenParser.parseMehrfach("Abs. 1 bis 3");
-    assertThat(bereich).extracting(Stelle::anzeigeText)
+    assertThat(bereich)
+        .extracting(Stelle::anzeigeText)
         .containsExactly("Absatz 1", "Absatz 2", "Absatz 3");
   }
 
@@ -127,7 +132,8 @@
   @Test
   void ignoriertChapeauZusatz() {
     // „in der Angabe vor Nummer 1“ ist ein verfeinernder Zusatz ohne eigene Komponente.
-    assertThat(StellenParser.parse("Absatz 1 in der Angabe vor Nummer 1").orElseThrow().anzeigeText())
+    assertThat(
+            StellenParser.parse("Absatz 1 in der Angabe vor Nummer 1").orElseThrow().anzeigeText())
         .isEqualTo("Absatz 1");
   }
 }
diff --git a/src/test/java/eu/mulk/aendggner/aenderung/parse/TextBereinigerTest.java b/src/test/java/eu/mulk/aendggner/aenderung/parse/TextBereinigerTest.java
index 1591a74..4d78639 100644
--- a/src/test/java/eu/mulk/aendggner/aenderung/parse/TextBereinigerTest.java
+++ b/src/test/java/eu/mulk/aendggner/aenderung/parse/TextBereinigerTest.java
@@ -21,7 +21,8 @@
 
   @Test
   void setztZerlegteUmlauteKanonischZusammen() {
-    // Das GV.-NRW.-Heft 7/2026 kodiert einen Teil seiner Umlaute zerlegt; für die Befehlsmuster wäre
+    // Das GV.-NRW.-Heft 7/2026 kodiert einen Teil seiner Umlaute zerlegt; für die Befehlsmuster
+    // wäre
     // „angefügt“ dann ein anderes Wort und dutzende Befehle könnten nie matchen.
     // Der Umlaut steht hier bewusst zerlegt (u + U+0308), wie im Heft.
     var roh = "Dem § 128 wird folgender Absatz 3 angefu\u0308gt:";
@@ -203,7 +204,8 @@
             + "Nächste eigene Zeile. \uE000";
 
     assertThat(TextBereiniger.bereinige(roh))
-        .isEqualTo("Erste Zeile des Absatzes wird fortgesetzt und endet hier.\nNächste eigene Zeile.");
+        .isEqualTo(
+            "Erste Zeile des Absatzes wird fortgesetzt und endet hier.\nNächste eigene Zeile.");
   }
 
   @Test
@@ -217,7 +219,8 @@
             + "Dieses Gesetz tritt am Tag nach der Verkündung in Kraft. \uE000";
 
     assertThat(TextBereiniger.bereinige(roh))
-        .isEqualTo("Artikel 2\nInkrafttreten\nDieses Gesetz tritt am Tag nach der Verkündung in Kraft.");
+        .isEqualTo(
+            "Artikel 2\nInkrafttreten\nDieses Gesetz tritt am Tag nach der Verkündung in Kraft.");
   }
 
   @Test
diff --git a/src/test/java/eu/mulk/aendggner/anwendung/BefehlAnwenderTest.java b/src/test/java/eu/mulk/aendggner/anwendung/BefehlAnwenderTest.java
index e9ecbcd..c12f118 100644
--- a/src/test/java/eu/mulk/aendggner/anwendung/BefehlAnwenderTest.java
+++ b/src/test/java/eu/mulk/aendggner/anwendung/BefehlAnwenderTest.java
@@ -260,8 +260,9 @@
 
     assertThat(ergebnis.protokoll().get(0).status()).isEqualTo(Status.ANGEWANDT);
     assertThat(absatzText(ergebnis.neu(), "§ 1", 1))
-        .contains("  1. das Einlesen von Gesetzen,\n  1a. die Prüfung von Zitaten,\n  2. die"
-            + " Anwendung von Befehlen und");
+        .contains(
+            "  1. das Einlesen von Gesetzen,\n  1a. die Prüfung von Zitaten,\n  2. die"
+                + " Anwendung von Befehlen und");
   }
 
   @Test
@@ -515,7 +516,8 @@
     // Ein Befehl → genau ein Protokolleintrag, aber beide Teiledits wirken.
     assertThat(ergebnis.protokoll()).hasSize(1);
     assertThat(ergebnis.protokoll().get(0).status()).isEqualTo(Status.ANGEWANDT);
-    assertThat(ergebnis.protokoll().get(0).betroffeneEnbez()).containsExactlyInAnyOrder("§ 1", "§ 2");
+    assertThat(ergebnis.protokoll().get(0).betroffeneEnbez())
+        .containsExactlyInAnyOrder("§ 1", "§ 2");
     assertThat(absatzText(ergebnis.neu(), "§ 1", 0))
         .isEqualTo("Zweck dieses Gesetzes ist die Prüfung.");
     assertThat(absatzText(ergebnis.neu(), "§ 2", 0)).startsWith("Prüfung ist die Prüfung");
@@ -550,7 +552,8 @@
   @Test
   void nummeriertParagraphUm() {
     var befehl =
-        new Umnummerierung(stelle(new Stelle.Paragraph("3")), stelle(new Stelle.Paragraph("4")), PROV);
+        new Umnummerierung(
+            stelle(new Stelle.Paragraph("3")), stelle(new Stelle.Paragraph("4")), PROV);
 
     var ergebnis = BefehlAnwender.anwenden(gesetz(), List.of(befehl));
 
@@ -580,7 +583,8 @@
   @Test
   void meldetKonfliktBeiParagraphUmnummerierung() {
     var befehl =
-        new Umnummerierung(stelle(new Stelle.Paragraph("3")), stelle(new Stelle.Paragraph("1")), PROV);
+        new Umnummerierung(
+            stelle(new Stelle.Paragraph("3")), stelle(new Stelle.Paragraph("1")), PROV);
 
     var ergebnis = BefehlAnwender.anwenden(gesetz(), List.of(befehl));
 
@@ -712,20 +716,26 @@
     var teile =
         List.<eu.mulk.aendggner.aenderung.Aenderungsbefehl>of(
             new Aufhebung(
-                stelle(new Stelle.Paragraph("1"), new Stelle.AbsatzNr("2"), new Stelle.NummerNr("1")),
+                stelle(
+                    new Stelle.Paragraph("1"), new Stelle.AbsatzNr("2"), new Stelle.NummerNr("1")),
                 PROV),
             new Aufhebung(
-                stelle(new Stelle.Paragraph("1"), new Stelle.AbsatzNr("2"), new Stelle.NummerNr("2")),
+                stelle(
+                    new Stelle.Paragraph("1"), new Stelle.AbsatzNr("2"), new Stelle.NummerNr("2")),
                 PROV),
             new Aufhebung(
-                stelle(new Stelle.Paragraph("1"), new Stelle.AbsatzNr("2"), new Stelle.NummerNr("3")),
+                stelle(
+                    new Stelle.Paragraph("1"), new Stelle.AbsatzNr("2"), new Stelle.NummerNr("3")),
                 PROV));
 
     var ergebnis = BefehlAnwender.anwenden(gesetz(), List.of(new Sammelbefehl(teile)));
 
     assertThat(ergebnis.protokoll().get(0).status()).isEqualTo(Status.ANGEWANDT);
     var text = absatzText(ergebnis.neu(), "§ 1", 1);
-    assertThat(text).contains("1. (weggefallen)").contains("2. (weggefallen)").contains("3. (weggefallen)");
+    assertThat(text)
+        .contains("1. (weggefallen)")
+        .contains("2. (weggefallen)")
+        .contains("3. (weggefallen)");
   }
 
   // --- Anhang/Anlage als Norm-Ziel -----------------------------------------------------------
@@ -737,12 +747,7 @@
         null,
         null,
         List.of(
-            new Norm(
-                "§ 1",
-                "Zweck",
-                null,
-                List.of(new Absatz("1", "Es gilt der Anhang.")),
-                false),
+            new Norm("§ 1", "Zweck", null, List.of(new Absatz("1", "Es gilt der Anhang.")), false),
             new Norm(
                 "Anhang",
                 "(zu § 1)",
@@ -1057,8 +1062,7 @@
   @Test
   void ersetztGesetzesUeberschrift() {
     var befehl =
-        new Neufassung(
-            stelle(new Stelle.Ueberschrift()), "Gesetz zur gründlichen Erprobung", PROV);
+        new Neufassung(stelle(new Stelle.Ueberschrift()), "Gesetz zur gründlichen Erprobung", PROV);
 
     var ergebnis = BefehlAnwender.anwenden(gesetz(), List.of(befehl));
 
@@ -1126,10 +1130,8 @@
   void nummeriertAufzaehlungsNummerImTextUm() {
     var befehl =
         new Umnummerierung(
-            stelle(
-                new Stelle.Paragraph("1"), new Stelle.AbsatzNr("2"), new Stelle.NummerNr("2")),
-            stelle(
-                new Stelle.Paragraph("1"), new Stelle.AbsatzNr("2"), new Stelle.NummerNr("4")),
+            stelle(new Stelle.Paragraph("1"), new Stelle.AbsatzNr("2"), new Stelle.NummerNr("2")),
+            stelle(new Stelle.Paragraph("1"), new Stelle.AbsatzNr("2"), new Stelle.NummerNr("4")),
             PROV);
 
     var ergebnis = BefehlAnwender.anwenden(gesetz(), List.of(befehl));
@@ -1163,10 +1165,8 @@
             List.of());
     var befehl =
         new Umnummerierung(
-            stelle(
-                new Stelle.Paragraph("1"), new Stelle.AbsatzNr("1"), new Stelle.NummerNr("2")),
-            stelle(
-                new Stelle.Paragraph("1"), new Stelle.AbsatzNr("1"), new Stelle.NummerNr("1")),
+            stelle(new Stelle.Paragraph("1"), new Stelle.AbsatzNr("1"), new Stelle.NummerNr("2")),
+            stelle(new Stelle.Paragraph("1"), new Stelle.AbsatzNr("1"), new Stelle.NummerNr("1")),
             PROV);
 
     var ergebnis = BefehlAnwender.anwenden(mitLuecke, List.of(befehl));
diff --git a/src/test/java/eu/mulk/aendggner/anwendung/SatzTeilerTest.java b/src/test/java/eu/mulk/aendggner/anwendung/SatzTeilerTest.java
index c0da1f3..47acc3b 100644
--- a/src/test/java/eu/mulk/aendggner/anwendung/SatzTeilerTest.java
+++ b/src/test/java/eu/mulk/aendggner/anwendung/SatzTeilerTest.java
@@ -115,7 +115,8 @@
         SatzTeiler.teileTexte(
             "Die Angebote können zusammengefasst werden. § 27 Absatz 2 bleibt unberührt.");
 
-    assertThat(saetze).containsExactly(
-        "Die Angebote können zusammengefasst werden.", "§ 27 Absatz 2 bleibt unberührt.");
+    assertThat(saetze)
+        .containsExactly(
+            "Die Angebote können zusammengefasst werden.", "§ 27 Absatz 2 bleibt unberührt.");
   }
 }
diff --git a/src/test/java/eu/mulk/aendggner/gesetz/land/LandesRechtTextParserTest.java b/src/test/java/eu/mulk/aendggner/gesetz/land/LandesRechtTextParserTest.java
index 77249f6..897a440 100644
--- a/src/test/java/eu/mulk/aendggner/gesetz/land/LandesRechtTextParserTest.java
+++ b/src/test/java/eu/mulk/aendggner/gesetz/land/LandesRechtTextParserTest.java
@@ -159,7 +159,9 @@
     // Unnummerierter Einzelabsatz und weggefallene Norm wie im bayerischen Fall.
     assertThat(gesetz.norm("§ 2").orElseThrow().absaetze().get(0).nummer()).isNull();
     assertThat(gesetz.norm("§ 3").orElseThrow().weggefallen()).isTrue();
-    assertThat(gesetz.gliederungen()).extracting(Gliederung::anzeigeText).containsExactly("I. Teil — Grundlagen der Gemeindeverfassung");
+    assertThat(gesetz.gliederungen())
+        .extracting(Gliederung::anzeigeText)
+        .containsExactly("I. Teil — Grundlagen der Gemeindeverfassung");
   }
 
   @Test