aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthias Andreas Benkard <code@mail.matthias.benkard.de>2026-08-22 21:06:24 +0200
committerMatthias Andreas Benkard <code@mail.matthias.benkard.de>2026-08-22 21:06:24 +0200
commit3dc36d42586b7d3e44f6dfbd3fc35b50534747c8 (patch)
tree350755aef473f27721c753e891e6c9b583714401
parent08c2747e37a421232c728d038118dfcde54376dc (diff)
Wer das Verzeichnis öffnet, erfährt zuerst, worum es geht
Das README begann mit einer Tabelle, deren beide Einträge tot sind — Bintray ist seit 2021 eingestellt, und „MantisBT“ steht ohne Anschrift da —, setzte mit englischen Bauanweisungen fort und ließ den Leser erst im vierten Abschnitt erfahren, was das Erzeugnis überhaupt tut. Wer es zum ersten Mal aufschlug, fand weder den Zweck noch das Problem, dem es abhilft. Vorangestellt ist deshalb ein Vorspann, der beides in zwei Absätzen sagt: Ein Änderungsgesetz nennt nicht, was künftig gilt, sondern nur, was zu tun ist, und wer wissen will, was ein Entwurf bewirken würde, findet in keinem amtlichen Angebot eine Antwort, denn konsolidiert wird erst nach der Verkündung. Darunter der Zweizeiler für den ersten Lauf und der Verweis auf die Browserfassung. Der Aufbau folgt fortan der Form, die dem Gegenstand entspricht: siebzehn Paragraphen mit amtlichen Überschriften, Absätzen und Binnenverweisungen, durchgehend deutsch, wie es das Verzeichnis der Fassungen seit jeher hält. Neu hinzu treten die Begriffsbestimmungen, die dem Unkundigen das Vokabular geben, das der Fachteil bislang stillschweigend voraussetzte — Stammgesetz, Änderungsdokument, Änderungsbefehl, Norm, Synopse und wann ein Befehl als angewandt gilt —, sowie der Aufbau des Quelltextes, denn ein Einstiegspunkt sollte sagen, wo was liegt. Der Fachteil selbst ist ungekürzt übernommen und tritt hinter den Einstieg zurück; allein die vierzehn erkannten Sonderformen sind aus einem Satz in eine Aufzählung überführt. Die Ressourcentabelle weicht den geltenden Angaben: Betriebsanschrift, Quelltextspiegel, Lizenz und Fassungsverzeichnis. Die Abschnittsnummerierung ist abgeschaltet, weil neben jedem Paragraphen sonst noch eine zweite Zählung stünde. Das Dokument übersetzt ohne Beanstandung; das Inhaltsverzeichnis führt alle siebzehn Paragraphen in ihrer Folge, und jeder Anker löst auf. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Change-Id: Ie9d71c13a461660b86839ca35f872a85a4163117
-rw-r--r--README.adoc806
1 files changed, 493 insertions, 313 deletions
diff --git a/README.adoc b/README.adoc
index 937bcae..996a0be 100644
--- a/README.adoc
+++ b/README.adoc
@@ -3,83 +3,175 @@ Matthias Andreas Benkard
// Meta
:experimental:
:data-uri:
-:sectnums:
+:sectnums!:
:toc:
:stem:
:toclevels: 2
-:description: Handbuch der Nichtamtlichen Zentralstelle für die maschinelle Fortschreibung von Stammgesetzen
+:description: Handbuch der Nichtamtlichen Zentralstelle für die maschinelle Fortschreibung von Stammgesetzen: Werkzeug, das Änderungsgesetze und Gesetzentwürfe selbsttätig auf ein Stammgesetz anwendet und das Ergebnis als Synopse ausgibt
:keywords: mulk
// Settings
:icons: font
:source-highlighter: pygments
-== Resources
+[.lead]
+Ein Änderungsgesetz sagt nicht, was künftig gilt. Es sagt nur, was zu tun ist:
+„In § 4 Absatz 2 Satz 1 werden die Wörter „X“ durch die Wörter „Y“ ersetzt.“
+Wer wissen will, wie die Vorschrift danach lautet, muss Hunderte solcher Befehle
+von Hand nachvollziehen — und wer wissen will, was ein Entwurf bewirken _würde_,
+findet in keinem amtlichen Angebot eine Antwort, denn konsolidiert wird erst nach
+der Verkündung.
-|===
-|Resource |Links
+ÄndGgner nimmt diese Arbeit ab. Eingegeben werden ein Stammgesetz in geltender
+Fassung und ein oder mehrere Änderungsdokumente — verkündete Änderungsgesetze aus
+dem Bundesgesetzblatt und den Gesetz- und Verordnungsblättern der Länder ebenso
+wie Referenten-, Regierungs- und Fraktionsentwürfe, Änderungsanträge und
+Beschlussempfehlungen. Ausgegeben wird eine zweispaltige Synopse: links die
+bisherige, rechts die künftige Fassung, die Unterschiede wortweise hervorgehoben.
-|Public Artifact
-|https://bintray.com/mulk/maven/aendggner[Bintray]
-
-|Bug Tracker
-|MantisBT
-|===
-
-
-[[building]]
-== Building a JAR
+[source,shell script]
+----
+./mvnw package
+java -jar target/aendggner-0.1.0-SNAPSHOT.jar stammgesetz.xml aenderungsgesetz.pdf -o synopse.html
+----
-To build an executable JAR at `target/aendggner-${REVISION}.jar`:
+Ohne Einrichtung läuft dasselbe im Browser unter
+https://matthias.benkard.de/aendggner/; die dort angebotenen zwei
+durchgerechneten Beispiele sind der kürzeste Weg zum ersten Ergebnis
+(§ 14).
+
+
+[[gegenstand]]
+== § 1 Gegenstand und Zweck
+
+(1) Dieses Handbuch regelt Herstellung, Betrieb und Anwendung des
+Softwareerzeugnisses „ÄndGgner“ (nachstehend: das Erzeugnis).
+
+(2) Das Erzeugnis dient der maschinellen Fortschreibung von Stammgesetzen anhand
+von Änderungsvorschriften des Bundes und der Länder. Es erschließt aus einem
+Änderungsdokument die darin enthaltenen Änderungsbefehle, wendet sie auf die
+geltende Fassung des Stammgesetzes an und stellt beide Fassungen einander
+gegenüber.
+
+(3) Das Erzeugnis ist nichtamtlich. Seine Ausgabe ist weder eine amtliche
+Bekanntmachung noch eine Rechtsauskunft; maßgeblich bleibt allein der Wortlaut
+des Gesetz- und Verordnungsblattes. Bei Entwürfen, Anträgen und
+Beschlussempfehlungen zeigt die Synopse überdies nur, was gälte, wenn die Vorlage
+so beschlossen würde; sie trägt hierauf den Hinweis *Entwurfsfassung — nicht
+geltendes Recht*.
+
+(4) Es gilt der Grundsatz der Nichtverwerfung: Ein Befehl, der sich nicht
+zweifelsfrei anwenden lässt — etwa weil er gegen eine ältere Gesetzesfassung
+gerichtet ist, deren Zieltext nicht mehr besteht —, wird mitsamt der Begründung
+seines Scheiterns in den Abschnitt *Manuell prüfen* der Synopse aufgenommen. Er
+wird niemals stillschweigend übergangen.
+
+
+[[begriffe]]
+== § 2 Begriffsbestimmungen
+
+Im Sinne dieses Handbuchs ist
+
+Stammgesetz::
+ das zu ändernde Gesetz in seiner geltenden (konsolidierten) Fassung, also
+ dasjenige Werk, dessen Fortschreibung begehrt wird. Bundesrecht wird als
+ gii-Norm-XML von https://www.gesetze-im-internet.de/[gesetze-im-internet.de]
+ angenommen, Landesrecht als konsolidierte Fassung aus dem jeweiligen
+ Landesportal (§ 5).
+Änderungsdokument::
+ das Werk, das die Änderung anordnet. Hierzu zählen das verkündete
+ Änderungsgesetz, der Gesetzentwurf, der Änderungsantrag und die
+ Beschlussempfehlung (§ 10).
+Änderungsbefehl::
+ die einzelne Anordnung innerhalb des Änderungsdokuments, gerichtet auf eine
+ bestimmte Stelle des Stammgesetzes („In § 4 Absatz 2 Satz 1 werden die Wörter
+ „X“ durch die Wörter „Y“ ersetzt“). Welche Befehlsformen erkannt werden,
+ bestimmt § 7.
+Norm::
+ die kleinste selbständig bezeichnete Einheit des Stammgesetzes, im Bundesrecht
+ und im Landesrecht der übrigen Länder der Paragraph, im bayerischen Landesrecht
+ der Artikel (§ 13). Auch die Inhaltsübersicht und die Gesetzesüberschrift
+ werden als Normen geführt, weil Änderungsbefehle auf sie zielen.
+Synopse::
+ die Ausgabe des Erzeugnisses: eine zweispaltige Gegenüberstellung der bisherigen
+ und der künftigen Fassung im Format HTML, gefolgt vom Protokoll der Anwendung
+ und dem Abschnitt *Manuell prüfen* nach § 1 Absatz 4.
+Angewandt::
+ gilt ein Befehl erst, wenn er im Wortlaut des Stammgesetzes gegriffen hat. Bei
+ Verbünden mehrerer Teile (§ 8 Absatz 3) gilt der Befehl nur dann als angewandt,
+ wenn jeder seiner Teile gegriffen hat.
+
+
+[[bezugsquellen]]
+== § 3 Bezugsquellen und Anschriften
+
+(1) Die Browserfassung wird betrieben unter
+https://matthias.benkard.de/aendggner/.
+
+(2) Fortlaufende Quelltextquelle ist
+https://gerrit.benkard.de/plugins/gitiles/aendggner. Die jeweils betriebene
+Fassung liegt der Browserfassung überdies als `aendggner-quelltext.tar.gz` bei
+(§ 15 Absatz 4).
+
+(3) Das Erzeugnis steht unter der GNU Affero General Public License, Fassung 3;
+der Lizenztext ist der Datei `COPYING` zu entnehmen.
+
+(4) Der Stand des Quelltextes wird nach Kalendertagen im Verzeichnis der
+Fassungen (`FASSUNGEN.txt`) geführt.
+
+
+[[herstellung]]
+== § 4 Herstellung des Erzeugnisses
+
+(1) Die ausführbare Archivdatei wird durch den nachstehenden Befehl unter
+`target/aendggner-${REVISION}.jar` erzeugt:
[source,shell script]
----
./mvnw package
----
-`${REVISION}` defaults to `0.1.0-SNAPSHOT` unless you override it by
-passing the `-Drevision` flag to `mvnw`.
+(2) Die Fassungsbezeichnung `${REVISION}` nach Absatz 1 lautet
+`0.1.0-SNAPSHOT`, soweit sie nicht durch Übergabe des Schalters `-Drevision` an
+`mvnw` abweichend bestimmt wird.
+(3) Vorausgesetzt wird ein Java-Entwicklungsbausatz der Fassung 21 oder neuer.
+Für die Herstellung der Browserfassung gilt abweichend § 14 Absatz 3.
-== Running the Command Line Application
-To run the command line application after <<building,building>> it:
+[[eingaben]]
+== § 5 Zulässige Eingaben
-[source,shell script]
-----
-./mvnw exec:java
-----
+(1) Als Stammgesetz des Bundes wird XML im gii-norm-Format von
+https://www.gesetze-im-internet.de/[gesetze-im-internet.de] angenommen. Das
+Portal gibt seine Werke nur als Archiv aus (`…/<kurz>/xml.zip`); das Archiv wird
+unmittelbar angenommen und der enthaltene XML-Eintrag daraus entpackt, ein
+Zwischenschritt von Hand entfällt.
+
+(2) Als Stammgesetz eines Landes wird die konsolidierte Fassung als PDF oder als
+kanonischer Klartext im Format der `--extract-only`-Ausgabe (§ 6 Absatz 2)
+angenommen. Hierbei gilt:
+
+1. Eine Zeile „Inhaltsübersicht“ eröffnet die gleichnamige Norm, auf die die
+ Angabe-Befehle zielen; ihre Zeilen tragen das Übersichtsformat
+ „§ N | Titel“.
+2. Amtliche Satznummern und Fußnotenmarker stehen als Unicode-Superskripte im
+ Text („¹Die freilebende Tierwelt …“, „Enteignung⁶)“). Ob sie erhalten bleiben,
+ ergibt sich aus der geladenen Stammfassung, nicht aus einer Länderkennung.
+3. Das Zitiersigel (§ oder Art.) folgt gleichfalls aus den Normköpfen der
+ Stammfassung.
+(3) Als Änderungsdokument werden PDF-Dateien des Bundesgesetzblattes, der
+Gesetz- und Verordnungsblätter der Länder und der Drucksachen von Bundestag,
+Bundesrat und Landtagen sowie Klartext angenommen. Die Dokumentart wird aus dem
+Text erschlossen, nicht aus dem Dateinamen (§ 10). Änderungsanträge dürfen
+zusammen mit demjenigen Entwurf angegeben werden, den sie ändern (§ 11).
-[[usage]]
-== Usage
-
-ÄndGgner erzeugt aus einem Stammgesetz und einem Änderungsgesetz eine
-zweispaltige HTML-Synopse (alte Fassung links, neue rechts, Änderungen
-wortweise hervorgehoben).
-
-Eingaben:
-
-* Stammgesetz (Bundesrecht): XML im gii-norm-Format von
- https://www.gesetze-im-internet.de/[gesetze-im-internet.de]. Das Portal gibt
- es nur als Archiv aus (`…/<kurz>/xml.zip`); das Archiv wird unmittelbar
- angenommen und der enthaltene XML-Eintrag daraus entpackt, ein Zwischenschritt
- von Hand entfällt.
-* Stammgesetz (Landesrecht): konsolidierte Fassung als PDF oder als
- kanonischer Klartext im Format der `--extract-only`-Ausgabe. Eine Zeile
- „Inhaltsübersicht“ eröffnet darin die gleichnamige Norm, auf die die
- Angabe-Befehle zielen; ihre Zeilen tragen das Übersichtsformat
- „§ N | Titel“. Amtliche
- Satznummern und Fußnotenmarker stehen als Unicode-Superskripte im
- Text („¹Die freilebende Tierwelt …“, „Enteignung⁶)“); ob sie erhalten
- bleiben, ergibt sich aus der geladenen Stammfassung, nicht aus einer
- Länderkennung. Ebenso folgt das Zitiersigel (§ oder Art.) aus den
- Normköpfen der Stammfassung.
-* Änderungsdokument: BGBl-, GVBl- oder Drucksachen-PDF (Bundestag,
- Bundesrat, Landtage) oder Klartext. Die Dokumentart wird aus dem Text
- erschlossen, nicht aus dem Dateinamen (siehe <<quellformate>>);
- Änderungsanträge dürfen zusammen mit dem Entwurf angegeben werden, den
- sie ändern.
+
+[[betrieb]]
+== § 6 Betrieb der Befehlszeilenfassung
+
+(1) Nach der Herstellung nach § 4 wird das Erzeugnis wie folgt aufgerufen:
[source,shell script]
----
@@ -87,135 +179,140 @@ java -jar target/aendggner-0.1.0-SNAPSHOT.jar \
stammgesetz.xml aenderungsgesetz.pdf -o synopse.html
----
-Wichtige Optionen:
+(2) Von den Schaltern sind die folgenden von allgemeiner Bedeutung:
`-o, --output <file>`::
- Ausgabedatei (Default `synopse.html`; `-` = Standardausgabe).
+ Ausgabedatei (Vorgabe `synopse.html`; „`-`“ bezeichnet die Standardausgabe).
`--vollstaendig`::
Auch unveränderte Normen in die Synopse aufnehmen.
`--artikel <n>`::
- Nur diesen Artikel des Änderungsgesetzes anwenden (Default: alle
- Artikel, deren Einleitung das Stammgesetz nennt).
+ Nur den bezeichneten Artikel des Änderungsgesetzes anwenden. Ohne diese Angabe
+ werden alle Artikel angewandt, deren Einleitung das Stammgesetz nennt.
`--extract-only`::
- Nur den bereinigten Lineartext des Änderungsgesetzes ausgeben. Nützlich,
- wenn die PDF-Extraktion fehlerhaft ist: Text prüfen, von Hand
- korrigieren und als Klartextdatei wieder einspeisen.
-
-Erkannt werden die gebräuchlichsten Änderungsbefehle des Handbuchs der
-Rechtsförmlichkeit (Ersetzen, Neufassung, Einfügen, Anfügen, Aufheben,
-Streichen, Umnummerierung) einschließlich zahlreicher Sonderformen:
-Bereichs- und Koordinationsziele („Die Absätze 8 und 9 werden durch die
-folgenden Absätze 8 bis 10 ersetzt“), strukturelle Streichungen ganzer
-Einheiten („§ 9 wird gestrichen“), §- und Gliederungs-Umnummerierungen
-(„§ 9a wird zu § 9“, „Der bisherige Abschnitt 2 wird zu Abschnitt 3“),
-das Einfügen/Ersetzen ganzer §-Blöcke, Chapeau-Lokatoren („Im
-Satzteil vor Nummer 1 …“), Änderungen an Anhängen und Anlagen („Der
-Anhang wird wie folgt geändert: … Nach Nummer 2 wird die folgende
-Nummer 2a eingefügt“), Angabe-Befehle auf die Inhaltsübersicht (gefasst,
-ersetzt, eingefügt, gestrichen — sie werden auf die
-Inhaltsübersichts-Norm angewandt), das Einfügen und Ersetzen von
-Gliederungs-Überschriften („Nach § 33 werden die folgenden Überschriften
-zu Teil 3 … eingefügt“), Voranstellungen, Mehrfach-Ersetzungs- und
--Einfügepaare, Einfügungen, deren Position ein Wortanker statt einer
-Stellenangabe bestimmt („Vor den Wörtern „Aus dem Bereich Verkehr:“ wird
-folgender Absatz 5 eingefügt“), Verbünde aus Umnummerierung und
-Folgeänderung („§ 50 wird zu § 38 und wird wie folgt geändert“, „Die
-bisherige Nr. 7 wird Nr. 5 und das Komma wird durch das Wort „und“
-ersetzt“ — eine Satzzeichen-Operation meint dabei stets die soeben
-umnummerierte Einheit, weil ihr Zieltext nichts unterscheidet),
-Verb-Rahmen, deren Unterpunkte allein die Fundstelle tragen („Es werden
-ersetzt: … in § 35 Absatz 3 die Angabe „X“ jeweils durch die Angabe
-„Y“,“) sowie die Neufassung der Gesetzesüberschrift.
-
-Angewandt wird nicht stur in Dokumentreihenfolge: Umnummerierungen
-beziehen sich stets auf die ursprüngliche Zählung, nicht auf den Stand
-nach den vorangegangenen Punkten. Wer eine Bezeichnung räumt, kommt
-deshalb vor den, der sie neu besetzt. Aus dieser einen Regel folgt die
-absteigende Abarbeitung einer aufsteigenden Kaskade („Der bisherige
-Absatz 3 wird Absatz 4“, „Der bisherige Absatz 4 wird Absatz 5“, …)
-ebenso wie der Vorrang einer Umnummerierung vor der Einfügung, die deren
-Bezeichnung neu vergibt. Wer vorrückt, nimmt dabei seine eigenen Räumer
-mit: Auch eine über mehrere Punkte verschränkte Kaskade („Die bisherige
-Nr. 15 wird Nr. 16“, „Die bisherigen Nrn. 13 und 14 werden die Nrn. 14
-und 15“, „Nach Nr. 12 wird folgende Nr. 13 eingefügt“) tritt deshalb
-geschlossen vor die Einfügung, nicht bloß mit ihrem letzten Glied.
-
-Geordnet werden nicht die Befehle, sondern die einzelnen
-Anwendungsschritte. Ein Verbund aus Umnummerierung und Folgeänderung
-trägt nämlich zwei gegenläufige zeitliche Ansprüche: Die Umnummerierung
-gehört nach vorn, die Folgeänderung dagegen an ihre Dokumentstelle, weil
-sie die vorangegangenen Punkte als vollzogen voraussetzt — „Die
-bisherige Nr. 11 wird Nr. 12 und die Angabe „schriftliche“ wird
-gestrichen“ ist vorgezogen mehrdeutig, weil erst ein früherer Punkt die
-zweite Fundstelle des Wortes beseitigt. Verschoben wird stets nur nach
-vorn. Das Protokoll bleibt gleichwohl befehlsweise: Ein Verbund gilt nur
-dann als angewandt, wenn jeder seiner Teile gegriffen hat, sonst nennt
-die Meldung den Teil und den Grund.
-
-Die PDF-Aufbereitung toleriert Drucksachen-Artefakte (Seitenköpfe
-und -füße, Vorabfassungs-Wasserzeichen, vertauschte oder gerade
-Anführungszeichen, verklebte Wortgrenzen, zerlegt kodierte Umlaute) und
-bestimmt die Brotschrift seitenweise, sodass auch
-Ministeriumsentwürfe mit gemischten Layouts vollständig extrahiert
-werden. Fehlt im amtlichen Satz ein schließendes Anführungszeichen, endet
-das Zitat an der nächsten Strukturgrenze — an einer Artikel-Überschrift
-oder, wo die Anführungszeichen eines Artikels nachweislich nicht
-aufgehen, am nächsten Aufzählungspunkt des Änderungsgesetzes; gemeldet
-wird das als Warnung. Auf den
-Beispieldaten werden damit alle Befehle der BGBl-Fassungen und der
-aktuellen Entwürfe angewandt (UWG/AGG/ProdHaftG: 0 manuell); was
-unsicher bleibt — etwa Befehle gegen eine ältere Gesetzesfassung, deren
-Zieltext nicht mehr existiert — landet mit Begründung im Abschnitt
-*Manuell prüfen* der Synopse und wird niemals stillschweigend verworfen.
-
-Für das bayerische Landesrecht versteht ÄndGgner die dortigen
-Konventionen: Stammgesetze gliedern sich in Artikel („Art. 6 Abs. 2
-Satz 1 Nr. 2“, durchgängig abgekürzt zitiert), Änderungsgesetze dagegen
-in Paragraphen — auch mehrere Gesetze in einem GVBl-Heft, aus denen die
-auf das Stammgesetz zielenden §§ (einschließlich „Weitere Änderung“)
-anhand des Einleitungssatzes ausgewählt werden. Amtliche Satznummern
-bleiben als Superskripte erhalten und dienen als exakte Satzgrenzen;
-zusätzlich erkannt werden die bayerischen Befehlsformen („Fußnote 1
-wird aufgehoben“, „In Satz 1 wird die Satznummerierung „1“ gestrichen“,
-„Dem Wortlaut werden die folgenden Abs. 1 bis 4 vorangestellt“, „Der
-bisherige Wortlaut wird Abs. 5“, Halbsatz-Ziele, Klauselketten mit
-gemeinsamem Schlussverb) sowie das Fortführungszeichen des GVBl (jedes
-neugefasste Aufzählungsglied öffnet erneut mit „). Der Fall ist gegen
-die amtliche Nachfassung belegt: Alle 154 auf das BayJG zielenden
-Befehle des Heftes 6/2026 werden an 54 Normen selbsttätig angewandt,
-auch die verschränkte Neunummerierung des Bußgeldkatalogs in Art. 56.
+ Nur den bereinigten Lineartext des Änderungsdokuments ausgeben. Dies ist
+ angezeigt, wenn die PDF-Aufbereitung (§ 9) fehlerhaft bleibt: Der Text ist zu
+ prüfen, von Hand zu berichtigen und als Klartextdatei wieder einzuspeisen.
-Die übrigen Länder gliedern ihre Stammgesetze wie der Bund in
-Paragraphen; die Unterschiede liegen im Gesetzblatt-Satz und in
-Befehlsidiomen. Belegt sind Sachsen (SächsBeamtVG), Niedersachsen
-(NEFG), Thüringen (ThürKigaFinVO) und Nordrhein-Westfalen — dort alle
-vier ändernden Artikel eines
-Heftes: Telemedienzuständigkeitsgesetz, Landesmediengesetz,
-Ausführungsgesetz zum 17. Rundfunkänderungsstaatsvertrag und, mit 101
-Befehlen an 31 Normen der größte Fall des Heftes, das WDR-Gesetz —
-mit Akzeptanztests gegen die
-amtlichen Nachfassungen; für Schleswig-Holstein, Berlin und Hessen
-reicht die Prüfung bis zur Befehlserkennung — dort vollständig, aber ohne
-Anwendung —, weil deren Landesportale ihre Stammfassungen nur über eine
-anmeldepflichtige Schnittstelle ausgeben. Thüringens Portal gibt sie
-ebensowenig aus; dort ist die konsolidierte Fassung aus dem Stammheft und
-den drei Änderungsheften des Gesetzblattes zusammengesetzt, die die
-Parlamentsdatenbank des Landtags frei ausgibt. Welche Konvention welches Land beisteuert, welche
-Stammfassungen woher stammen und was noch offen ist, verzeichnet
-`src/main/resources/sampledata/Landesrecht-Beispiele.adoc`.
+(3) Ein Aufruf unmittelbar aus dem Arbeitsbaum, ohne vorherige Herstellung nach
+§ 4, ist zulässig:
+
+[source,shell script]
+----
+./mvnw exec:java
+----
+
+(4) Die vollständige Schalterliste einschließlich der Schalter für die
+Fehlersuche gibt `--help` aus.
+
+
+[[befehle]]
+== § 7 Erkannte Änderungsbefehle
+
+(1) Erkannt werden die gebräuchlichsten Änderungsbefehle des Handbuchs der
+Rechtsförmlichkeit, nämlich Ersetzen, Neufassung, Einfügen, Anfügen, Aufheben,
+Streichen und Umnummerierung.
+
+(2) Von den Sonderformen sind erkannt:
+
+1. Bereichs- und Koordinationsziele („Die Absätze 8 und 9 werden durch die
+ folgenden Absätze 8 bis 10 ersetzt“);
+2. strukturelle Streichungen ganzer Einheiten („§ 9 wird gestrichen“);
+3. §- und Gliederungs-Umnummerierungen („§ 9a wird zu § 9“, „Der bisherige
+ Abschnitt 2 wird zu Abschnitt 3“);
+4. das Einfügen und Ersetzen ganzer §-Blöcke;
+5. Chapeau-Lokatoren („Im Satzteil vor Nummer 1 …“);
+6. Änderungen an Anhängen und Anlagen („Der Anhang wird wie folgt geändert: …
+ Nach Nummer 2 wird die folgende Nummer 2a eingefügt“);
+7. Angabe-Befehle auf die Inhaltsübersicht (gefasst, ersetzt, eingefügt,
+ gestrichen); sie werden auf die Inhaltsübersichts-Norm angewandt;
+8. das Einfügen und Ersetzen von Gliederungs-Überschriften („Nach § 33 werden
+ die folgenden Überschriften zu Teil 3 … eingefügt“);
+9. Voranstellungen;
+10. Mehrfach-Ersetzungs- und -Einfügepaare;
+11. Einfügungen, deren Position ein Wortanker statt einer Stellenangabe bestimmt
+ („Vor den Wörtern „Aus dem Bereich Verkehr:“ wird folgender Absatz 5
+ eingefügt“);
+12. Verbünde aus Umnummerierung und Folgeänderung („§ 50 wird zu § 38 und wird
+ wie folgt geändert“, „Die bisherige Nr. 7 wird Nr. 5 und das Komma wird durch
+ das Wort „und“ ersetzt“). Eine Satzzeichen-Operation meint dabei stets die
+ soeben umnummerierte Einheit, weil ihr Zieltext nichts unterscheidet;
+13. Verb-Rahmen, deren Unterpunkte allein die Fundstelle tragen („Es werden
+ ersetzt: … in § 35 Absatz 3 die Angabe „X“ jeweils durch die Angabe „Y“,“),
+ sowie
+14. die Neufassung der Gesetzesüberschrift.
+
+(3) Landesrechtliche Befehlsformen bestimmt ergänzend § 13.
+
+
+[[reihenfolge]]
+== § 8 Reihenfolge der Anwendung
+
+(1) Angewandt wird nicht stur in Dokumentreihenfolge. Umnummerierungen beziehen
+sich stets auf die ursprüngliche Zählung, nicht auf den Stand nach den
+vorangegangenen Punkten; wer eine Bezeichnung räumt, kommt deshalb vor den, der
+sie neu besetzt.
+
+(2) Aus Absatz 1 folgt
+
+1. die absteigende Abarbeitung einer aufsteigenden Kaskade („Der bisherige
+ Absatz 3 wird Absatz 4“, „Der bisherige Absatz 4 wird Absatz 5“, …) sowie
+2. der Vorrang einer Umnummerierung vor derjenigen Einfügung, die deren
+ Bezeichnung neu vergibt.
+
+Wer vorrückt, nimmt dabei seine eigenen Räumer mit: Auch eine über mehrere Punkte
+verschränkte Kaskade („Die bisherige Nr. 15 wird Nr. 16“, „Die bisherigen Nrn. 13
+und 14 werden die Nrn. 14 und 15“, „Nach Nr. 12 wird folgende Nr. 13 eingefügt“)
+tritt geschlossen vor die Einfügung, nicht bloß mit ihrem letzten Glied.
+
+(3) Geordnet werden nicht die Befehle, sondern die einzelnen Anwendungsschritte.
+Ein Verbund aus Umnummerierung und Folgeänderung (§ 7 Absatz 2 Nummer 12) trägt
+nämlich zwei gegenläufige zeitliche Ansprüche: Die Umnummerierung gehört nach
+vorn, die Folgeänderung dagegen an ihre Dokumentstelle, weil sie die
+vorangegangenen Punkte als vollzogen voraussetzt — „Die bisherige Nr. 11 wird
+Nr. 12 und die Angabe „schriftliche“ wird gestrichen“ ist vorgezogen mehrdeutig,
+weil erst ein früherer Punkt die zweite Fundstelle des Wortes beseitigt.
+Verschoben wird stets nur nach vorn.
+
+(4) Das Protokoll bleibt gleichwohl befehlsweise: Ein Verbund gilt nur dann als
+angewandt, wenn jeder seiner Teile gegriffen hat; sonst nennt die Meldung den
+Teil und den Grund.
+
+
+[[aufbereitung]]
+== § 9 Aufbereitung der Druckwerke
+
+(1) Die PDF-Aufbereitung toleriert die üblichen Drucksachen-Artefakte, nämlich
+Seitenköpfe und -füße, Vorabfassungs-Wasserzeichen, vertauschte oder gerade
+Anführungszeichen, verklebte Wortgrenzen und zerlegt kodierte Umlaute. Die
+Brotschrift wird seitenweise bestimmt, sodass auch Ministeriumsentwürfe mit
+gemischten Layouts vollständig ausgelesen werden.
+
+(2) Fehlt im amtlichen Satz ein schließendes Anführungszeichen, so endet das
+Zitat an der nächsten Strukturgrenze, nämlich an einer Artikel-Überschrift oder —
+dort, wo die Anführungszeichen eines Artikels nachweislich nicht aufgehen — am
+nächsten Aufzählungspunkt des Änderungsdokuments. Der Vorgang wird als Warnung
+gemeldet.
+
+(3) Auf den Beispieldaten (§ 17 Absatz 2) werden hiernach alle Befehle der
+Fassungen des Bundesgesetzblattes und der aktuellen Entwürfe angewandt; für
+UWG, AGG und ProdHaftG verbleibt kein Befehl zur Prüfung von Hand. Im Übrigen
+gilt § 1 Absatz 4.
+
+(4) Bleibt die Aufbereitung im Einzelfall fehlerhaft, so ist nach § 6 Absatz 2
+mittels des Schalters `--extract-only` zu verfahren.
[[quellformate]]
-== Quellformate: Gesetz, Entwurf, Antrag
+== § 10 Quellformate: Gesetz, Entwurf, Antrag
-Ein Änderungsbefehl steht nicht nur im verkündeten Gesetzblatt. Dasselbe
-Vorhaben durchläuft als Referenten-, Regierungs- und Fraktionsentwurf,
-als Änderungsantrag und als Beschlussempfehlung mehrere Fassungen, und
-die Frage „was gälte, wenn das durchkommt?“ stellt sich in jeder davon.
-ÄndGgner erschließt die Art eines Dokuments deshalb aus seinem Kopf —
-nie aus dem Dateinamen, der lügen kann (im Beispielkorpus heißt ein
-Entschließungsantrag `BT-Drs-21-7071_Beschlussempfehlung.pdf`) und nie
-aus einer Kennung, die von außen mitzugeben wäre.
+Ein Änderungsbefehl steht nicht nur im verkündeten Gesetzblatt. Dasselbe Vorhaben
+durchläuft als Referenten-, Regierungs- und Fraktionsentwurf, als Änderungsantrag
+und als Beschlussempfehlung mehrere Fassungen, und die Frage „was gälte, wenn das
+durchkommt?“ stellt sich in jeder davon. Das Erzeugnis erschließt die Art eines
+Dokuments deshalb aus seinem Kopf — nie aus dem Dateinamen, der lügen kann (im
+Beispielkorpus heißt ein Entschließungsantrag
+`BT-Drs-21-7071_Beschlussempfehlung.pdf`), und nie aus einer Kennung, die von
+außen mitzugeben wäre.
Unterschieden werden:
@@ -224,32 +321,34 @@ Unterschieden werden:
Gesetzentwurf::
Referenten-, Regierungs- und Fraktionsentwürfe, auch als Drucksache von
Bundestag, Bundesrat oder Landtag. Der Begründungsteil hinter dem
- Regelungstext erzeugt keine Befehle; erkannt wird er an „Begründung“
- ebenso wie an den Entwurfsvarianten („A. Allgemeiner Teil“, „Zu
- Artikel 1“).
+ Regelungstext erzeugt keine Befehle; erkannt wird er an „Begründung“ ebenso wie
+ an den Entwurfsvarianten („A. Allgemeiner Teil“, „Zu Artikel 1“).
Änderungsantrag::
- Ändert nicht das Stammgesetz, sondern eine *Drucksache* — siehe unten.
+ Ändert nicht das Stammgesetz, sondern eine *Drucksache*; das Nähere bestimmt
+ § 11.
Beschlussempfehlung::
- Trägt ihre Fassung in einer zweispaltigen Zusammenstellung, die
- aufgelöst wird — die Synopse zeigt dann die vom Ausschuss beschlossene
- Fassung (siehe unten).
+ Trägt ihre Fassung in einer zweispaltigen Zusammenstellung, die aufgelöst wird;
+ die Synopse zeigt alsdann die vom Ausschuss beschlossene Fassung. Das Nähere
+ bestimmt § 12.
Dokument ohne Änderungsbefehle::
- Entschließungs- und schlichter Antrag, Plenarprotokoll, Bericht. Sie
- werden übergangen und gemeldet — nicht stillschweigend zu null
- Befehlen verarbeitet.
+ Entschließungs- und schlichter Antrag, Plenarprotokoll, Bericht. Sie werden
+ übergangen und gemeldet — nicht stillschweigend zu null Befehlen verarbeitet.
+
+Sobald ein Entwurf, ein Antrag oder eine Beschlussempfehlung beteiligt ist, trägt
+die Synopse den Hinweis *Entwurfsfassung — nicht geltendes Recht* (§ 1 Absatz 3);
+die Quellenzeile nennt je Datei die erkannte Art.
-Sobald ein Entwurf, ein Antrag oder eine Beschlussempfehlung beteiligt
-ist, trägt die Synopse den Hinweis *Entwurfsfassung — nicht geltendes
-Recht*; die Quellenzeile nennt je Datei die erkannte Art.
-=== Änderungsanträge
+[[antraege]]
+== § 11 Änderungsanträge
-Ein Änderungsantrag ist eine Meta-Änderung: Er ändert den Entwurf, nicht
-das Gesetz. Sein Rahmensatz adressiert deshalb zwei Ebenen zugleich —
-„In § 3 Nr. 22 wird § 18 Nr. 1 wie folgt geändert:“ nennt erst die
-Stelle _in der Drucksache_ (den 22. Änderungsbefehl ihres dritten
-Paragraphen) und dann die Stelle _in dem Text, den dieser Befehl
-zitiert_. Angegeben wird der Antrag zusammen mit seinem Entwurf:
+(1) Ein Änderungsantrag ist eine Meta-Änderung: Er ändert den Entwurf, nicht das
+Gesetz. Sein Rahmensatz adressiert deshalb zwei Ebenen zugleich — „In § 3 Nr. 22
+wird § 18 Nr. 1 wie folgt geändert:“ nennt erst die Stelle _in der Drucksache_
+(den 22. Änderungsbefehl ihres dritten Paragraphen) und dann die Stelle _in dem
+Text, den dieser Befehl zitiert_.
+
+(2) Der Antrag ist zusammen mit seinem Entwurf anzugeben:
[source,shell script]
----
@@ -258,115 +357,166 @@ java -jar target/aendggner-0.1.0-SNAPSHOT.jar \
Ltg-Drs-19-10365_Aenderungsantrag-Gruene.pdf -o synopse.html
----
-ÄndGgner wendet dann erst den Antrag auf den Entwurf an und danach den
-so geänderten Entwurf auf das Stammgesetz; die Synopse zeigt also, was
-gälte, wenn Entwurf _und_ Antrag durchkämen. Welcher Entwurf gemeint
-ist, entscheidet die Drucksachennummer, die der Antrag selbst nennt
-(„(Drs. 19/9707)“), nicht die Reihenfolge der Argumente. Fehlt der
-Entwurf, bleibt der Antrag unangewandt und wird gemeldet — ihn
+(3) Angewandt wird alsdann erst der Antrag auf den Entwurf und danach der so
+geänderte Entwurf auf das Stammgesetz; die Synopse zeigt also, was gälte, wenn
+Entwurf _und_ Antrag durchkämen. Welcher Entwurf gemeint ist, entscheidet die
+Drucksachennummer, die der Antrag selbst nennt („(Drs. 19/9707)“), nicht die
+Reihenfolge der Argumente.
+
+(4) Fehlt der Entwurf, so bleibt der Antrag unangewandt und wird gemeldet. Ihn
ersatzweise auf das Stammgesetz loszulassen wäre falsch, denn seine
-Stellenangaben zielen auf die Drucksache. Erkannt wird auch die
-elliptische Antragsform, die das Hilfsverb nur einmal in der
-Beschlussformel führt („1. In Nr. 1.29 die Angabe „,“ am Ende durch die
+Stellenangaben zielen auf die Drucksache.
+
+(5) Erkannt wird auch die elliptische Antragsform, die das Hilfsverb nur einmal
+in der Beschlussformel führt („1. In Nr. 1.29 die Angabe „,“ am Ende durch die
Angabe „;“ ersetzt.“).
-=== Beschlussempfehlungen: die beschlossene Fassung
-Die maßgebliche Fassung einer Beschlussempfehlung steht in einer
-zweispaltigen Zusammenstellung: links der Entwurf, rechts die Beschlüsse
-des Ausschusses. Anders als beim alten BGBl und beim Berliner GVBl
-stehen die Spalten *nicht* nacheinander im Inhaltsstrom, sondern
-zeilenweise verschränkt; getrennt werden sie deshalb über die
-Koordinaten (`PatchTextExtraktor.extrahiereSpalten`, Schnitt an der
-Blattmitte, aber nur an einem tatsächlichen Spaltensteg, damit
+[[zusammenstellung]]
+== § 12 Beschlussempfehlungen; die beschlossene Fassung
+
+(1) Die maßgebliche Fassung einer Beschlussempfehlung steht in einer
+zweispaltigen Zusammenstellung: links der Entwurf, rechts die Beschlüsse des
+Ausschusses. Anders als beim alten BGBl und beim Berliner GVBl stehen die Spalten
+*nicht* nacheinander im Inhaltsstrom, sondern zeilenweise verschränkt; getrennt
+werden sie deshalb über die Koordinaten (`PatchTextExtraktor.extrahiereSpalten`,
+Schnitt an der Blattmitte, aber nur an einem tatsächlichen Spaltensteg, damit
ganzseitenbreite Zeilen ungeschnitten bleiben).
-Die rechte Spalte für sich gelesen ist allerdings kein vollständiges
-Dokument: Sie druckt Unverändertes nicht ab, sondern vermerkt bloß
-„unverändert“ — und zwar nicht nur je Gliederungspunkt, sondern auch
-zeilenweise innerhalb zitierter Blöcke, weshalb ihre Anführungszeichen
-nicht aufgehen. Eine Auflösung über die Gliederungspfade scheitert daran
-nachweislich. Maßgeblich ist stattdessen die *Grundlinie*: Beide Spalten
-sind zeilensynchron gesetzt, jeder Vermerk steht auf der Höhe der
-Entwurfszeile, die er meint. Der `ZusammenstellungsLeser` führt beide
-Spalten über Seite und Grundlinie in eine gemeinsame Lesereihenfolge
-zusammen und entscheidet dann Zeile für Zeile: „unverändert“ holt den
-Wortlaut aus der Entwurfsspalte, „entfällt“ streicht ihn, sonst gilt die
-Ausschussspalte. Dabei meint „unverändert“ den Wortlaut, nicht die
-Zählung — streicht der Ausschuss einen Punkt, rücken die folgenden auf,
-und seine Marke tritt an die Stelle der des Entwurfs.
-
-Die Quellenzeile der Synopse weist die verwendete Spalte als
-`[Beschlussempfehlung …, Ausschussfassung]` aus. Lässt sich die
-Zusammenstellung nicht auflösen, wird die Datei nach wie vor mit
-Begründung übergangen — samt Hinweis auf die Drucksachennummer des
-Entwurfs, der sich stattdessen eignet. Eine halb aufgelöste Fassung
-auszugeben wäre schlimmer als keine.
-
-Belegt ist beides: dass die *linke* Spalte Befehl für Befehl den
-Regierungsentwurf ergibt, aus dem die Zusammenstellung gebaut ist, und
-dass die aufgelöste Fassung mehr Befehle trägt als er — der Ausschuss
-hat der GEG-Novelle zwei Artikel hinzugefügt. Zwei Beispiele stehen im
-Test: BT-Drs. 20/7619 (GEG) und BT-Drs. 19/24334 (Drittes
-Bevölkerungsschutzgesetz).
+(2) Die rechte Spalte für sich gelesen ist kein vollständiges Dokument: Sie druckt
+Unverändertes nicht ab, sondern vermerkt bloß „unverändert“ — und zwar nicht nur
+je Gliederungspunkt, sondern auch zeilenweise innerhalb zitierter Blöcke, weshalb
+ihre Anführungszeichen nicht aufgehen. Eine Auflösung über die Gliederungspfade
+scheitert daran nachweislich.
+
+(3) Maßgeblich ist stattdessen die *Grundlinie*: Beide Spalten sind zeilensynchron
+gesetzt, jeder Vermerk steht auf der Höhe der Entwurfszeile, die er meint. Der
+`ZusammenstellungsLeser` führt beide Spalten über Seite und Grundlinie in eine
+gemeinsame Lesereihenfolge zusammen und entscheidet dann Zeile für Zeile:
+„unverändert“ holt den Wortlaut aus der Entwurfsspalte, „entfällt“ streicht ihn,
+sonst gilt die Ausschussspalte. Dabei meint „unverändert“ den Wortlaut, nicht die
+Zählung; streicht der Ausschuss einen Punkt, so rücken die folgenden auf, und
+seine Marke tritt an die Stelle derjenigen des Entwurfs.
+
+(4) Die Quellenzeile der Synopse weist die verwendete Spalte als
+`[Beschlussempfehlung …, Ausschussfassung]` aus.
+
+(5) Lässt sich die Zusammenstellung nicht auflösen, so wird die Datei mit
+Begründung übergangen, samt Hinweis auf die Drucksachennummer des Entwurfs, der
+sich stattdessen eignet. Eine halb aufgelöste Fassung auszugeben wäre schlimmer
+als keine.
+
+(6) Belegt ist beides: dass die *linke* Spalte Befehl für Befehl den
+Regierungsentwurf ergibt, aus dem die Zusammenstellung gebaut ist, und dass die
+aufgelöste Fassung mehr Befehle trägt als er — der Ausschuss hat der GEG-Novelle
+zwei Artikel hinzugefügt. Zwei Beispiele stehen im Test: BT-Drs. 20/7619 (GEG)
+und BT-Drs. 19/24334 (Drittes Bevölkerungsschutzgesetz).
+
+
+[[landesrecht]]
+== § 13 Landesrecht
+
+(1) Für das bayerische Landesrecht versteht das Erzeugnis die dortigen
+Konventionen. Stammgesetze gliedern sich in Artikel („Art. 6 Abs. 2 Satz 1
+Nr. 2“, durchgängig abgekürzt zitiert), Änderungsgesetze dagegen in Paragraphen —
+auch mehrere Gesetze in einem GVBl-Heft, aus denen die auf das Stammgesetz
+zielenden §§ (einschließlich „Weitere Änderung“) anhand des Einleitungssatzes
+ausgewählt werden. Amtliche Satznummern bleiben als Superskripte erhalten und
+dienen als exakte Satzgrenzen. Zusätzlich erkannt werden
+
+1. die bayerischen Befehlsformen („Fußnote 1 wird aufgehoben“, „In Satz 1 wird
+ die Satznummerierung „1“ gestrichen“, „Dem Wortlaut werden die folgenden
+ Abs. 1 bis 4 vorangestellt“, „Der bisherige Wortlaut wird Abs. 5“),
+ Halbsatz-Ziele und Klauselketten mit gemeinsamem Schlussverb sowie
+2. das Fortführungszeichen des GVBl, wonach jedes neugefasste Aufzählungsglied
+ erneut mit „ öffnet.
+
+Der Fall ist gegen die amtliche Nachfassung belegt: Alle 154 auf das BayJG
+zielenden Befehle des Heftes 6/2026 werden an 54 Normen selbsttätig angewandt,
+auch die verschränkte Neunummerierung des Bußgeldkatalogs in Art. 56.
-[[web]]
-== Web-App
+(2) Die übrigen Länder gliedern ihre Stammgesetze wie der Bund in Paragraphen;
+die Unterschiede liegen im Gesetzblatt-Satz und in den Befehlsidiomen. Belegt sind
+Sachsen (SächsBeamtVG), Niedersachsen (NEFG), Thüringen (ThürKigaFinVO) und
+Nordrhein-Westfalen — dort alle vier ändernden Artikel eines Heftes:
+Telemedienzuständigkeitsgesetz, Landesmediengesetz, Ausführungsgesetz zum
+17. Rundfunkänderungsstaatsvertrag und, mit 101 Befehlen an 31 Normen der größte
+Fall des Heftes, das WDR-Gesetz —, jeweils mit Akzeptanztests gegen die amtlichen
+Nachfassungen.
-Neben der CLI gibt es eine Browserfassung, die dieselbe Pipeline
-(`eu.mulk.aendggner.Pipeline`) über ein Upload-Formular zugänglich macht:
-Stammgesetz- und Änderungsgesetz-Datei(en) wählen, Synopse erhalten.
+(3) Für Schleswig-Holstein, Berlin und Hessen reicht die Prüfung bis zur
+Befehlserkennung — dort vollständig, aber ohne Anwendung —, weil deren
+Landesportale ihre Stammfassungen nur über eine anmeldepflichtige Schnittstelle
+ausgeben. Thüringens Portal gibt sie ebensowenig aus; dort ist die konsolidierte
+Fassung aus dem Stammheft und den drei Änderungsheften des Gesetzblattes
+zusammengesetzt, die die Parlamentsdatenbank des Landtags frei ausgibt.
-Über dem Formular steht ein zugeklappter Einführungsblock, der zwei
-durchgerechnete Fälle mit Verweisen auf die amtlichen Fundstellen anbietet:
-das UWG (`gesetze-im-internet.de/uwg_2004/xml.zip`) mit dem Dritten Gesetz zu
-seiner Änderung (BGBl. 2026 I Nr. 43) und das AGG
-(`gesetze-im-internet.de/agg/xml.zip`) mit dem Regierungsentwurf BT-Drs.
-21/6178. Mitausgeliefert wird nichts; die Seite ruft die Dateien auch nicht
-selbst ab, sie verweist nur darauf.
+(4) Welche Konvention welches Land beisteuert, welche Stammfassungen woher
+stammen und was noch offen ist, verzeichnet
+`src/test/resources/sampledata/Landesrecht-Beispiele.adoc`.
-Sie braucht keinen Server: Die vollständige Verarbeitung — PDF-Textgewinnung
-mit PDFBox eingeschlossen — läuft als WebAssembly-Modul im Browser, übersetzt
-mit GraalVM Web Image aus demselben Java-Quelltext. Ausgeliefert werden nur
-statische Dateien; die gewählten Dokumente verlassen den Rechner der
-Nutzer:innen nicht.
-Bauen (verlangt Oracle GraalVM 25.1 oder neuer — Web Image ist dort enthalten,
-in der Community Edition nicht):
+[[web]]
+== § 14 Browserfassung
+
+(1) Neben der Befehlszeilenfassung besteht eine Browserfassung, die dieselbe
+Pipeline (`eu.mulk.aendggner.Pipeline`, § 16 Absatz 1) über ein
+Upload-Formular zugänglich macht: Stammgesetz- und Änderungsgesetz-Datei(en)
+wählen, Synopse erhalten.
+
+(2) Über dem Formular steht ein zugeklappter Einführungsblock, der zwei
+durchgerechnete Fälle mit Verweisen auf die amtlichen Fundstellen anbietet,
+nämlich das UWG (`gesetze-im-internet.de/uwg_2004/xml.zip`) mit dem Dritten Gesetz
+zu seiner Änderung (BGBl. 2026 I Nr. 43) und das AGG
+(`gesetze-im-internet.de/agg/xml.zip`) mit dem Regierungsentwurf BT-Drs. 21/6178.
+Mitausgeliefert wird nichts; die Seite ruft die Dateien auch nicht selbst ab, sie
+verweist nur darauf.
+
+(3) Ein Server ist nicht erforderlich: Die vollständige Verarbeitung —
+PDF-Textgewinnung mit PDFBox eingeschlossen — läuft als WebAssembly-Modul im
+Browser, übersetzt mit GraalVM Web Image aus demselben Java-Quelltext.
+Ausgeliefert werden nur statische Dateien; die gewählten Dokumente verlassen den
+Rechner der Nutzer:innen nicht. Die Herstellung verlangt abweichend von § 4
+Absatz 3 Oracle GraalVM 25.1 oder neuer, denn Web Image ist nur dort enthalten,
+nicht in der Community Edition:
[source,shell script]
----
JAVA_HOME=/pfad/zu/oracle-graalvm ./mvnw -Pwasm package
----
-Ergebnis ist `target/web/` mit `index.html`, `app.js`, `worker.js`,
+(4) Ergebnis ist `target/web/` mit `index.html`, `app.js`, `worker.js`,
`style.css`, `favicon.svg`, `aendggner.js` und `aendggner.js.wasm` (rund 24 MB,
komprimiert etwa 7 MB). Das Verzeichnis ist so, wie es dasteht, auslieferbar:
`deploy/webpaket.sh` läuft am Ende desselben Befehls, wirft den mehrere hundert
Megabyte großen Textzwischenschritt `aendggner.js.wat` fort, legt den Quelltext
der gebauten Fassung als `aendggner-quelltext.tar.gz` samt
`quelltext-fassung.txt` bei und komprimiert die großen Dateien nach `.gz` und
-`.br` vor. Trägt der Arbeitsbaum uneingecheckte Änderungen, bricht der Bau ab —
-der beigelegte Quelltext wäre dann nicht der gebaute; für einen Probelauf hilft
-`QUELLTEXT_UNGEPRUEFT=1`.
+`.br` vor.
+
+(5) Trägt der Arbeitsbaum uneingecheckte Änderungen, so bricht die Herstellung
+nach Absatz 3 ab, denn der beigelegte Quelltext wäre alsdann nicht der gebaute.
+Für einen Probelauf hilft `QUELLTEXT_UNGEPRUEFT=1`.
-Lokal ansehen — `file://` genügt nicht, Browser laden Wasm-Module und Worker
-nur über HTTP (http://localhost:8000/):
+(6) Zur örtlichen Ansicht genügt `file://` nicht; Browser laden Wasm-Module und
+Worker nur über HTTP (http://localhost:8000/):
[source,shell script]
----
jwebserver -d target/web
----
-Die Befehlszeilenfassung bleibt davon unberührt und ist weiterhin der Weg für
-Massenläufe.
+(7) Die Befehlszeilenfassung (§ 6) bleibt hiervon unberührt und ist weiterhin der
+Weg für Massenläufe.
-=== Ausrollen
-Betrieben wird die Fassung unter einem Unterpfad einer bestehenden Domain,
-https://matthias.benkard.de/aendggner/ — ein eigener Server und ein eigenes
-Zertifikat sind dafür nicht nötig. Nötig ist nur ein Webserver für statische
-Dateien.
+[[ausrollen]]
+== § 15 Ausrollen
+
+(1) Betrieben wird die Fassung unter einem Unterpfad einer bestehenden Domain,
+https://matthias.benkard.de/aendggner/. Ein eigener Server und ein eigenes
+Zertifikat sind hierfür nicht erforderlich; erforderlich ist nur ein Webserver
+für statische Dateien.
[source,shell script]
----
@@ -374,55 +524,85 @@ JAVA_HOME=/pfad/zu/oracle-graalvm ./mvnw -Pwasm package
rsync -av --delete target/web/ server:/var/www/aendggner/
----
-`deploy/nginx-aendggner.conf` ist dafür kein eigener `server`-Block, sondern ein
+(2) `deploy/nginx-aendggner.conf` ist kein eigener `server`-Block, sondern ein
Schnipsel zum Einfügen in den vorhandenen (`include`). Er bringt mit:
-* die Weiterleitung von `/aendggner` auf `/aendggner/`, ohne die alle relativen
- Verweise der Seite auf die Domainwurzel zielten;
-* den MIME-Typ `application/wasm`, ohne den der Browser die Instanziierung des
- Moduls verweigert;
-* `gzip_static`/`brotli_static` für die vorkomprimierten Dateien, statt 24 MB je
- Abruf neu zu packen;
-* `Cache-Control: no-cache` statt einer Haltefrist: Die Dateinamen tragen keine
- Fassungskennung, und ein Browser mit altem `app.js` und neuem `.wasm` bekäme
- sonst eine Mischfassung, die es nie gegeben hat. Revalidiert wird per ETag, das
- unveränderte Modul kostet dann ein 304 ohne Rumpf;
-* die Sicherheitskopfzeilen samt einer Content-Security-Policy. Zwei ihrer
- Freigaben sind unvermeidlich und in der Datei begründet: `'wasm-unsafe-eval'`
- für die Instanziierung des Moduls und `'unsafe-inline'` für Stile, weil die
- Synopse als `blob:`-Dokument die Richtlinie der erzeugenden Seite erbt, ihr
- Stylesheet aber eingebettet trägt.
-
-Der Footer der Startseite verweist auf den beigelegten Quelltext-Tarball; das
-verlangt AGPLv3 §13 für den Netzwerkbetrieb. Als fortlaufende Zweitquelle ist
-https://gerrit.benkard.de/plugins/gitiles/aendggner genannt. `impressum.html`
-und `datenschutz.html` tragen die Angaben nach § 5 DDG und Art. 13 DSGVO; die
-dort genannte Aufbewahrungsfrist der Zugriffsprotokolle (14 Tage) muss zu der
-des Servers passen.
-
-=== Warum WebAssembly und nicht ein Java-Server
-
-Der Kern ist reines Java ohne Dateisystem- oder Netzzugriff; nur vier Stellen
-berührten die Plattform (PDFBox, MIME-Erkennung, XML-Parser, Dateizugriff).
-Sie sind hinter `eu.mulk.aendggner.Quelle` (Name + Bytes) und
-`eu.mulk.aendggner.DateiTyp` (Signaturbytes statt Tika) gebündelt, sodass
-Befehlszeile und Browser dieselbe Pipeline speisen.
-
-Zwei Eigenheiten von Web Image sind dabei zu beachten und im Quelltext
-vermerkt:
-
-* Die nativen zlib-Bindungen des JDK fehlen (`java.util.zip.Inflater`), ohne
- die kein PDF lesbar ist. `src/wasm/java/.../InflaterErsatz.java` ersetzt sie
- durch die reine Java-Umsetzung von jzlib.
-* Typisierte Felder lassen sich derzeit nicht nach `byte[]` umsetzen; der
- Dateiinhalt wandert deshalb als Base64-Text über die JS-Grenze.
-
-
-== Running the Tests
-
-To build and run the tests:
+1. die Weiterleitung von `/aendggner` auf `/aendggner/`, ohne die alle relativen
+ Verweise der Seite auf die Domainwurzel zielten;
+2. den MIME-Typ `application/wasm`, ohne den der Browser die Instanziierung des
+ Moduls verweigert;
+3. `gzip_static`/`brotli_static` für die vorkomprimierten Dateien, statt 24 MB je
+ Abruf neu zu packen;
+4. `Cache-Control: no-cache` statt einer Haltefrist. Die Dateinamen tragen keine
+ Fassungskennung, und ein Browser mit altem `app.js` und neuem `.wasm` bekäme
+ sonst eine Mischfassung, die es nie gegeben hat. Revalidiert wird per ETag; das
+ unveränderte Modul kostet alsdann ein 304 ohne Rumpf;
+5. die Sicherheitskopfzeilen samt einer Content-Security-Policy. Zwei ihrer
+ Freigaben sind unvermeidlich und in der Datei begründet: `'wasm-unsafe-eval'`
+ für die Instanziierung des Moduls und `'unsafe-inline'` für Stile, weil die
+ Synopse als `blob:`-Dokument die Richtlinie der erzeugenden Seite erbt, ihr
+ Stylesheet aber eingebettet trägt.
+
+(3) `impressum.html` und `datenschutz.html` tragen die Angaben nach § 5 DDG und
+Art. 13 DSGVO. Die dort genannte Aufbewahrungsfrist der Zugriffsprotokolle
+(14 Tage) muss zu derjenigen des Servers passen.
+
+(4) Der Footer der Startseite verweist auf den beigelegten Quelltext-Tarball; dies
+verlangt AGPLv3 § 13 für den Netzwerkbetrieb. Als fortlaufende Zweitquelle ist
+die Anschrift nach § 3 Absatz 2 genannt.
+
+
+[[aufbau]]
+== § 16 Aufbau des Quelltextes
+
+(1) Gemeinsamer Kern von Befehlszeile und Browser ist `eu.mulk.aendggner.Pipeline`:
+Stammgesetz laden, Änderungsdokumente erkennen, zerlegen und anwenden, Synopse
+ausgeben. Die Pipeline kennt kein Dateisystem; Eingaben erreichen sie als
+`eu.mulk.aendggner.Quelle` (Name und Bytes).
+
+(2) Die Pakete unterhalb von `src/main/java/eu/mulk/aendggner/` gliedern sich wie
+folgt:
+
+`aenderung/`::
+ Erkennen der Dokumentart, Textbereinigung und Zerlegung in Änderungsbefehle
+ (`parse/`), Herkunftsnachweis (`Provenienz`), Stellenangaben (`Stelle`).
+`anwendung/`::
+ Anwenden der Befehle auf die Stammfassung, Auflösen der Stellenangaben, Zerlegen
+ in Sätze, Fortschreiben der Inhaltsübersicht.
+`gesetz/`::
+ Die Stammfassung nebst Gliederung, Normen, Absätzen und Superskripten; `gii/`
+ liest das Bundesformat, `land/` die Fassungen der Länder.
+`synopse/`::
+ Wortdiff, Aufbau und HTML-Ausgabe der Synopse.
+
+(3) Der Kern ist reines Java ohne Dateisystem- und ohne Netzzugriff; nur vier
+Stellen berühren die Plattform (PDFBox, MIME-Erkennung, XML-Parser,
+Dateizugriff). Sie sind hinter `eu.mulk.aendggner.Quelle` (Name und Bytes) und
+`eu.mulk.aendggner.DateiTyp` (Signaturbytes statt Tika) gebündelt; hierauf beruht,
+dass Befehlszeile und Browser dieselbe Pipeline speisen. Ein Java-Server ist
+deshalb entbehrlich.
+
+(4) Zwei Eigenheiten von Web Image sind zu beachten und im Quelltext vermerkt:
+
+1. Die nativen zlib-Bindungen des JDK fehlen (`java.util.zip.Inflater`), ohne die
+ kein PDF lesbar ist. `src/wasm/java/.../InflaterErsatz.java` ersetzt sie durch
+ die reine Java-Umsetzung von jzlib.
+2. Typisierte Felder lassen sich derzeit nicht nach `byte[]` umsetzen; der
+ Dateiinhalt wandert deshalb als Base64-Text über die JS-Grenze.
+
+
+[[pruefung]]
+== § 17 Prüfung
+
+(1) Herstellung und Prüfung erfolgen durch den nachstehenden Befehl:
[source,shell script]
----
./mvnw verify
----
+
+(2) Die Prüfung umfasst neben den Einzelprüfungen Akzeptanzprüfungen, die
+vollständige Änderungshefte auf die zugehörige Stammfassung anwenden und das
+Ergebnis gegen die amtliche Nachfassung stellen. Die hierfür verwendeten
+Beispieldaten nebst Herkunftsnachweis (`SOURCES`) liegen unter
+`src/test/resources/sampledata/`.