blob: ebe94da807de4bb0e049b73eba3adb8d7807dfa3 [file] [log] [blame]
Matthias Andreas Benkard856c0972026-08-16 06:56:05 +02001= ÄndGgner -- Nichtamtliche Zentralstelle für die maschinelle Fortschreibung von Stammgesetzen anhand von Änderungsvorschriften des Bundes und der Länder
Matthias Andreas Benkardb291c362020-11-22 10:22:27 +01002Matthias Andreas Benkard
Matthias Andreas Benkardd10ce7c2026-08-23 08:32:31 +02003// SPDX-FileCopyrightText: 2020 Matthias Andreas Benkard <code@mail.matthias.benkard.de>
4// SPDX-License-Identifier: AGPL-3.0-or-later
Matthias Andreas Benkardb291c362020-11-22 10:22:27 +01005// Meta
6:experimental:
7:data-uri:
Matthias Andreas Benkard3dc36d42026-08-22 21:06:24 +02008:sectnums!:
Matthias Andreas Benkardb291c362020-11-22 10:22:27 +01009:toc:
10:stem:
11:toclevels: 2
Matthias Andreas Benkard3dc36d42026-08-22 21:06:24 +020012: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
Matthias Andreas Benkardb291c362020-11-22 10:22:27 +010013:keywords: mulk
14// Settings
15:icons: font
16:source-highlighter: pygments
17
18
Matthias Andreas Benkard3dc36d42026-08-22 21:06:24 +020019[.lead]
20Ein Änderungsgesetz sagt nicht, was künftig gilt. Es sagt nur, was zu tun ist:
21In § 4 Absatz 2 Satz 1 werden die Wörter X durch die Wörter Y ersetzt.“
22Wer wissen will, wie die Vorschrift danach lautet, muss Hunderte solcher Befehle
23von Hand nachvollziehen und wer wissen will, was ein Entwurf bewirken _würde_,
24findet in keinem amtlichen Angebot eine Antwort, denn konsolidiert wird erst nach
25der Verkündung.
Matthias Andreas Benkardb291c362020-11-22 10:22:27 +010026
Matthias Andreas Benkard3dc36d42026-08-22 21:06:24 +020027ÄndGgner nimmt diese Arbeit ab. Eingegeben werden ein Stammgesetz in geltender
28Fassung und ein oder mehrere Änderungsdokumente verkündete Änderungsgesetze aus
29dem Bundesgesetzblatt und den Gesetz- und Verordnungsblättern der Länder ebenso
30wie Referenten-, Regierungs- und Fraktionsentwürfe, Änderungsanträge und
31Beschlussempfehlungen. Ausgegeben wird eine zweispaltige Synopse: links die
32bisherige, rechts die künftige Fassung, die Unterschiede wortweise hervorgehoben.
Matthias Andreas Benkardb291c362020-11-22 10:22:27 +010033
Matthias Andreas Benkard3dc36d42026-08-22 21:06:24 +020034[source,shell script]
35----
36./mvnw package
37java -jar target/aendggner-0.1.0-SNAPSHOT.jar stammgesetz.xml aenderungsgesetz.pdf -o synopse.html
38----
Matthias Andreas Benkardb291c362020-11-22 10:22:27 +010039
Matthias Andreas Benkard3dc36d42026-08-22 21:06:24 +020040Ohne Einrichtung läuft dasselbe im Browser unter
Matthias Andreas Benkard315ebec2026-08-23 10:10:30 +020041https://aendggner.app.kellertomaten.de/; die dort angebotenen zwei
Matthias Andreas Benkard3dc36d42026-08-22 21:06:24 +020042durchgerechneten Beispiele sind der kürzeste Weg zum ersten Ergebnis
43 14).
Matthias Andreas Benkardb291c362020-11-22 10:22:27 +010044
45
Matthias Andreas Benkard3dc36d42026-08-22 21:06:24 +020046[[gegenstand]]
47== § 1 Gegenstand und Zweck
Matthias Andreas Benkardb291c362020-11-22 10:22:27 +010048
Matthias Andreas Benkard3dc36d42026-08-22 21:06:24 +020049(1) Dieses Handbuch regelt Herstellung, Betrieb und Anwendung des
50Softwareerzeugnisses „ÄndGgner (nachstehend: das Erzeugnis).
51
52(2) Das Erzeugnis dient der maschinellen Fortschreibung von Stammgesetzen anhand
53von Änderungsvorschriften des Bundes und der Länder. Es erschließt aus einem
54Änderungsdokument die darin enthaltenen Änderungsbefehle, wendet sie auf die
55geltende Fassung des Stammgesetzes an und stellt beide Fassungen einander
56gegenüber.
57
58(3) Das Erzeugnis ist nichtamtlich. Seine Ausgabe ist weder eine amtliche
59Bekanntmachung noch eine Rechtsauskunft; maßgeblich bleibt allein der Wortlaut
60des Gesetz- und Verordnungsblattes. Bei Entwürfen, Anträgen und
61Beschlussempfehlungen zeigt die Synopse überdies nur, was gälte, wenn die Vorlage
62so beschlossen würde; sie trägt hierauf den Hinweis *Entwurfsfassung nicht
63geltendes Recht*.
64
65(4) Es gilt der Grundsatz der Nichtverwerfung: Ein Befehl, der sich nicht
66zweifelsfrei anwenden lässt etwa weil er gegen eine ältere Gesetzesfassung
67gerichtet ist, deren Zieltext nicht mehr besteht —, wird mitsamt der Begründung
68seines Scheiterns in den Abschnitt *Manuell prüfen* der Synopse aufgenommen. Er
69wird niemals stillschweigend übergangen.
70
71
72[[begriffe]]
73== § 2 Begriffsbestimmungen
74
75Im Sinne dieses Handbuchs ist
76
77Stammgesetz::
78 das zu ändernde Gesetz in seiner geltenden (konsolidierten) Fassung, also
79 dasjenige Werk, dessen Fortschreibung begehrt wird. Bundesrecht wird als
80 gii-Norm-XML von https://www.gesetze-im-internet.de/[gesetze-im-internet.de]
81 angenommen, Landesrecht als konsolidierte Fassung aus dem jeweiligen
82 Landesportal 5).
83Änderungsdokument::
84 das Werk, das die Änderung anordnet. Hierzu zählen das verkündete
85 Änderungsgesetz, der Gesetzentwurf, der Änderungsantrag und die
86 Beschlussempfehlung 10).
87Änderungsbefehl::
88 die einzelne Anordnung innerhalb des Änderungsdokuments, gerichtet auf eine
89 bestimmte Stelle des Stammgesetzes („In § 4 Absatz 2 Satz 1 werden die Wörter
90 X durch die Wörter Y ersetzt“). Welche Befehlsformen erkannt werden,
91 bestimmt § 7.
92Norm::
93 die kleinste selbständig bezeichnete Einheit des Stammgesetzes, im Bundesrecht
94 und im Landesrecht der übrigen Länder der Paragraph, im bayerischen Landesrecht
95 der Artikel 13). Auch die Inhaltsübersicht und die Gesetzesüberschrift
96 werden als Normen geführt, weil Änderungsbefehle auf sie zielen.
97Synopse::
98 die Ausgabe des Erzeugnisses: eine zweispaltige Gegenüberstellung der bisherigen
99 und der künftigen Fassung im Format HTML, gefolgt vom Protokoll der Anwendung
100 und dem Abschnitt *Manuell prüfen* nach § 1 Absatz 4.
101Angewandt::
102 gilt ein Befehl erst, wenn er im Wortlaut des Stammgesetzes gegriffen hat. Bei
103 Verbünden mehrerer Teile 8 Absatz 3) gilt der Befehl nur dann als angewandt,
104 wenn jeder seiner Teile gegriffen hat.
105
106
107[[bezugsquellen]]
108== § 3 Bezugsquellen und Anschriften
109
110(1) Die Browserfassung wird betrieben unter
Matthias Andreas Benkard315ebec2026-08-23 10:10:30 +0200111https://aendggner.app.kellertomaten.de/.
Matthias Andreas Benkard3dc36d42026-08-22 21:06:24 +0200112
113(2) Fortlaufende Quelltextquelle ist
114https://gerrit.benkard.de/plugins/gitiles/aendggner. Die jeweils betriebene
115Fassung liegt der Browserfassung überdies als `aendggner-quelltext.tar.gz` bei
Matthias Andreas Benkardf3b47af2026-08-22 21:23:06 +0200116 15 Absatz 5).
Matthias Andreas Benkard3dc36d42026-08-22 21:06:24 +0200117
118(3) Das Erzeugnis steht unter der GNU Affero General Public License, Fassung 3;
119der Lizenztext ist der Datei `COPYING` zu entnehmen.
120
121(4) Der Stand des Quelltextes wird nach Kalendertagen im Verzeichnis der
122Fassungen (`FASSUNGEN.txt`) geführt.
123
124
125[[herstellung]]
126== § 4 Herstellung des Erzeugnisses
127
128(1) Die ausführbare Archivdatei wird durch den nachstehenden Befehl unter
129`target/aendggner-${REVISION}.jar` erzeugt:
Matthias Andreas Benkardb291c362020-11-22 10:22:27 +0100130
131[source,shell script]
132----
133./mvnw package
134----
135
Matthias Andreas Benkard3dc36d42026-08-22 21:06:24 +0200136(2) Die Fassungsbezeichnung `${REVISION}` nach Absatz 1 lautet
137`0.1.0-SNAPSHOT`, soweit sie nicht durch Übergabe des Schalters `-Drevision` an
138`mvnw` abweichend bestimmt wird.
139
140(3) Vorausgesetzt wird ein Java-Entwicklungsbausatz der Fassung 21 oder neuer.
141Für die Herstellung der Browserfassung gilt abweichend § 14 Absatz 3.
Matthias Andreas Benkardb291c362020-11-22 10:22:27 +0100142
143
Matthias Andreas Benkard3dc36d42026-08-22 21:06:24 +0200144[[eingaben]]
145== § 5 Zulässige Eingaben
Matthias Andreas Benkardb291c362020-11-22 10:22:27 +0100146
Matthias Andreas Benkard3dc36d42026-08-22 21:06:24 +0200147(1) Als Stammgesetz des Bundes wird XML im gii-norm-Format von
148https://www.gesetze-im-internet.de/[gesetze-im-internet.de] angenommen. Das
149Portal gibt seine Werke nur als Archiv aus (`…/<kurz>/xml.zip`); das Archiv wird
150unmittelbar angenommen und der enthaltene XML-Eintrag daraus entpackt, ein
151Zwischenschritt von Hand entfällt.
Matthias Andreas Benkardb291c362020-11-22 10:22:27 +0100152
Matthias Andreas Benkard3dc36d42026-08-22 21:06:24 +0200153(2) Als Stammgesetz eines Landes wird die konsolidierte Fassung als PDF oder als
154kanonischer Klartext im Format der `--extract-only`-Ausgabe 6 Absatz 2)
155angenommen. Hierbei gilt:
156
1571. Eine Zeile Inhaltsübersicht eröffnet die gleichnamige Norm, auf die die
158 Angabe-Befehle zielen; ihre Zeilen tragen das Übersichtsformat
159 „§ N | Titel“.
1602. Amtliche Satznummern und Fußnotenmarker stehen als Unicode-Superskripte im
161 Text („¹Die freilebende Tierwelt …“, Enteignung⁶)“). Ob sie erhalten bleiben,
162 ergibt sich aus der geladenen Stammfassung, nicht aus einer Länderkennung.
1633. Das Zitiersigel oder Art.) folgt gleichfalls aus den Normköpfen der
164 Stammfassung.
165
166(3) Als Änderungsdokument werden PDF-Dateien des Bundesgesetzblattes, der
167Gesetz- und Verordnungsblätter der Länder und der Drucksachen von Bundestag,
168Bundesrat und Landtagen sowie Klartext angenommen. Die Dokumentart wird aus dem
169Text erschlossen, nicht aus dem Dateinamen 10). Änderungsanträge dürfen
170zusammen mit demjenigen Entwurf angegeben werden, den sie ändern 11).
Matthias Andreas Benkardb291c362020-11-22 10:22:27 +0100171
172
Matthias Andreas Benkard3dc36d42026-08-22 21:06:24 +0200173[[betrieb]]
174== § 6 Betrieb der Befehlszeilenfassung
Matthias Andreas Benkard58e19982026-07-13 07:09:19 +0200175
Matthias Andreas Benkard3dc36d42026-08-22 21:06:24 +0200176(1) Nach der Herstellung nach § 4 wird das Erzeugnis wie folgt aufgerufen:
Matthias Andreas Benkard58e19982026-07-13 07:09:19 +0200177
178[source,shell script]
179----
180java -jar target/aendggner-0.1.0-SNAPSHOT.jar \
181 stammgesetz.xml aenderungsgesetz.pdf -o synopse.html
182----
183
Matthias Andreas Benkard3dc36d42026-08-22 21:06:24 +0200184(2) Von den Schaltern sind die folgenden von allgemeiner Bedeutung:
Matthias Andreas Benkard58e19982026-07-13 07:09:19 +0200185
186`-o, --output <file>`::
Matthias Andreas Benkard3dc36d42026-08-22 21:06:24 +0200187 Ausgabedatei (Vorgabe `synopse.html`; `-` bezeichnet die Standardausgabe).
Matthias Andreas Benkard58e19982026-07-13 07:09:19 +0200188`--vollstaendig`::
189 Auch unveränderte Normen in die Synopse aufnehmen.
190`--artikel <n>`::
Matthias Andreas Benkard3dc36d42026-08-22 21:06:24 +0200191 Nur den bezeichneten Artikel des Änderungsgesetzes anwenden. Ohne diese Angabe
192 werden alle Artikel angewandt, deren Einleitung das Stammgesetz nennt.
Matthias Andreas Benkard58e19982026-07-13 07:09:19 +0200193`--extract-only`::
Matthias Andreas Benkard3dc36d42026-08-22 21:06:24 +0200194 Nur den bereinigten Lineartext des Änderungsdokuments ausgeben. Dies ist
195 angezeigt, wenn die PDF-Aufbereitung 9) fehlerhaft bleibt: Der Text ist zu
196 prüfen, von Hand zu berichtigen und als Klartextdatei wieder einzuspeisen.
Matthias Andreas Benkard58e19982026-07-13 07:09:19 +0200197
Matthias Andreas Benkard3dc36d42026-08-22 21:06:24 +0200198(3) Ein Aufruf unmittelbar aus dem Arbeitsbaum, ohne vorherige Herstellung nach
199§ 4, ist zulässig:
Matthias Andreas Benkardbac648b2026-07-28 07:51:09 +0200200
Matthias Andreas Benkard3dc36d42026-08-22 21:06:24 +0200201[source,shell script]
202----
203./mvnw exec:java
204----
Matthias Andreas Benkard74a84c52026-08-16 06:08:42 +0200205
Matthias Andreas Benkard3dc36d42026-08-22 21:06:24 +0200206(4) Die vollständige Schalterliste einschließlich der Schalter für die
207Fehlersuche gibt `--help` aus.
Matthias Andreas Benkard74a84c52026-08-16 06:08:42 +0200208
Matthias Andreas Benkard58e19982026-07-13 07:09:19 +0200209
Matthias Andreas Benkard3dc36d42026-08-22 21:06:24 +0200210[[befehle]]
211== § 7 Erkannte Änderungsbefehle
Matthias Andreas Benkard65eff082026-07-18 12:24:32 +0200212
Matthias Andreas Benkard3dc36d42026-08-22 21:06:24 +0200213(1) Erkannt werden die gebräuchlichsten Änderungsbefehle des Handbuchs der
214Rechtsförmlichkeit, nämlich Ersetzen, Neufassung, Einfügen, Anfügen, Aufheben,
215Streichen und Umnummerierung.
216
217(2) Von den Sonderformen sind erkannt:
218
2191. Bereichs- und Koordinationsziele („Die Absätze 8 und 9 werden durch die
220 folgenden Absätze 8 bis 10 ersetzt“);
2212. strukturelle Streichungen ganzer Einheiten („§ 9 wird gestrichen“);
2223. §- und Gliederungs-Umnummerierungen („§ 9a wird zu § 9“, Der bisherige
223 Abschnitt 2 wird zu Abschnitt 3“);
2244. das Einfügen und Ersetzen ganzer §-Blöcke;
2255. Chapeau-Lokatoren („Im Satzteil vor Nummer 1 …“);
2266. Änderungen an Anhängen und Anlagen („Der Anhang wird wie folgt geändert:
227 Nach Nummer 2 wird die folgende Nummer 2a eingefügt“);
2287. Angabe-Befehle auf die Inhaltsübersicht (gefasst, ersetzt, eingefügt,
229 gestrichen); sie werden auf die Inhaltsübersichts-Norm angewandt;
2308. das Einfügen und Ersetzen von Gliederungsberschriften („Nach § 33 werden
231 die folgenden Überschriften zu Teil 3 eingefügt“);
2329. Voranstellungen;
23310. Mehrfach-Ersetzungs- und -Einfügepaare;
23411. Einfügungen, deren Position ein Wortanker statt einer Stellenangabe bestimmt
235 („Vor den Wörtern Aus dem Bereich Verkehr:“ wird folgender Absatz 5
236 eingefügt“);
23712. Verbünde aus Umnummerierung und Folgeänderung („§ 50 wird zu § 38 und wird
238 wie folgt geändert“, Die bisherige Nr. 7 wird Nr. 5 und das Komma wird durch
239 das Wort und ersetzt“). Eine Satzzeichen-Operation meint dabei stets die
240 soeben umnummerierte Einheit, weil ihr Zieltext nichts unterscheidet;
24113. Verb-Rahmen, deren Unterpunkte allein die Fundstelle tragen („Es werden
242 ersetzt: in § 35 Absatz 3 die Angabe X jeweils durch die Angabe Y“,“),
243 sowie
24414. die Neufassung der Gesetzesüberschrift.
245
246(3) Landesrechtliche Befehlsformen bestimmt ergänzend § 13.
247
248
249[[reihenfolge]]
250== § 8 Reihenfolge der Anwendung
251
252(1) Angewandt wird nicht stur in Dokumentreihenfolge. Umnummerierungen beziehen
253sich stets auf die ursprüngliche Zählung, nicht auf den Stand nach den
254vorangegangenen Punkten; wer eine Bezeichnung räumt, kommt deshalb vor den, der
255sie neu besetzt.
256
257(2) Aus Absatz 1 folgt
258
2591. die absteigende Abarbeitung einer aufsteigenden Kaskade („Der bisherige
260 Absatz 3 wird Absatz 4“, Der bisherige Absatz 4 wird Absatz 5“, …) sowie
2612. der Vorrang einer Umnummerierung vor derjenigen Einfügung, die deren
262 Bezeichnung neu vergibt.
263
264Wer vorrückt, nimmt dabei seine eigenen Räumer mit: Auch eine über mehrere Punkte
265verschränkte Kaskade („Die bisherige Nr. 15 wird Nr. 16“, Die bisherigen Nrn. 13
266und 14 werden die Nrn. 14 und 15“, Nach Nr. 12 wird folgende Nr. 13 eingefügt“)
267tritt geschlossen vor die Einfügung, nicht bloß mit ihrem letzten Glied.
268
269(3) Geordnet werden nicht die Befehle, sondern die einzelnen Anwendungsschritte.
270Ein Verbund aus Umnummerierung und Folgeänderung 7 Absatz 2 Nummer 12) trägt
271nämlich zwei gegenläufige zeitliche Ansprüche: Die Umnummerierung gehört nach
272vorn, die Folgeänderung dagegen an ihre Dokumentstelle, weil sie die
273vorangegangenen Punkte als vollzogen voraussetzt Die bisherige Nr. 11 wird
274Nr. 12 und die Angabe schriftliche wird gestrichen ist vorgezogen mehrdeutig,
275weil erst ein früherer Punkt die zweite Fundstelle des Wortes beseitigt.
276Verschoben wird stets nur nach vorn.
277
278(4) Das Protokoll bleibt gleichwohl befehlsweise: Ein Verbund gilt nur dann als
279angewandt, wenn jeder seiner Teile gegriffen hat; sonst nennt die Meldung den
280Teil und den Grund.
281
282
283[[aufbereitung]]
284== § 9 Aufbereitung der Druckwerke
285
286(1) Die PDF-Aufbereitung toleriert die üblichen Drucksachen-Artefakte, nämlich
287Seitenköpfe und -füße, Vorabfassungs-Wasserzeichen, vertauschte oder gerade
288Anführungszeichen, verklebte Wortgrenzen und zerlegt kodierte Umlaute. Die
289Brotschrift wird seitenweise bestimmt, sodass auch Ministeriumsentwürfe mit
290gemischten Layouts vollständig ausgelesen werden.
291
292(2) Fehlt im amtlichen Satz ein schließendes Anführungszeichen, so endet das
293Zitat an der nächsten Strukturgrenze, nämlich an einer Artikelberschrift oder
294dort, wo die Anführungszeichen eines Artikels nachweislich nicht aufgehen am
295nächsten Aufzählungspunkt des Änderungsdokuments. Der Vorgang wird als Warnung
296gemeldet.
297
298(3) Auf den Beispieldaten 17 Absatz 2) werden hiernach alle Befehle der
299Fassungen des Bundesgesetzblattes und der aktuellen Entwürfe angewandt; für
300UWG, AGG und ProdHaftG verbleibt kein Befehl zur Prüfung von Hand. Im Übrigen
301gilt § 1 Absatz 4.
302
303(4) Bleibt die Aufbereitung im Einzelfall fehlerhaft, so ist nach § 6 Absatz 2
304mittels des Schalters `--extract-only` zu verfahren.
Matthias Andreas Benkard2cfea002026-07-26 13:32:26 +0200305
Matthias Andreas Benkard58e19982026-07-13 07:09:19 +0200306
Matthias Andreas Benkard7235b342026-08-14 18:58:25 +0200307[[quellformate]]
Matthias Andreas Benkard3dc36d42026-08-22 21:06:24 +0200308== § 10 Quellformate: Gesetz, Entwurf, Antrag
Matthias Andreas Benkard7235b342026-08-14 18:58:25 +0200309
Matthias Andreas Benkard3dc36d42026-08-22 21:06:24 +0200310Ein Änderungsbefehl steht nicht nur im verkündeten Gesetzblatt. Dasselbe Vorhaben
311durchläuft als Referenten-, Regierungs- und Fraktionsentwurf, als Änderungsantrag
312und als Beschlussempfehlung mehrere Fassungen, und die Frage was gälte, wenn das
313durchkommt?“ stellt sich in jeder davon. Das Erzeugnis erschließt die Art eines
314Dokuments deshalb aus seinem Kopf nie aus dem Dateinamen, der lügen kann (im
315Beispielkorpus heißt ein Entschließungsantrag
316`BT-Drs-21-7071_Beschlussempfehlung.pdf`), und nie aus einer Kennung, die von
317außen mitzugeben wäre.
Matthias Andreas Benkard7235b342026-08-14 18:58:25 +0200318
319Unterschieden werden:
320
321Änderungsgesetz::
322 Das verkündete Artikelgesetz aus BGBl, GVBl oder GVOBl. Der Regelfall.
323Gesetzentwurf::
324 Referenten-, Regierungs- und Fraktionsentwürfe, auch als Drucksache von
325 Bundestag, Bundesrat oder Landtag. Der Begründungsteil hinter dem
Matthias Andreas Benkard3dc36d42026-08-22 21:06:24 +0200326 Regelungstext erzeugt keine Befehle; erkannt wird er an Begründung ebenso wie
327 an den Entwurfsvarianten („A. Allgemeiner Teil“, Zu Artikel 1“).
Matthias Andreas Benkard7235b342026-08-14 18:58:25 +0200328Änderungsantrag::
Matthias Andreas Benkard3dc36d42026-08-22 21:06:24 +0200329 Ändert nicht das Stammgesetz, sondern eine *Drucksache*; das Nähere bestimmt
330 § 11.
Matthias Andreas Benkard7235b342026-08-14 18:58:25 +0200331Beschlussempfehlung::
Matthias Andreas Benkard3dc36d42026-08-22 21:06:24 +0200332 Trägt ihre Fassung in einer zweispaltigen Zusammenstellung, die aufgelöst wird;
333 die Synopse zeigt alsdann die vom Ausschuss beschlossene Fassung. Das Nähere
334 bestimmt § 12.
Matthias Andreas Benkard7235b342026-08-14 18:58:25 +0200335Dokument ohne Änderungsbefehle::
Matthias Andreas Benkard3dc36d42026-08-22 21:06:24 +0200336 Entschließungs- und schlichter Antrag, Plenarprotokoll, Bericht. Sie werden
337 übergangen und gemeldet nicht stillschweigend zu null Befehlen verarbeitet.
Matthias Andreas Benkard7235b342026-08-14 18:58:25 +0200338
Matthias Andreas Benkard3dc36d42026-08-22 21:06:24 +0200339Sobald ein Entwurf, ein Antrag oder eine Beschlussempfehlung beteiligt ist, trägt
340die Synopse den Hinweis *Entwurfsfassung nicht geltendes Recht* 1 Absatz 3);
341die Quellenzeile nennt je Datei die erkannte Art.
Matthias Andreas Benkard7235b342026-08-14 18:58:25 +0200342
Matthias Andreas Benkard7235b342026-08-14 18:58:25 +0200343
Matthias Andreas Benkard3dc36d42026-08-22 21:06:24 +0200344[[antraege]]
345== § 11 Änderungsanträge
346
347(1) Ein Änderungsantrag ist eine Metanderung: Er ändert den Entwurf, nicht das
348Gesetz. Sein Rahmensatz adressiert deshalb zwei Ebenen zugleich In § 3 Nr. 22
349wird § 18 Nr. 1 wie folgt geändert:“ nennt erst die Stelle _in der Drucksache_
350(den 22. Änderungsbefehl ihres dritten Paragraphen) und dann die Stelle _in dem
351Text, den dieser Befehl zitiert_.
352
353(2) Der Antrag ist zusammen mit seinem Entwurf anzugeben:
Matthias Andreas Benkard7235b342026-08-14 18:58:25 +0200354
355[source,shell script]
356----
357java -jar target/aendggner-0.1.0-SNAPSHOT.jar \
358 BayJG-alt.txt Ltg-Drs-19-9707_Gesetzentwurf.pdf \
359 Ltg-Drs-19-10365_Aenderungsantrag-Gruene.pdf -o synopse.html
360----
361
Matthias Andreas Benkard3dc36d42026-08-22 21:06:24 +0200362(3) Angewandt wird alsdann erst der Antrag auf den Entwurf und danach der so
363geänderte Entwurf auf das Stammgesetz; die Synopse zeigt also, was gälte, wenn
364Entwurf _und_ Antrag durchkämen. Welcher Entwurf gemeint ist, entscheidet die
365Drucksachennummer, die der Antrag selbst nennt („(Drs. 19/9707)“), nicht die
366Reihenfolge der Argumente.
367
368(4) Fehlt der Entwurf, so bleibt der Antrag unangewandt und wird gemeldet. Ihn
Matthias Andreas Benkard7235b342026-08-14 18:58:25 +0200369ersatzweise auf das Stammgesetz loszulassen wäre falsch, denn seine
Matthias Andreas Benkard3dc36d42026-08-22 21:06:24 +0200370Stellenangaben zielen auf die Drucksache.
371
372(5) Erkannt wird auch die elliptische Antragsform, die das Hilfsverb nur einmal
373in der Beschlussformel führt („1. In Nr. 1.29 die Angabe „,“ am Ende durch die
Matthias Andreas Benkard7235b342026-08-14 18:58:25 +0200374Angabe „;“ ersetzt.“).
375
Matthias Andreas Benkard7235b342026-08-14 18:58:25 +0200376
Matthias Andreas Benkard3dc36d42026-08-22 21:06:24 +0200377[[zusammenstellung]]
378== § 12 Beschlussempfehlungen; die beschlossene Fassung
379
380(1) Die maßgebliche Fassung einer Beschlussempfehlung steht in einer
381zweispaltigen Zusammenstellung: links der Entwurf, rechts die Beschlüsse des
382Ausschusses. Anders als beim alten BGBl und beim Berliner GVBl stehen die Spalten
383*nicht* nacheinander im Inhaltsstrom, sondern zeilenweise verschränkt; getrennt
384werden sie deshalb über die Koordinaten (`PatchTextExtraktor.extrahiereSpalten`,
385Schnitt an der Blattmitte, aber nur an einem tatsächlichen Spaltensteg, damit
Matthias Andreas Benkardffc553b2026-08-15 12:18:32 +0200386ganzseitenbreite Zeilen ungeschnitten bleiben).
Matthias Andreas Benkard7235b342026-08-14 18:58:25 +0200387
Matthias Andreas Benkard3dc36d42026-08-22 21:06:24 +0200388(2) Die rechte Spalte für sich gelesen ist kein vollständiges Dokument: Sie druckt
389Unverändertes nicht ab, sondern vermerkt bloß unverändert und zwar nicht nur
390je Gliederungspunkt, sondern auch zeilenweise innerhalb zitierter Blöcke, weshalb
391ihre Anführungszeichen nicht aufgehen. Eine Auflösung über die Gliederungspfade
392scheitert daran nachweislich.
Matthias Andreas Benkardffc553b2026-08-15 12:18:32 +0200393
Matthias Andreas Benkard3dc36d42026-08-22 21:06:24 +0200394(3) Maßgeblich ist stattdessen die *Grundlinie*: Beide Spalten sind zeilensynchron
395gesetzt, jeder Vermerk steht auf der Höhe der Entwurfszeile, die er meint. Der
396`ZusammenstellungsLeser` führt beide Spalten über Seite und Grundlinie in eine
397gemeinsame Lesereihenfolge zusammen und entscheidet dann Zeile für Zeile:
398unverändert holt den Wortlaut aus der Entwurfsspalte, entfällt streicht ihn,
399sonst gilt die Ausschussspalte. Dabei meint unverändert den Wortlaut, nicht die
400Zählung; streicht der Ausschuss einen Punkt, so rücken die folgenden auf, und
401seine Marke tritt an die Stelle derjenigen des Entwurfs.
Matthias Andreas Benkardffc553b2026-08-15 12:18:32 +0200402
Matthias Andreas Benkard3dc36d42026-08-22 21:06:24 +0200403(4) Die Quellenzeile der Synopse weist die verwendete Spalte als
404`[Beschlussempfehlung …, Ausschussfassung]` aus.
405
406(5) Lässt sich die Zusammenstellung nicht auflösen, so wird die Datei mit
407Begründung übergangen, samt Hinweis auf die Drucksachennummer des Entwurfs, der
408sich stattdessen eignet. Eine halb aufgelöste Fassung auszugeben wäre schlimmer
409als keine.
410
411(6) Belegt ist beides: dass die *linke* Spalte Befehl für Befehl den
412Regierungsentwurf ergibt, aus dem die Zusammenstellung gebaut ist, und dass die
413aufgelöste Fassung mehr Befehle trägt als er der Ausschuss hat der GEG-Novelle
414zwei Artikel hinzugefügt. Zwei Beispiele stehen im Test: BT-Drs. 20/7619 (GEG)
415und BT-Drs. 19/24334 (Drittes Bevölkerungsschutzgesetz).
416
417
418[[landesrecht]]
419== § 13 Landesrecht
420
421(1) Für das bayerische Landesrecht versteht das Erzeugnis die dortigen
422Konventionen. Stammgesetze gliedern sich in Artikel („Art. 6 Abs. 2 Satz 1
423Nr. 2“, durchgängig abgekürzt zitiert), Änderungsgesetze dagegen in Paragraphen
424auch mehrere Gesetze in einem GVBl-Heft, aus denen die auf das Stammgesetz
425zielenden §§ (einschließlich Weitere Änderung“) anhand des Einleitungssatzes
426ausgewählt werden. Amtliche Satznummern bleiben als Superskripte erhalten und
427dienen als exakte Satzgrenzen. Zusätzlich erkannt werden
428
4291. die bayerischen Befehlsformen („Fußnote 1 wird aufgehoben“, In Satz 1 wird
430 die Satznummerierung 1 gestrichen“, Dem Wortlaut werden die folgenden
431 Abs. 1 bis 4 vorangestellt“, Der bisherige Wortlaut wird Abs. 5“),
432 Halbsatz-Ziele und Klauselketten mit gemeinsamem Schlussverb sowie
4332. das Fortführungszeichen des GVBl, wonach jedes neugefasste Aufzählungsglied
434 erneut mit öffnet.
435
436Der Fall ist gegen die amtliche Nachfassung belegt: Alle 154 auf das BayJG
437zielenden Befehle des Heftes 6/2026 werden an 54 Normen selbsttätig angewandt,
438auch die verschränkte Neunummerierung des Bußgeldkatalogs in Art. 56.
439
440(2) Die übrigen Länder gliedern ihre Stammgesetze wie der Bund in Paragraphen;
441die Unterschiede liegen im Gesetzblatt-Satz und in den Befehlsidiomen. Belegt sind
442Sachsen (SächsBeamtVG), Niedersachsen (NEFG), Thüringen (ThürKigaFinVO) und
443Nordrhein-Westfalen dort alle vier ändernden Artikel eines Heftes:
444Telemedienzuständigkeitsgesetz, Landesmediengesetz, Ausführungsgesetz zum
44517. Rundfunkänderungsstaatsvertrag und, mit 101 Befehlen an 31 Normen der größte
446Fall des Heftes, das WDR-Gesetz —, jeweils mit Akzeptanztests gegen die amtlichen
447Nachfassungen.
448
449(3) Für Schleswig-Holstein, Berlin und Hessen reicht die Prüfung bis zur
450Befehlserkennung dort vollständig, aber ohne Anwendung —, weil deren
451Landesportale ihre Stammfassungen nur über eine anmeldepflichtige Schnittstelle
452ausgeben. Thüringens Portal gibt sie ebensowenig aus; dort ist die konsolidierte
453Fassung aus dem Stammheft und den drei Änderungsheften des Gesetzblattes
454zusammengesetzt, die die Parlamentsdatenbank des Landtags frei ausgibt.
455
456(4) Welche Konvention welches Land beisteuert, welche Stammfassungen woher
457stammen und was noch offen ist, verzeichnet
458`src/test/resources/sampledata/Landesrecht-Beispiele.adoc`.
459
Matthias Andreas Benkard7235b342026-08-14 18:58:25 +0200460
Matthias Andreas Benkard7b455cd2026-08-09 08:33:37 +0200461[[web]]
Matthias Andreas Benkard3dc36d42026-08-22 21:06:24 +0200462== § 14 Browserfassung
Matthias Andreas Benkard7b455cd2026-08-09 08:33:37 +0200463
Matthias Andreas Benkard3dc36d42026-08-22 21:06:24 +0200464(1) Neben der Befehlszeilenfassung besteht eine Browserfassung, die dieselbe
465Pipeline (`eu.mulk.aendggner.Pipeline`, § 16 Absatz 1) über ein
466Upload-Formular zugänglich macht: Stammgesetz- und Änderungsgesetz-Datei(en)
467wählen, Synopse erhalten.
Matthias Andreas Benkard7b455cd2026-08-09 08:33:37 +0200468
Matthias Andreas Benkard3dc36d42026-08-22 21:06:24 +0200469(2) Über dem Formular steht ein zugeklappter Einführungsblock, der zwei
470durchgerechnete Fälle mit Verweisen auf die amtlichen Fundstellen anbietet,
471nämlich das UWG (`gesetze-im-internet.de/uwg_2004/xml.zip`) mit dem Dritten Gesetz
472zu seiner Änderung (BGBl. 2026 I Nr. 43) und das AGG
473(`gesetze-im-internet.de/agg/xml.zip`) mit dem Regierungsentwurf BT-Drs. 21/6178.
474Mitausgeliefert wird nichts; die Seite ruft die Dateien auch nicht selbst ab, sie
475verweist nur darauf.
Matthias Andreas Benkard06da70e2026-08-16 07:34:12 +0200476
Matthias Andreas Benkard3dc36d42026-08-22 21:06:24 +0200477(3) Ein Server ist nicht erforderlich: Die vollständige Verarbeitung
478PDF-Textgewinnung mit PDFBox eingeschlossen läuft als WebAssembly-Modul im
479Browser, übersetzt mit GraalVM Web Image aus demselben Java-Quelltext.
480Ausgeliefert werden nur statische Dateien; die gewählten Dokumente verlassen den
481Rechner der Nutzer:innen nicht. Die Herstellung verlangt abweichend von § 4
482Absatz 3 Oracle GraalVM 25.1 oder neuer, denn Web Image ist nur dort enthalten,
483nicht in der Community Edition:
Matthias Andreas Benkard7b455cd2026-08-09 08:33:37 +0200484
485[source,shell script]
486----
Matthias Andreas Benkard2b1841e2026-08-15 10:51:11 +0200487JAVA_HOME=/pfad/zu/oracle-graalvm ./mvnw -Pwasm package
Matthias Andreas Benkard7b455cd2026-08-09 08:33:37 +0200488----
489
Matthias Andreas Benkard3dc36d42026-08-22 21:06:24 +0200490(4) Ergebnis ist `target/web/` mit `index.html`, `app.js`, `worker.js`,
Matthias Andreas Benkardf3b47af2026-08-22 21:23:06 +0200491`style.css`, `favicon.svg`, `aendggner.js` und `aendggner.js.wasm` (rund 17 MB,
492komprimiert etwa 5 MB). Das Verzeichnis ist so, wie es dasteht, auslieferbar:
Matthias Andreas Benkard2d33bf72026-08-16 06:40:07 +0200493`deploy/webpaket.sh` läuft am Ende desselben Befehls, wirft den mehrere hundert
Matthias Andreas Benkardf3b47af2026-08-22 21:23:06 +0200494Megabyte großen Textzwischenschritt `aendggner.js.wat` fort, schickt das Modul
495durch `wasm-opt -Oz` und legt den Quelltext der gebauten Fassung als
496`aendggner-quelltext.tar.gz` samt `quelltext-fassung.txt` bei.
Matthias Andreas Benkard2b1841e2026-08-15 10:51:11 +0200497
Matthias Andreas Benkardf3b47af2026-08-22 21:23:06 +0200498(5) Die Größe des Moduls beruht auf vier Vorkehrungen; wer eine davon zurücknimmt,
499handelt sich die Megabyte wieder ein:
500
5011. `-Os` beim Übersetzen statt der auf Durchsatz gerichteten Voreinstellung;
5022. kein Picocli-Annotationsprozessor im Profil `wasm`. Er meldete die
503 Befehlszeilenklasse zur Reflexion an, worauf die Erreichbarkeitsanalyse die
504 gesamte Befehlszeilenfassung ins Browser-Image zog, die dort niemand aufruft;
5053. ein enger Ressourcen-Glob in `reachability-metadata.json`. Das frühere
506 `org/apache/fontbox/**` bettete 3,3 MB CJK-CMaps, `Scripts.txt` und weil
507 `**` auch Klassendateien trifft 0,7 MB `.class`-Dateien ein, von denen
508 deutsche Gesetzes-PDFs nichts brauchen. Geblieben sind die beiden
509 Identity-CMaps; `org/apache/pdfbox/resources/**` bleibt vollständig, damit die
510 Breitenberechnung bei nicht eingebetteten Schriften unangetastet ist;
5114. `wasm-opt -Oz` als Nachlauf. Die zugelassenen Wasm-Merkmale sind in
512 `webpaket.sh` einzeln aufgezählt und nicht als `--all-features` erteilt: Sonst
513 nutzt Binaryen auch Vorschläge, die noch kein Browser annimmt, und das Modul
514 scheitert erst beim Instanziieren.
515
516(6) Im Quelltextarchiv fehlt der Beispielkorpus; `.gitattributes` nimmt
517`src/test/resources/sampledata` von `git archive` aus. Es sind Gesetzes- und
518Drucksachentexte fremder Urheberschaft, an denen allein die Tests messen
519Quelltext im Sinne der AGPLv3 sind sie nicht, gebaut wird ohne sie, und sie
520machten das Archiv dreißigmal so groß wie den Quelltext (29,7 MB statt 0,26 MB).
521`quelltext-fassung.txt` sagt dies und verweist für den vollständigen Korpus auf
522die Anschrift nach § 3 Absatz 2. Wächst das Archiv wieder über 8 MiB, so bricht
523`webpaket.sh` ab; alsdann sind Massendaten ins Repository geraten, die dort nicht
524hingehören.
525
526(7) Trägt der Arbeitsbaum uneingecheckte Änderungen, so bricht die Herstellung
Matthias Andreas Benkard3dc36d42026-08-22 21:06:24 +0200527nach Absatz 3 ab, denn der beigelegte Quelltext wäre alsdann nicht der gebaute.
528Für einen Probelauf hilft `QUELLTEXT_UNGEPRUEFT=1`.
529
530(6) Zur örtlichen Ansicht genügt `file://` nicht; Browser laden Wasm-Module und
531Worker nur über HTTP (http://localhost:8000/):
Matthias Andreas Benkard2b1841e2026-08-15 10:51:11 +0200532
533[source,shell script]
534----
Matthias Andreas Benkard08f53072026-08-16 06:05:39 +0200535jwebserver -d target/web
Matthias Andreas Benkard2b1841e2026-08-15 10:51:11 +0200536----
537
Matthias Andreas Benkard3dc36d42026-08-22 21:06:24 +0200538(7) Die Befehlszeilenfassung 6) bleibt hiervon unberührt und ist weiterhin der
539Weg für Massenläufe.
Matthias Andreas Benkard2b1841e2026-08-15 10:51:11 +0200540
Matthias Andreas Benkard2d33bf72026-08-16 06:40:07 +0200541
Matthias Andreas Benkard3dc36d42026-08-22 21:06:24 +0200542[[ausrollen]]
543== § 15 Ausrollen
544
Matthias Andreas Benkardf3b47af2026-08-22 21:23:06 +0200545(1) Erforderlich ist nur ein Ort für statische Dateien. Ausgeliefert wird über
546Cloudflare Workers. Dort gilt eine Grenze von 25 MiB je Datei unkomprimiert
547gemessen —, und komprimiert wird beim Ausliefern ohnehin. `webpaket.sh` legt
548deshalb keine `.gz`/`.br`-Beilagen mehr an und hält am Ende jede Datei gegen
549diese Grenze; überschreitet eine sie, so bricht der Bau ab, statt das Hochladen
550scheitern zu lassen.
Matthias Andreas Benkard2d33bf72026-08-16 06:40:07 +0200551
552[source,shell script]
553----
554JAVA_HOME=/pfad/zu/oracle-graalvm ./mvnw -Pwasm package
Matthias Andreas Benkardf3b47af2026-08-22 21:23:06 +0200555----
556
557(2) Wer die Fassung stattdessen selbst ausliefert unter einem Unterpfad einer
Matthias Andreas Benkard315ebec2026-08-23 10:10:30 +0200558bestehenden Domain, wie zuvor unter https://aendggner.app.kellertomaten.de/ —,
Matthias Andreas Benkardf3b47af2026-08-22 21:23:06 +0200559braucht die Vorkompression und fordert sie beim Bau an:
560
561[source,shell script]
562----
563JAVA_HOME=/pfad/zu/oracle-graalvm VORKOMPRIMIEREN=1 ./mvnw -Pwasm package
Matthias Andreas Benkard2d33bf72026-08-16 06:40:07 +0200564rsync -av --delete target/web/ server:/var/www/aendggner/
565----
566
Matthias Andreas Benkardf3b47af2026-08-22 21:23:06 +0200567(3) `deploy/nginx-aendggner.conf` ist kein eigener `server`-Block, sondern ein
Matthias Andreas Benkard2d33bf72026-08-16 06:40:07 +0200568Schnipsel zum Einfügen in den vorhandenen (`include`). Er bringt mit:
569
Matthias Andreas Benkard3dc36d42026-08-22 21:06:24 +02005701. die Weiterleitung von `/aendggner` auf `/aendggner/`, ohne die alle relativen
571 Verweise der Seite auf die Domainwurzel zielten;
5722. den MIME-Typ `application/wasm`, ohne den der Browser die Instanziierung des
573 Moduls verweigert;
Matthias Andreas Benkardf3b47af2026-08-22 21:23:06 +02005743. `gzip_static`/`brotli_static` für die nach Absatz 2 vorkomprimierten Dateien,
575 statt 17 MB je Abruf neu zu packen;
Matthias Andreas Benkard3dc36d42026-08-22 21:06:24 +02005764. `Cache-Control: no-cache` statt einer Haltefrist. Die Dateinamen tragen keine
577 Fassungskennung, und ein Browser mit altem `app.js` und neuem `.wasm` bekäme
578 sonst eine Mischfassung, die es nie gegeben hat. Revalidiert wird per ETag; das
579 unveränderte Modul kostet alsdann ein 304 ohne Rumpf;
5805. die Sicherheitskopfzeilen samt einer Content-Security-Policy. Zwei ihrer
581 Freigaben sind unvermeidlich und in der Datei begründet: `'wasm-unsafe-eval'`
582 für die Instanziierung des Moduls und `'unsafe-inline'` für Stile, weil die
583 Synopse als `blob:`-Dokument die Richtlinie der erzeugenden Seite erbt, ihr
584 Stylesheet aber eingebettet trägt.
Matthias Andreas Benkard2d33bf72026-08-16 06:40:07 +0200585
Matthias Andreas Benkardf3b47af2026-08-22 21:23:06 +0200586(4) `impressum.html` und `datenschutz.html` tragen die Angaben nach § 5 DDG und
Matthias Andreas Benkard8889c182026-08-22 21:32:46 +0200587Art. 13 DSGVO. Für den Regelfall Auslieferung über Cloudflare nennt
588`datenschutz.html` Cloudflare als Auftragsverarbeiter nach Art. 28 DSGVO samt
589Drittlandsübermittlung und sagt, dass Zugriffsprotokolle dort anfallen und vom
590Verantwortlichen nicht abgerufen werden. Die daneben für die eigene Auslieferung
591(Absatz 2) genannte Frist von 14 Tagen muss zu derjenigen des eigenen Servers
592passen. Wer bei Cloudflare weitere Funktionen einschaltet Web Analytics,
593Logpush, Bot Management, Turnstile —, muss die Erklärung ergänzen; sie ist so
594gefasst, dass keine davon in Betrieb ist.
Matthias Andreas Benkard2d33bf72026-08-16 06:40:07 +0200595
Matthias Andreas Benkardf3b47af2026-08-22 21:23:06 +0200596(5) Der Footer der Startseite verweist auf den beigelegten Quelltext-Tarball; dies
Matthias Andreas Benkard3dc36d42026-08-22 21:06:24 +0200597verlangt AGPLv3 § 13 für den Netzwerkbetrieb. Als fortlaufende Zweitquelle ist
598die Anschrift nach § 3 Absatz 2 genannt.
Matthias Andreas Benkard2b1841e2026-08-15 10:51:11 +0200599
Matthias Andreas Benkard7b455cd2026-08-09 08:33:37 +0200600
Matthias Andreas Benkard3dc36d42026-08-22 21:06:24 +0200601[[aufbau]]
602== § 16 Aufbau des Quelltextes
Matthias Andreas Benkardb291c362020-11-22 10:22:27 +0100603
Matthias Andreas Benkard3dc36d42026-08-22 21:06:24 +0200604(1) Gemeinsamer Kern von Befehlszeile und Browser ist `eu.mulk.aendggner.Pipeline`:
605Stammgesetz laden, Änderungsdokumente erkennen, zerlegen und anwenden, Synopse
606ausgeben. Die Pipeline kennt kein Dateisystem; Eingaben erreichen sie als
607`eu.mulk.aendggner.Quelle` (Name und Bytes).
608
609(2) Die Pakete unterhalb von `src/main/java/eu/mulk/aendggner/` gliedern sich wie
610folgt:
611
612`aenderung/`::
613 Erkennen der Dokumentart, Textbereinigung und Zerlegung in Änderungsbefehle
614 (`parse/`), Herkunftsnachweis (`Provenienz`), Stellenangaben (`Stelle`).
615`anwendung/`::
616 Anwenden der Befehle auf die Stammfassung, Auflösen der Stellenangaben, Zerlegen
617 in Sätze, Fortschreiben der Inhaltsübersicht.
618`gesetz/`::
619 Die Stammfassung nebst Gliederung, Normen, Absätzen und Superskripten; `gii/`
620 liest das Bundesformat, `land/` die Fassungen der Länder.
621`synopse/`::
622 Wortdiff, Aufbau und HTML-Ausgabe der Synopse.
623
624(3) Der Kern ist reines Java ohne Dateisystem- und ohne Netzzugriff; nur vier
625Stellen berühren die Plattform (PDFBox, MIME-Erkennung, XML-Parser,
626Dateizugriff). Sie sind hinter `eu.mulk.aendggner.Quelle` (Name und Bytes) und
627`eu.mulk.aendggner.DateiTyp` (Signaturbytes statt Tika) gebündelt; hierauf beruht,
628dass Befehlszeile und Browser dieselbe Pipeline speisen. Ein Java-Server ist
629deshalb entbehrlich.
630
631(4) Zwei Eigenheiten von Web Image sind zu beachten und im Quelltext vermerkt:
632
6331. Die nativen zlib-Bindungen des JDK fehlen (`java.util.zip.Inflater`), ohne die
634 kein PDF lesbar ist. `src/wasm/java/.../InflaterErsatz.java` ersetzt sie durch
635 die reine Java-Umsetzung von jzlib.
6362. Typisierte Felder lassen sich derzeit nicht nach `byte[]` umsetzen; der
637 Dateiinhalt wandert deshalb als Base64-Text über die JS-Grenze.
638
639
640[[pruefung]]
641== § 17 Prüfung
642
643(1) Herstellung und Prüfung erfolgen durch den nachstehenden Befehl:
Matthias Andreas Benkardb291c362020-11-22 10:22:27 +0100644
645[source,shell script]
646----
647./mvnw verify
648----
Matthias Andreas Benkard3dc36d42026-08-22 21:06:24 +0200649
650(2) Die Prüfung umfasst neben den Einzelprüfungen Akzeptanzprüfungen, die
651vollständige Änderungshefte auf die zugehörige Stammfassung anwenden und das
652Ergebnis gegen die amtliche Nachfassung stellen. Die hierfür verwendeten
653Beispieldaten nebst Herkunftsnachweis (`SOURCES`) liegen unter
654`src/test/resources/sampledata/`.
Matthias Andreas Benkardd10ce7c2026-08-23 08:32:31 +0200655
656== Lizenz
657
658Der Quelltext steht unter der GNU Affero General Public License, Version 3 oder
659(nach Wahl) einer späteren Fassung `AGPL-3.0-or-later`. Den Wortlaut trägt
660`LICENSES/AGPL-3.0-or-later.txt`; `COPYING` verweist als symbolische Verknüpfung
661darauf.
662
663Das Erzeugnis folgt der https://reuse.software/spec/[REUSE-Spezifikation]: Jede
664Datei ist einer Urheberschaft und einer SPDX-Lizenz zugeordnet, entweder durch
665eine Kopfzeile in der Datei selbst oder bei Binärdateien und Dateien ohne
666Kommentarsyntax durch einen Eintrag in `REUSE.toml`. Geprüft wird das mit:
667
668[source,shell script]
669----
670uvx reuse lint
671----
672
673Drei Lizenzen kommen vor:
674
675`AGPL-3.0-or-later`::
676 Der eigene Quelltext samt Weboberfläche, Bauwerk und Dokumentation.
677
678`Apache-2.0`::
679 Der unverändert mitgelieferte Maven-Wrapper (`mvnw`, `mvnw.cmd`,
680 `.mvn/wrapper/`).
681
682`LicenseRef-AmtlichesWerk`::
683 Der Beispielkorpus unter `src/test/resources/sampledata/`: Gesetzblätter,
684 Drucksachen, Plenarprotokolle und ministerielle Entwürfe des Bundes und der
685 Länder. Sie sind nach § 5 UrhG amtliche Werke und damit gemeinfrei; das
686 Änderungsverbot und das Gebot der Quellenangabe (§§ 62, 63 UrhG) bleiben
687 unberührt. Die Fundstellen weist die Datei `SOURCES` des jeweiligen
688 Verzeichnisses nach. Der Korpus ist kein Corresponding Source im Sinne der
689 AGPL gebaut wird ohne ihn —, und `.gitattributes` nimmt ihn deshalb vom
690 Quelltextarchiv aus.
691
692Die Kopfzeilen der Java-Dateien pflegt Spotless (`licenseHeader`); der an die
693Phase `verify` gebundene Lauf von `spotless:check` hält den Bau an, sobald eine
694Quelldatei ohne Kopfzeile hinzukommt.