)]}'
{
  "log": [
    {
      "commit": "b682c225ab39859b6488ad2c327c6a67bbaf5b50",
      "tree": "55a8b8f3414eff9f2c0d5172a6b0f85412fca8ed",
      "parents": [
        "3d40c583308d3f26501a53547e6294dc2db20854"
      ],
      "author": {
        "name": "Matthias Andreas Benkard",
        "email": "code@mail.matthias.benkard.de",
        "time": "Mon Aug 24 20:34:59 2026 +0200"
      },
      "committer": {
        "name": "Matthias Andreas Benkard",
        "email": "code@mail.matthias.benkard.de",
        "time": "Mon Aug 24 20:34:59 2026 +0200"
      },
      "message": "Ein Gesetz tritt nicht notwendig auf einen Schlag in Kraft\n\nDas Dritte UWG-Änderungsgesetz lässt seinen Artikel 1 Nummer 2 Buchstabe c\nam 19. Juni 2026 wirksam werden und alles Übrige erst am 27. September; das\nInfektionsschutz-Änderungsgesetz von 2020 ändert dasselbe Stammgesetz in zwei\nArtikeln zu zwei Zeitpunkten. Wer alle Befehle zugleich anwendet, erhält dort\neine Fassung, die an keinem einzigen Tag gegolten hat. Genau das tat ÄndGgner\nbisher, und zwar schweigend — die auffälligste Stelle, an der ein Werkzeug, das\nnie stillschweigend verwerfen will, doch etwas verschwieg.\n\nDer Schlussartikel wird jetzt gelesen. Die Artikelwahl erfasst ihn nicht, denn er\nträgt weder Änderungsformel noch Stammgesetz; maßgeblich ist der erste Artikel\nhinter dem letzten ändernden, damit in einem Gesetzblatt mit mehreren Gesetzen\njedes seine eigene Schlussvorschrift bekommt. Erkannt werden die Grundregel, der\nVorbehalt zugunsten späterer Absätze, die abweichende Anordnung für Artikel,\nNummern, Buchstaben und Doppelbuchstaben sowie die Rückwirkung („mit Wirkung\nvom“). Nennt der Wortlaut kein Datum, sondern die Verkündung, so wird keines\nerfunden: Der Verkündungstag steht nicht im Gesetzestext.\n\nZugeordnet wird über die Herkunft des Befehls — Artikel und Gliederungspfad —,\nund es gewinnt die besonderste Anordnung. Mit --stichtag (im Vordruck: „Stichtag“)\nergibt sich die an jenem Tag geltende Fassung; was noch nicht galt, bleibt\nunangewandt und steht für sich, nicht unter den Gründen des Scheiterns. Ohne\nStichtag bleibt es beim vollen Bestand, aber die Staffelung wird gerügt.\n\nGeprüft: 348 Tests (339 + 6 Einheitstests des Lesers + 3 Belegfälle), REUSE\n180/180. UWG 1/19 Befehle am 19. Juni gegen 19/19 am 27. September, GEG 115 gegen\n116, IfSG 65 gegen 75 — jeweils ohne Zuwachs an manuellen Resten.\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\nChange-Id: I887f233c72a4e49b69f9ede3154dcadd704fb0c3\n"
    },
    {
      "commit": "9feaf3b9eebd79a37a252c2ffdf241f4190b2637",
      "tree": "3775b5196b2a50d2d6dc200b6211851265d248aa",
      "parents": [
        "e13b58a5e3b602b475c46e6d595749d375148836"
      ],
      "author": {
        "name": "Matthias Andreas Benkard",
        "email": "code@mail.matthias.benkard.de",
        "time": "Mon Aug 24 07:37:17 2026 +0200"
      },
      "committer": {
        "name": "Matthias Andreas Benkard",
        "email": "code@mail.matthias.benkard.de",
        "time": "Mon Aug 24 07:44:51 2026 +0200"
      },
      "message": "Der Browser bekommt den Notausgang, den die Befehlszeile schon hatte\n\nDie Browserfassung galt als die vollwertige zweite Fassung des Erzeugnisses. Zwei\nAngaben der Befehlszeile fehlten ihr aber: die Beschränkung auf einen einzelnen\nArtikel und die Ausgabe des maschinell gelesenen Textes. Die erste war im Vordruck\nnicht vorgesehen, obwohl Arbeiter und Rechenwerk den Wert längst durchreichten —\ndas Formular sandte an ihrer Stelle hart einen leeren Wert. Die zweite war\nüberhaupt nicht erreichbar.\n\nDas Fehlende wiegt ungleich. Die Artikelangabe erspart Mühe; die Textausgabe\ndagegen ist der einzige Weg, einem unerklärlich unangewandten Befehl auf den Grund\nzu gehen. Wer im Browser arbeitete, stand vor einem Ergebnis, das er nicht\nnachprüfen konnte, und war auf die Befehlszeile verwiesen — also gerade auf das,\nwas die Browserfassung entbehrlich machen sollte.\n\nDie Textgewinnung wandert deshalb aus der Befehlszeilenklasse in den gemeinsamen\nKern (Pipeline.extrahiereText); beide Fassungen nehmen fortan denselben Weg. Der\nVordruck erhält das Feld „Anzuwendender Artikel“ und das Ankreuzfeld „Statt der\nSynopse nur den maschinell gelesenen Text der Änderungsdokumente ausgeben“; das\nErgebnis kommt wie die Synopse als Verweis zum Öffnen und Sichern. Nebenbei\nverträgt die Umsetzung nach Wahrheitswerten nun ein nicht gesetztes Feld, das als\n„undefined“ herüberkommt. Das Handbuch zählt die Absätze des § 14 wieder\nfortlaufend — es führte (6) und (7) zweimal — und stellt die Angaben des Vordrucks\nden Schaltern des § 6 Absatz 2 gegenüber.\n\nEine neue Prüfung hält die Ausgabe des Notausgangs gegen den Text, den der Parser\nbekommt: Führte sie einen anderen vor, so wiese sie in die Irre. Der Prüfbestand\numfasst hiernach 335 Prüfungen, sämtlich grün; REUSE meldet 174/174.\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\nChange-Id: I2a9aee042b6454f8d591bc415a5c6f1c1e7b40b6\n"
    },
    {
      "commit": "279fca69b86889387fc4c16512fef38bae04b7ce",
      "tree": "8c0524301635aa893f74d2a74258a0f644782b80",
      "parents": [
        "a5d554451ab352f27dc26b70ae0a417816dee3f6"
      ],
      "author": {
        "name": "Matthias Andreas Benkard",
        "email": "code@mail.matthias.benkard.de",
        "time": "Sun Aug 23 08:32:08 2026 +0200"
      },
      "committer": {
        "name": "Matthias Andreas Benkard",
        "email": "code@mail.matthias.benkard.de",
        "time": "Sun Aug 23 08:32:08 2026 +0200"
      },
      "message": "Der Formatierer setzt die Kopfzeilen, nicht die Hand\n\nAchtundfünfzig Java-Dateien brauchen dieselben zwei Zeilen, und jede künftige\nbraucht sie ebenfalls. Von Hand gesetzt, hielte das keinen Monat: Die eine Datei,\ndie man vergisst, ist genau die, an der es später auffällt.\n\nSpotless führt daher fortan einen „licenseHeader“ mit dem Wortlaut, den die\nübrigen Dateien schon tragen. Der voreingestellte Trenner für Java ist das\nSchlüsselwort „package“; die Kopfzeilen treten also über die Paketangabe, und\nSpotless prüft und ergänzt sie bei jedem Lauf.\n\nDabei hat sich ergeben, dass „src/wasm/java“ der Formatprüfung bislang verborgen\nwar. Das Verzeichnis tritt dem Quellbaum erst im Profil „wasm“ bei, und zwar\ndurch das Build-Helper-Plugin; im gewöhnlichen Bau sah Spotless es nie. Die\nQuellverzeichnisse sind deshalb ausdrücklich benannt („src/*/java/**/*.java“),\nwas zugleich die doppelte Erfassung unter dem Profil vermeidet.\n\nAls Folge sind „BrowserMain“ und „InflaterErsatz“ erstmals umformatiert worden.\nEs geht dabei allein um das Satzbild — ein umbrochener Kommentarsatz und vier\nAnnotationen, die nunmehr je auf eigener Zeile stehen; am Sinn ändert sich\nnichts. Sie stehen hier bewusst neben den Kopfzeilen und nicht in einem eigenen\nCommit, denn beides folgt aus derselben Einstellung und wäre getrennt nicht\nnachvollziehbar.\n\nDer Lauf von „spotless:apply“ hält achtundfünfzig Dateien sauber.\nDreihundertfünfundzwanzig Testfälle bestehen unverändert.\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\nChange-Id: I3a41b93108ad13ed16f78385d6272e5c10a255a1\n"
    },
    {
      "commit": "2b1841e17533543d1cb15220ca86a2a37c853daf",
      "tree": "01b940cb06c5abc36704d2d4853343ee7b38ce02",
      "parents": [
        "5700bbcb89186e432c5c7dd232b61c052de8e784"
      ],
      "author": {
        "name": "Matthias Andreas Benkard",
        "email": "code@mail.matthias.benkard.de",
        "time": "Sat Aug 15 10:51:11 2026 +0200"
      },
      "committer": {
        "name": "Matthias Andreas Benkard",
        "email": "code@mail.matthias.benkard.de",
        "time": "Sat Aug 15 10:51:11 2026 +0200"
      },
      "message": "Die Web-App rechnet im Browser statt auf dem Server\n\nBisher lief die Weboberfläche auf einem JDK-HttpServer: Uploads landeten als\ntemporäre Dateien auf dem Server, die Synopse entstand dort. Das kostete\nBetrieb (systemd, Reverse Proxy, Rate-Limiting, Timeouts) und verlangte ein\nDatenschutzversprechen, das nur zusicherbar, nicht nachprüfbar war — gerade\nEntwurfstexte verließen den Rechner der Nutzer:innen.\n\nNeu übersetzt `./mvnw -Pwasm package` dieselbe Pipeline mit GraalVM Web Image\n(`native-image --tool:svm-wasm`) nach WebAssembly, PDFBox eingeschlossen.\nAusgeliefert werden nur noch statische Dateien; gerechnet wird im Browser.\nDie erzeugte Synopse ist byteweise identisch mit der der Befehlszeile\n(SHA-256 verglichen für IfSG 48/27/21 und BayJG 151/3/54).\n\nDie Befehlszeile bleibt unberührt: `./mvnw package` erzeugt unverändert das\nJAR, alle Optionen und Meldungstexte sind gleich, das Wasm-Profil ist rein\nadditiv und verlangt Oracle GraalVM 25.1+ (die CE hat kein Web Image).\n\nPortabilitätsschnitt (nützt beiden Fassungen):\n\n* `Quelle` (Name + Bytes) ersetzt `Path` in der Pipeline; nur die\n  Befehlszeile kennt noch ein Dateisystem. Der Name trägt genau den\n  bisherigen `getFileName()`-Text, damit Warnungen und Quellenzeile\n  wortgleich bleiben.\n\n* `DateiTyp` erkennt PDF/XML/Klartext an den Signaturbytes. Tika entfällt —\n  eine schwergewichtige Abhängigkeit samt ServiceLoader- und\n  XML-Konfiguration weniger, was der Wasm-Übersetzung unmittelbar zugutekommt.\n\nVier Eigenheiten von Web Image, die der Quelltext jeweils an Ort und Stelle\nvermerkt:\n\n* `java.util.zip.Inflater` ist nicht angebunden (GR-65205), ohne Inflate ist\n  kein PDF lesbar. `InflaterErsatz` substituiert ihn durch jzlib.\n\n* Typisierte JS-Felder lassen sich nicht nach `byte[]` umsetzen\n  („byteArrayHub is not defined“); der Dateiinhalt wandert als Base64.\n\n* JULs Standardformatter ruft `StackWalker`, den es dort nicht gibt.\n\n* Im Worker fehlt `document.currentScript`, worauf die Laufzeit das\n  Wasm-Modul neben `worker.js` sucht; die VM wird deshalb mit ausdrücklichem\n  Pfad ein zweites Mal gestartet.\n\nDie Reachability-Metadaten stammen aus einem Lauf des Tracing-Agents über die\nPipeline; die PDFBox- und FontBox-Ressourcen sind als Globs ergänzt, sonst\nscheitern PDFs an „Could not find referenced cmap stream Identity-H“.\n\nEntfallen: WebMain, UploadHandler, StaticHandler, Multipart und die\nsystemd-Unit. Die nginx-Vorlage liefert jetzt statische Dateien aus, und die\nDatenschutzseite sagt, was nun stimmt: Die Dateien verlassen den Rechner\nnicht.\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\nChange-Id: I38faf2ac0f764d601f080d4276babe4747773683\n"
    }
  ]
}
