Der Korpus sagt, woran die Reste im Ganzen liegen

Der Befund über das Erzeugnis ruhte auf handverlesenen Fällen. Rund drei Dutzend
Akzeptanzprüfungen sagen, dass diese Hefte aufgehen; sie sagen nicht, woran die
Reste im Ganzen liegen — ob an der Befehlssprache eines Landes, an der
Aufbereitung des Druckwerks oder am Alter der eingesetzten Stammfassung. Die
Auszählung der Gründe beantwortet das für ein Heft; über einen Korpus geführt
beantwortet sie es für das Erzeugnis.

Der Schalter --korpus arbeitet eine Auftragsliste ab und gibt je Auftrag eine
Zeile Kennzahlen aus: erschlossene, angewandte, liegengebliebene und am Stichtag
zurückgestellte Befehle, sodann die gleichen, geprüften, fehlenden, überzähligen
und abweichenden Normen des Abgleichs, zuletzt die Gründe nach Häufigkeit. Die
Liste nennt dieselben Angaben, die auch die Befehlszeile entgegennimmt — ein
Auftrag ist nichts anderes als ein Lauf. Mit --synopsen bleiben die
Einzelsynopsen samt einer Übersichtsseite stehen; ohne sie wäre der Bericht eine
Zahlenreihe, aus der niemand den Grund eines Restes erführe.

Eingecheckt ist der Bericht die Grundlinie. --grundlinie hält den Lauf dagegen
und rügt allein, was fällt: weniger erschlossene oder angewandte Befehle, weniger
gleiche Normen, mehr liegengebliebene, fehlende, überzählige oder abweichende.
Ein Fortschritt ist kein Fehler, sondern der Zweck der Arbeit; er verlangt
allein, die Grundlinie fortzuschreiben. Der Rückschritt endet mit 3 wie ein nicht
aufgehender Abgleich. Ein gescheiterter Auftrag hält den Lauf nicht an, sondern
trägt seinen Fehlertext in seiner Zeile — der Grundsatz der Nichtverwerfung gilt
auch hier.

Der mitgelieferte Korpus umfasst einunddreißig Aufträge und gibt 1413 Befehle
her, von denen 1287 angewandt werden; 632 von 641 verglichenen Normen gehen auf.
Er reproduziert die Zahlen der bestehenden Akzeptanzfälle (UWG 19/0, GEG 119/119,
BayJG 154/154, Berlin 171/171, WDR 101, Bremen 41/37, Hamburg 21/17). Drei
Aufträge tragen mit Absicht hohe Reste: Bei den beiden Beschlussempfehlungen und
bei Rheinland-Pfalz schreibt die Vorlage eine ältere Fassung fort als die
eingesetzte Stammfassung. Sie sind gleichwohl Wächter — steigen ihre Reste, so
hat sich etwas verschlechtert.

Nebenbei: Die Auszählung der Gründe stand doppelt (Befehlszeile und Synopse) und
liegt nun in Pipeline.zaehleGruende; das Ergebnis der Pipeline führt sie mit.

Geprüft: mvnw verify (443 Testfälle) und reuse lint (214/214) gehen durch; der
Korpuslauf ist Teil der Prüfung. Die Rügeregel ist am ganzen Korpus erprobt: Eine
um eins verschärfte Grundlinie führt zur Rüge „UWG-BGBl: angewandte Befehle 19
statt 20“ und zum Rückgabewert 3.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Change-Id: I4e10b041b78d95772da1c3ff18ab92b0b45dacaa
diff --git a/deploy/korpuslauf.sh b/deploy/korpuslauf.sh
new file mode 100755
index 0000000..be0533a
--- /dev/null
+++ b/deploy/korpuslauf.sh
@@ -0,0 +1,55 @@
+#!/bin/sh
+# SPDX-FileCopyrightText: 2026 Matthias Andreas Benkard <code@mail.matthias.benkard.de>
+# SPDX-License-Identifier: AGPL-3.0-or-later
+
+# Führt den Massenlauf über den Beispielkorpus (§ 6d des Handbuchs) und legt Bericht und
+# Einzelsynopsen in einem Ausgabeverzeichnis ab.
+#
+# Anders als die Akzeptanzprüfungen, die dasselbe im Rahmen von „mvnw verify“ tun, dient
+# dieses Skript dem Hinsehen: Es behält die Synopsen, damit sich jeder Rest an seinem
+# eigenen Dokument nachschlagen lässt, und es nennt den Bericht in der Fassung, in der er
+# auch als Grundlinie liegt.
+#
+#   deploy/korpuslauf.sh [ausgabeverzeichnis] [auftragsliste]
+#
+# Voreinstellungen: target/korpus und src/test/resources/sampledata/korpus.tsv.
+# Rückgabewert 3, wenn eine Kennzahl hinter die Grundlinie zurückfällt (wie beim Abgleich
+# mit der amtlichen Nachfassung, § 6b Absatz 3).
+#
+# Ist eine neue Grundlinie zu setzen — weil eine Kennzahl gestiegen ist —, so tut das:
+#   cp target/korpus/bericht.tsv src/test/resources/sampledata/korpus-grundlinie.tsv
+# nebst der Vorbemerkung, die in jener Datei steht.
+
+set -eu
+
+wurzel="$(CDPATH='' cd -- "$(dirname -- "$0")/.." && pwd)"
+ziel="${1:-$wurzel/target/korpus}"
+liste="${2:-$wurzel/src/test/resources/sampledata/korpus.tsv}"
+grundlinie="$wurzel/src/test/resources/sampledata/korpus-grundlinie.tsv"
+jar="$wurzel/target/aendggner-0.1.0-SNAPSHOT.jar"
+
+if [ ! -f "$liste" ]; then
+  echo "Die Auftragsliste $liste fehlt." >&2
+  exit 1
+fi
+
+if [ ! -f "$jar" ]; then
+  echo "Das Erzeugnis fehlt; es wird hergestellt."
+  (cd "$wurzel" && ./mvnw -q package -DskipTests)
+fi
+
+mkdir -p "$ziel"
+
+set +e
+java -jar "$jar" \
+  --korpus "$liste" \
+  --grundlinie "$grundlinie" \
+  --synopsen "$ziel/synopsen" \
+  -o "$ziel/bericht.tsv"
+ergebnis=$?
+set -e
+
+echo
+echo "Bericht:   $ziel/bericht.tsv"
+echo "Synopsen:  $ziel/synopsen"
+exit "$ergebnis"