aboutsummaryrefslogtreecommitdiff
path: root/src/test/resources/sampledata
Commit message (Collapse)AuthorAgeFilesLines
* Nicht jedes Landesportal versteckt seinen TextMatthias Andreas Benkard26 hours5-3/+1830
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Brandenburg ist das erste Land, dessen Portal keine juris-Einseitenanwendung ist: BRAVORS gibt seine Vorschriften als gewöhnliches HTML aus und führt unter „Änderungshistorie“ jede Fassung einzeln. Vor- und Nachfassung entstammen damit derselben Quelle — kein Wayback, keine Browsersteuerung, nur zwei Adressen. Die Hefte lassen sich am Dokumententitel des PDF einordnen; „FraktG-1AendG“ verrät mehr als jede Volltextsuche. Der Belegfall ist das Erste Gesetz zur Änderung des Fraktionsgesetzes (GVBl. I 2026 Nr. 12): vier Befehle, vier angewandt, alle 24 Normen gleich der amtlichen Nachfassung — auf Anhieb, ohne einen einzigen Eingriff am Parser. Zugleich ist er die Gegenprobe zum Inkrafttreten: Artikel 2 ordnet es schlicht an („am Tag nach der Verkündung“), also darf keine Staffelung gerügt und kein Datum erfunden werden. Drei Eigenheiten fürs Aufbereiten stehen in Brandenburg/SOURCES: Die Abschnittsbezeichnung steht im Kopfelement vor der Überschrift; die Aufzählungen sind echte Listen, deren Marken erst das Stilblatt erzeugt; und an ehemaligen Trennstellen führt das Portal vereinzelt Steuerzeichen mit (U+0002 in „Mitglie<STX>der“), die kein Textbestand sind. Ein allgemeiner Fund kam doch dazu: Die Überschrift des Schlussartikels geriet in den Wortlaut der Inkrafttretens-Anordnung, weil ein Artikel ohne Absatz- bezeichnungen im ganzen ein Absatz ist. Auf das bloße Vorkommen von „tritt“ ist dabei kein Verlass — das Wort „Inkrafttreten“ trägt es selbst. Geprüft: 349 Tests, REUSE 185/185. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Change-Id: I17660864fdf589d280024c9ba310e23902781515
* Gelesen wird, was im Satz steht, nicht was zuerst gezeichnet wurdeMatthias Andreas Benkard27 hours1-17/+12
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Das Berliner Gesetz- und Verordnungsblatt zeichnet den ganzseitenbreiten Titelblock des Gesetzes zuletzt — nach beiden Spalten, obgleich er über ihnen steht. Im Inhaltsstrom stand er damit mitten in einem Zitat, das über den Seitenwechsel läuft: „… zur Sicherung des Be-“, Titelblock, „triebs von Unterkünften …“. Der Wortlaut der Anlage Nummer 31 trug den Titel des Änderungsgesetzes in sich, und die Nummer wich als einzige aus einem Grunde von der amtlichen Nachfassung ab, der weder in der Erkennung noch in der Anwendung lag. Maßgeblich ist fortan das Satzbild in der einfachen Gestalt, die die Gesetzblätter durchweg haben: zwei Spalten, dazwischen eine Rinne, und darüber oder dazwischen einzelne ganzseitenbreite Zeilen. Gesucht wird die Rinne — die senkrechte Linie, die möglichst wenige Zeilen überschreiten, die nahe der Mitte des Satzspiegels liegt und zu deren beiden Seiten je eine Spalte von nennenswerter Breite steht. Die wenigen Zeilen, die sie gleichwohl überschreiten, sind die breiten; sie zerlegen die Seite in Bänder. Gelesen wird Band für Band von oben nach unten, in jedem Band erst die linke, dann die rechte Spalte. Der übliche XY-Schnitt der Literatur leistet das nicht, und der erste Versuch danach hat es bewiesen: Teilt man erst waagerecht am weitesten Weißraumband, so zerfällt eine zweispaltige Seite mit Kolumnentitel in oben und unten, ehe sie in links und rechts zerfällt; gelesen wird links oben, rechts oben, links unten, rechts unten. Im Infektionsschutzgesetz zerriss das eine Aufzählung mitten entzwei und ließ von fünfundsiebzig Befehlen einundvierzig übrig. Die Spalte hat deshalb den Vorrang vor dem Band. Zwei Vorsichtsmaßregeln begrenzen den Eingriff, der sonst jeden Extraktionslauf berührte: Innerhalb einer Spalte bleibt es bei der Reihenfolge des Inhaltsstroms, und findet sich keine Rinne, so bleibt die Seite unangetastet. Der Eingriff kann Spalten und breite Zeilen gegeneinander versetzen, niemals aber den Satz einer Spalte durcheinanderbringen, deren Strom schon stimmte. Ausgezählt über den ganzen Beispielbestand ändern fünfzehn der fünfundvierzig PDF-Dateien ihren Auszug; nachgesehen sind sie sämtlich, und wo sie den Fließtext betreffen, rücken sie einen Vorspann an die Stelle, an der er im Satz steht (Berlin, Thüringen, die Beispielsynopse zum Produkthaftungsrecht). Die Anlage Nummer 31 gleicht nunmehr der amtlichen Nachfassung; es verbleiben zwei benannte Abweichungen, keine davon in der Anwendung begründet. Alle dreihundertneununddreißig Prüfungen laufen durch, darunter jede gepinnte Zahl des Bestandes; REUSE meldet 176/176. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Change-Id: I80f100bba2b8e48d0d292fb310f4a9c98fc519ec
* Was nicht vorliegt, lässt sich nicht ändernMatthias Andreas Benkard2 days4-9/+1447
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Baden-Württemberg war das letzte Land mit einem Änderungsdokument, aber ohne Belegfall. Es hat vier Funde des Satzbildes und einen der Anwendung gebracht. Der Seitenfuß des Gesetzblatts steht im Inhaltsstrom mitten im Befehlstext und trennt dort den Zieltext eines Befehls von seinem Verb — „… die Wörter ‚Telegramm, Fernschreiben,‘“, Fußzeile, „gestrichen.“; die Blattzählung steht mitunter für sich allein zwischen zwei Gliederungspunkten. Beides wird nun herausgeschnitten. Dazu zwei Idiome: Der Dativ einer Anfügung darf seinen Artikel verlieren („Absatz 2 wird folgender Satz angefügt“), und hinter einer Anlagenbezeichnung darf ein beschreibender Klammerzusatz stehen. Der Anwendungsfund betrifft den Halbsatz: Wird der zweite gestrichen, so nimmt er sein Semikolon mit, und der Satz behält seinen Schlusspunkt. „A; B.“ ohne B ist „A.“ und nicht „A;“. Bei der Gelegenheit fiel eine Ordnungsfrage auf, die allgemein ist: Die Glieder einer Fundstelle werden jetzt in der Reihenfolge aufgelöst, in der die Stelle sie nennt, und jedes verengt den Suchbereich des nächsten. „Absatz 2 Nummer 1 Satz 2“ meint den zweiten Satz der Nummer 1, „Satz 1 Nummer 3“ dagegen die dritte Nummer des ersten Satzes; wer stets zuerst den Satz oder stets zuerst die Nummer suchte, träfe in einem der beiden Fälle die falsche Einheit. Einunddreißig der siebenunddreißig Befehle werden angewandt, und einundneunzig der dreiundneunzig Normen gleichen danach der amtlichen Fassung. Die sechs liegengebliebenen ändern sämtlich die Muster der Anlagen — den Wahlschein, die Merkblätter, deren Fußnoten und Spiegelstriche. Sie sind nicht anwendbar, weil das Landesrechtsportal die Muster nicht als Text ausliefert: Die Anlagen 2 bis 14 bestehen dort nur aus Kopf und Fundstelle. Das ist eine Grenze der Quelle, nicht des Werkzeugs, und sie ist als solche benannt. Damit trägt jedes Land, von dem ein Änderungsdokument vorliegt, einen Belegfall bis zur Anwendung. Geprüft mit „mvnw verify“: 334 Prüfungen, kein Fehlschlag; keine gepinnte Zahl eines anderen Belegfalls hat sich geändert. REUSE 174/174. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Change-Id: If1709f0c037195a510febb7f8a21396ed0133d45
* Die Nummer einer Anlage ist eine Norm, kein AufzählungsgliedMatthias Andreas Benkard2 days4-57/+3627
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Der Zuständigkeitskatalog des Berliner Sicherheits- und Ordnungsgesetzes zählt seine Einheiten nicht als Aufzählungsglieder, sondern führt sie als „Nummer 6“, „Nummer 23“, „Nummer 31“ — jede mit eigener Absatzzählung, jede im Portal eine eigene Einzelnorm. Der Stellenauflöser suchte dagegen eine Marke „6.“ im Wortlaut der Anlage und fand dort vielerlei; von sechs Befehlen des Artikels 1 wurden zwei angewandt. Sie werden nunmehr geführt, wie sie sind: als eigene Normen, deren Bezeichnung die Anlage voranstellt. Damit trägt die vorhandene Absatz-Maschinerie ihre Befehle unverändert, und es braucht keinen neuen Rang im Modell. Wo ein Gesetz solche Normen nicht führt — im gii-XML des Bundes stehen die Nummern einer Anlage als Marken im Wortlaut —, bleibt es beim bisherigen Weg. Dabei kamen drei Mängel ans Licht. Ob die feinste Komponente einer Fundstelle ein Absatz ist, entschied das bloße Vorkommen einer feineren Komponente; die Nummer einer Anlage steht aber vor der Absatzangabe und gehört zur Bezeichnung der Norm. Die Umnummerierung eines solchen Absatzes galt deshalb als die einer Aufzählungseinheit, tauschte eine Marke, die es nicht gab, hieß angewandt und bewirkte nichts. Ein Absatz, der „vor den Wörtern …“ eingefügt wird, wurde eine Zeile im Nachbarabsatz statt eines Absatzes. Und die Bezeichnung eines so eingefügten Absatzes verlor die Nummer der Anlage, weshalb die Schritt-Ordnung nicht sah, dass eine Umnummerierung ihm den Platz erst räumt. Beigelegt sind die beiden Fassungen des ASOG, über die Browsersteuerung beschafft. Der Auszug ist dort bei fünfzigtausend Zeichen gekappt und verschluckt einzelne Leerzeichen; base64-kodierte Stücke kamen zeichengenau herüber. Fünf der sechs Befehle werden angewandt, und 168 der 171 Normen gleichen danach der amtlichen Nachfassung. Die drei Abweichungen sind benannt und liegen nicht in der Anwendung — eine von ihnen belegt erstmals, was die geometrische Lesereihenfolge kosten würde: Der Titelblock des Änderungsgesetzes steht im Inhaltsstrom mitten in einem Zitat. Geprüft mit „mvnw verify“: 333 Prüfungen, kein Fehlschlag; keine gepinnte Zahl eines anderen Belegfalls hat sich geändert. REUSE 171/171. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Change-Id: I24b94cb96e6728b1ff1b1fcb5bb4b8433594e240
* Der Stamm bekommt das Alter, das der Einleitungssatz nenntMatthias Andreas Benkard2 days4-0/+299
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Die beiden größten Restzahlen des Prüfbestands — GEG einundfünfzig, IfSG siebenundzwanzig manuell zu prüfende Befehle — waren nie gepinnt, und niemand hatte sie je gegen ein Sollergebnis gehalten. Der Verdacht stand im Raum, sie seien kein Mangel des Werkzeugs, sondern ein Altersunterschied: Das gii-XML ist die heutige konsolidierte Fassung, während das Änderungsgesetz von 2023 bzw. 2020 auf die damalige zielt. Der Verdacht trifft zu, aber nicht ganz. Beschafft sind die zeitrichtigen Fassungen aus dem Wayback-Schnappschuss des amtlichen Archivs „xml.zip“ — dasselbe Format, das der Loader ohnehin liest. Maßgeblich für die Wahl ist der Einleitungssatz des Änderungsgesetzes; beide Schnappschüsse tragen genau den dort genannten Stand. Gegen sie gerechnet, blieben zunächst fünf und sieben Reste. Diese zwölf sind erstmals echte Befunde gewesen, und neun von ihnen benannten vier allgemeine Mängel, die alle behoben sind: Eine Wortersetzung griff in längere Wörter hinein und verbrauchte mit „schwerwiegende“ auch „schwerwiegender“; eine eingerückte Aufzählungsmarke galt als Satzende, weshalb ein Absatz mit Aufzählung mehr Sätze zählte als das Gesetzblatt; eine Ordnungszahl vor einem Gliederungswort ebenso; eine Nummer wurde im ganzen Absatz gesucht statt im benannten Satz; und eine Gliederungseinheit, die Rahmen und Befehl beide nennen, suchte sich innerhalb ihrer selbst. Übrig bleiben drei Reste im GEG, jeder im Test einzeln begründet: zweimal dieselbe Kaskade des § 108 — die Aufhebung einer „bisherigen“ Nummer, deren Bezeichnung ein anderer Punkt gerade neu vergibt, und eine Begleitklausel ohne eigene Ortsangabe — und einmal die Überschrift einer Nummer der Anlage 8. Das letzte ist dieselbe offene Modellfrage wie bei Berlins Anlage. Vier gepinnte Zahlen sind dadurch gestiegen; der Grund steht jeweils im Test. Das WDR-Gesetz trägt seither keinen Rest mehr. Geprüft mit „mvnw verify“: 330 Prüfungen, kein Fehlschlag; REUSE 167/167. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Change-Id: I338e78ec3d46e0d0d8e57e77831ebae34497ae7b
* Die Anlage wird eine Norm, ihre Nummern noch nichtMatthias Andreas Benkard2 days4-10/+216
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Der Klartext-Parser trägt fortan Anlagen: „Anlage“, „Anlage 2“ und „Anhang“ eröffnen eine eigene Norm, deren Bezeichnung genau so lautet wie im gii-XML, und vom ersten Anlagenkopf an gehört alles Folgende zu ihr — ihre inneren Überschriften gliedern nicht mehr das Gesetz, und ein Paragraph, den sie zitieren, eröffnet keine Norm. Berlin ist damit zur Hälfte belegt. Artikel 2 des Änderungsgesetzes schreibt das LAF-Errichtungsgesetz vollständig fort; alle fünf Normen gleichen danach der amtlichen Fassung vom 12. Juni 2026. Artikel 1 bleibt bei der Erkennung, und der Grund ist benannt statt umgangen: Fünf seiner sechs Befehle zielen auf Einheiten der Anlage, die dort als Überschriften stehen — „Nummer 6“, „Nummer 23“, „Nummer 31“ —, während der Stellenauflöser eine Aufzählungsmarke „6.“ sucht, die im Text der Anlage vielfach vorkommt. Die Gegenprobe belegt es: Werden die Überschriften versuchsweise in Marken umgeschrieben, steigt die Zahl der angewandten Befehle von zwei auf drei, mehrdeutig bleibt der Rest. Die Nummern einer Anlage brauchen einen eigenen Rang zwischen Norm und Absatz. Solange er fehlt, bringt die Beilage von zweimal 380 kB Stammfassung keinen Prüfgewinn; ihr Bezugsweg steht in „Berlin/SOURCES“ und führt in zwei Abrufen wieder dorthin. Dort ist auch der zweite Berliner Befund festgehalten: Das Portal setzt die amtlichen Satznummern als angeklebte Ziffern statt als Superskripte. Geprüft durch „mvnw verify“: 328 Tests, keine bestehende gepinnte Zahl bewegt, REUSE-Konformität 165 von 165. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Change-Id: Ifdda599a8c641ce66d0370b2a027f556adb4d86d
* Ein Änderungsgesetz schreibt zwei Stammgesetze fortMatthias Andreas Benkard2 days6-65/+3028
| | | | | | | | | | | | | | | | | | | | | | | | | Schleswig-Holstein ändert mit einem Gesetz die Gemeindeordnung und die Kreisordnung zugleich, jede in ihrem eigenen Artikel. Beide Stammfassungen sind nun über die Browsersteuerung beschafft — Vor- wie Nachfassung —, und beide werden vollständig fortgeschrieben: je ein Neufassungsbefehl, kein Rest, und danach gleicht die Gemeindeordnung in allen 167, die Kreisordnung in allen 86 Normen der amtlichen Fassung vom 31. März 2026. Der dritte Artikel ändert ein anderes Änderungsgesetz und bleibt zu Recht unbeachtet. Der Portalsatz hat zwei Eigenheiten. Er trennt die Sachnummer ab („§ 57 c“ statt „§ 57c“); zusammengezogen gehört das zur Aufbereitung, ohne den Handgriff wären zehn Paragraphen der Gemeindeordnung dem Gesetz entgangen. Und er setzt im Klammerzusatz „(Gemeindeordnung - GO -)“ einen Bindestrich, wo das Gesetzblatt einen Gedankenstrich führt. Daran scheiterte die Trennung von Kurztitel und Abkürzung, der Einleitungssatz fand sein Ziel nicht, und es wurde kein Artikel gewählt. Der Parser nimmt den Strich fortan in beiden Gestalten an, sofern Leerraum ihn umgibt — innerhalb eines Namens steht ein Bindestrich stets ohne. Geprüft durch „mvnw verify“: 327 Tests, keine bestehende gepinnte Zahl bewegt, REUSE-Konformität 162 von 162. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Change-Id: I11e8e84436c9b4b0e1729f5e4be012cc35335a0c
* Der Browser bekommt, was dem Skript verwehrt bleibtMatthias Andreas Benkard2 days4-22/+814
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Die Landesrechtsportale, die auf der juris-Anwendung beruhen, galten als Sackgasse: Jede Skriptabfrage erhält nur ihre leere Anwendungshülle, gleich unter welcher Adresse. Sie geben ihren Wortlaut aber jedem Browser, und über eine Browsersteuerung ist er Werk für Werk auszulesen. Damit ist die hessische Verkehrsrechts-Zuständigkeitsverordnung in beiden maßgeblichen Fassungen beschafft — der vom 1. Januar 2026 und der vom 4. Februar 2026 — und Hessen ist kein bloßer Erkennungsfall mehr, sondern ein voller Belegfall: einundzwanzig Befehle, kein Rest, und alle zweiundfünfzig Normen gleichen zeichengenau der amtlichen Nachfassung. Der Weg dorthin hat fünf allgemeine Lücken aufgedeckt. Der Klartext-Parser verlangte für jeden Normkopf eine Überschrift, die eine Verordnung nicht führt, und kannte die ausgeschriebene Gliederung nicht („Erster Teil“); ein Aufzählungsglied, das auf „und“ endet, galt ihm als Unter-Überschrift. Der Anwender behandelte die Streichung einer Absatzbezeichnung wie die Aufhebung des Absatzes, setzte Platzhalter auch dort, wo kein Platz zu halten war, und ließ ein Wort, das an die Stelle eines Satzzeichens tritt, am Vorwort kleben. Zwei stille Mängel kamen unverhofft mit: „List.remove“ war zweimal ein geboxter Index übergeben, sodass der Aufruf an die suchende Überladung band, nichts fand und nichts meldete. Betroffen war neben der Aufhebung eines Absatzes auch dessen Neufassung durch mehrere — der alte Absatz blieb neben den neuen stehen. Geprüft durch „mvnw verify“: 327 Tests, keine bestehende gepinnte Zahl bewegt, REUSE-Konformität 157 von 157. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Change-Id: I20ac8a7bc66357cd66daa167184b06b8c419f843
* Jede Datei nennt fortan ihren Urheber und ihre LizenzMatthias Andreas Benkard3 days1-0/+2
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Das Erzeugnis steht seit seinem ersten Tage unter der GNU Affero General Public License. Ausgesprochen war das indes nur an drei verstreuten Stellen: im Lizenzvolltext „COPYING“, in einem Satz des Impressums und in einer Bemerkung der Datei „.gitattributes“. Keine einzige Quelldatei nannte ihren Urheber oder ihre Lizenz. Wer eine Datei für sich betrachtet — und so betrachtet sie jeder, der sie übernimmt —, fand daran nichts. Maßstab ist die REUSE-Spezifikation in der Fassung 3.3. Das Verzeichnis „LICENSES“ nimmt die Wortlaute auf: die AGPL in der Fassung 3 oder später, die Apache-Lizenz für den unverändert mitgelieferten Maven-Wrapper und „LicenseRef-AmtlichesWerk.txt“. „COPYING“ bleibt an seiner Stelle, tritt aber als symbolische Verknüpfung auf; der gewohnte Pfad trägt damit fort, ohne dass zwei Wortlaute nebeneinander zu pflegen wären, und die Prüfung übergeht Verknüpfungen, sodass für den Lizenztext selbst keine sachfremde Lizenzangabe zu erfinden war. Die dritte Datei bezeichnet keine erteilte Lizenz, sondern hält die gesetzliche Rechtslage des Prüfbestandes fest. Fünfundvierzig PDF-Dateien, fünf EPUB-Dateien und die XML-Fassungen sind fremde Werke: Verkündungsblätter, Drucksachen, Plenarprotokolle und Entwürfe des Bundes und der Länder. Sie sind nach § 5 Abs. 1 UrhG gemeinfrei, die ministeriellen Entwürfe und Synopsen nach § 5 Abs. 2, und gleichwohl gebunden an Änderungsverbot und Quellenangabe nach §§ 62 und 63. Ausdrücklich festgehalten ist, dass die technische Aufbereitung durch die Rechtsportale kein eigenes Recht am Text begründet und dass der Bestand kein „Corresponding Source“ im Sinne der AGPL ist — gebaut wird ohne ihn. „REUSE.toml“ ordnet zu, was keinen Kommentar verträgt, und scheidet den Prüfbestand nach Herkunft: Bund in Verkündung und Parlament, Bund in den ministeriellen Entwürfen, gesetze-im-internet.de nebst der Aufbereitung durch die juris GmbH, sodann neun Länder je einzeln. Die selbst abgeleiteten Textfassungen tragen „AGPL-3.0-or-later AND LicenseRef-AmtlichesWerk“, denn der Wortlaut ist amtlich, die Aufbereitung — Einrückung, Superskript-Satznummern, Gliederungsüberschriften — eigene Arbeit. Maßgeblich für die Fundstelle der einzelnen Datei bleibt die Datei „SOURCES“ des jeweiligen Verzeichnisses; die Lizenzdatei nimmt sie in Bezug, wie es § 63 UrhG verlangt. Die übrigen Dateien tragen ihre Angabe in sich, im jeweils üblichen Kommentarstil, vor dem vorhandenen erläuternden Text und ohne diesen anzutasten. „mini-gii.xml“ und „.mvn/maven.config“ bleiben bewusst unberührt und erhalten stattdessen einen Eintrag: Ersteres liest der GiiXmlLoader, Letzteres Maven vor jedem Bau. Ein Ausrollwerkzeug hinterließ mit „.wrangler“ ein Zwischenverzeichnis im Arbeitsbaum; es ist fortan übergangen. Die Java-Dateien und die Angleichung der Lizenzaussage folgen gesondert. An diesem Stand bestehen dreihundertfünfundzwanzig Testfälle unverändert; am Verhalten des Erzeugnisses ändert sich nichts. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Change-Id: Id08e26d8e15545b2d00dd3d4fa7ffca86cf14944
* Die Auslieferung trägt nur, was der Browser wirklich brauchtMatthias Andreas Benkard3 days73-0/+83072
Die Browserfassung soll künftig über Cloudflare Workers gehen, und dort gilt eine Grenze von 25 MiB je Datei, unkomprimiert gemessen. Zwei der ausgelieferten Dateien standen dem entgegen: Das Quelltextarchiv maß 29,7 MB und war damit schon nicht mehr hochzuladen, das Wasm-Modul mit 24,5 MB zu achtundneunzig Hundertsteln der Grenze und ohne jeden Spielraum. Das Archiv war ein ungefiltertes „git archive“ des Repositoriums, und über fünfundneunzig Hundertstel davon waren die Beispiel-PDFs. Der Quelltext selbst misst keine dreihunderttausend Zeichen. Die Gesetzes- und Drucksachentexte sind fremde Werke, an denen allein die Tests messen; sie sind nicht der Quelltext, aus dem sich das Ausgelieferte herstellen ließe, und die Auflage des AGPLv3 § 13 verlangt sie deshalb nicht. Sie sind aus dem Archiv genommen, und „quelltext-fassung.txt“ sagt fortan, dass sie fehlen, warum sie fehlen und wo sie vollständig liegen. Damit dies nicht stillschweigend zurückfällt, bricht „webpaket.sh“ ab, sobald das Archiv acht Mebibyte überschreitet, und ebenso, wenn irgendeine ausgelieferte Datei die Grenze der Zielplattform reißt: Lieber hier auffallen als beim Hochladen. Der Korpus lag überdies unter „src/main/resources“ und wanderte deshalb in jedes Erzeugnis: in das Klassenverzeichnis, in die ausführbare Archivdatei — achtundzwanzig Megabyte für ein Werk von sechshundert Kilobyte Java — und auf den Klassenpfad des Übersetzers, dessen Ressourcentabelle die Verzeichnisnamen bis ins Wasm trug. Er liegt nunmehr unter „src/test/resources“, wo er hingehört, und ist von der Kopie nach „target/test-classes“ ausgenommen: Die Tests lesen ihn über Dateisystempfade, eine Kopie wäre bei jedem Bau fünfunddreißig Megabyte umsonst. Das Modul wiegt statt 24,5 nunmehr 17,2 Megabyte; komprimiert geht es mit 5,5 statt 7,1 Megabyte über die Leitung. Vier Ursachen liegen dem zugrunde. Der Picocli-Annotationsprozessor meldete die Befehlszeilenklasse mit sämtlichen Methoden zur Reflexion an, worauf die Erreichbarkeitsanalyse die ganze Befehlszeilenfassung samt Dateizugriffen in ein Bild zog, in dem es keine Befehlszeile gibt; im Profil „wasm“ läuft er nicht mehr, und eine von einem früheren Lauf liegengebliebene Konfiguration wird vor dem Übersetzen entfernt, damit die Größe nicht davon abhängt, was vorher lief. Der Ressourcen-Glob „org/apache/fontbox/**“ bettete 3,3 Megabyte ostasiatischer CMaps, die Schrifttabelle „Scripts.txt“ und — weil zwei Sterne auch Klassendateien treffen — 0,7 Megabyte „.class“-Dateien ein, von denen ein deutsches Gesetzes-PDF nichts braucht; geblieben sind die beiden Identity-CMaps. Die Metriken unter „org/apache/pdfbox/resources“ bleiben vollständig, denn an ihnen hängt die Breitenberechnung bei nicht eingebetteten Schriften. Übersetzt wird mit „-Os“, und den Rest holt „wasm-opt -Oz“ im Webpaket. Dessen Merkmale sind einzeln aufgezählt und nicht als „--all-features“ erteilt. Der bequeme Weg war gangbar und führte doch ins Leere: Binaryen nutzte daraufhin Vorschläge, die noch kein Browser annimmt, und das Modul scheiterte erst beim Instanziieren — erst an einem exakten Heap-Typ aus den „custom descriptors“, nach dessen Abschaltung an der kompakten Importsektion. Zugelassen ist nunmehr, was ausgeliefert in den Browsern steht und was Web Image braucht. Die Vorkompression nach „.gz“ und „.br“ entfällt als Regelfall, denn Cloudflare komprimiert selbst und jede Beilage wäre dort eine weitere Datei; wer mit nginx selbst ausliefert, fordert sie mit VORKOMPRIMIEREN=1 an. Das Auslieferungsverzeichnis fällt damit von achtundsechzig auf siebzehn Megabyte, und ein liegengebliebenes „.DS_Store“ geht nicht mehr mit hoch. Dreihundertfünfundzwanzig Testfälle bestehen. Das Modul ist im Browser gelaufen: Vier Dokumentenpaare — IfSG, UWG, AGG und das Bayerische Jagdgesetz, also gii-XML wie PDF als Stammfassung, Bundesgesetzblatt, Drucksache und Gesetz- und Verordnungsblatt als Änderungsdokument — ergeben Synopsen, deren SHA-256-Summen denen der Befehlszeilenfassung gleichen. Der Ressourcenbeschnitt kostet also keine Zeichen. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Change-Id: I31a47d1dcf3b27ffa4ae891947b1c4e083107a71