)]}'
{
  "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",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "a29b7ac0ff13c30ace7f73d06d4b827801155c75",
      "old_mode": 33188,
      "old_path": "README.adoc",
      "new_id": "24083c78f9ae00e6ad1816c4132abb7bf0265db5",
      "new_mode": 33188,
      "new_path": "README.adoc"
    },
    {
      "type": "delete",
      "old_id": "f87bbb843a091f88c96f29d72fab9838090a7cbe",
      "old_mode": 33188,
      "old_path": "deploy/aendggner-web.service",
      "new_id": "0000000000000000000000000000000000000000",
      "new_mode": 0,
      "new_path": "/dev/null"
    },
    {
      "type": "modify",
      "old_id": "f4667fb2abd9a92c2074a86280ae8466799aecfb",
      "old_mode": 33188,
      "old_path": "deploy/nginx-aendggner.conf",
      "new_id": "46eacb50a4ee95799175e4b9338c8de48cb4d121",
      "new_mode": 33188,
      "new_path": "deploy/nginx-aendggner.conf"
    },
    {
      "type": "modify",
      "old_id": "02478cb435dc0f4dda1931dd51c151c1c0097f90",
      "old_mode": 33188,
      "old_path": "pom.xml",
      "new_id": "601b9e9c7906c910e2ac617ff8296700d69dbcea",
      "new_mode": 33188,
      "new_path": "pom.xml"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "2157fc4a1c245dadc51724fb4afed4ef39889c06",
      "new_mode": 33188,
      "new_path": "src/main/java/eu/mulk/aendggner/DateiTyp.java"
    },
    {
      "type": "modify",
      "old_id": "c92ca8cd552611f5e617f6d7ab8dcafcf59cd426",
      "old_mode": 33188,
      "old_path": "src/main/java/eu/mulk/aendggner/Pipeline.java",
      "new_id": "2427c4ec53bd1b36602f34f92a21c5401f079cf6",
      "new_mode": 33188,
      "new_path": "src/main/java/eu/mulk/aendggner/Pipeline.java"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "d81647bda7bbde3651dfdd972c76bea4b1a52dfb",
      "new_mode": 33188,
      "new_path": "src/main/java/eu/mulk/aendggner/Quelle.java"
    },
    {
      "type": "modify",
      "old_id": "e519e2e035639b8d48ecedc90a758d40b376b216",
      "old_mode": 33188,
      "old_path": "src/main/java/eu/mulk/aendggner/aenderung/parse/PatchTextExtraktor.java",
      "new_id": "e7561260743c646d7470834f5f276148f77ec17d",
      "new_mode": 33188,
      "new_path": "src/main/java/eu/mulk/aendggner/aenderung/parse/PatchTextExtraktor.java"
    },
    {
      "type": "modify",
      "old_id": "6f5b55abc078fd9663266eba35f5ceb07e28be72",
      "old_mode": 33188,
      "old_path": "src/main/java/eu/mulk/aendggner/gesetz/gii/GiiXmlLoader.java",
      "new_id": "c6dea6923414794b9855dfdedbefc481b14f69c5",
      "new_mode": 33188,
      "new_path": "src/main/java/eu/mulk/aendggner/gesetz/gii/GiiXmlLoader.java"
    },
    {
      "type": "modify",
      "old_id": "c64ca217fcc61176fa2859ba47ef391d85948179",
      "old_mode": 33188,
      "old_path": "src/main/java/eu/mulk/aendggner/gesetz/land/LandesRechtLoader.java",
      "new_id": "22c1e4150282edc012ec963d5a31e4d551ef77ab",
      "new_mode": 33188,
      "new_path": "src/main/java/eu/mulk/aendggner/gesetz/land/LandesRechtLoader.java"
    },
    {
      "type": "delete",
      "old_id": "745443b76ef94849b83716164fe24b2f24e29284",
      "old_mode": 33188,
      "old_path": "src/main/java/eu/mulk/aendggner/web/Multipart.java",
      "new_id": "0000000000000000000000000000000000000000",
      "new_mode": 0,
      "new_path": "/dev/null"
    },
    {
      "type": "delete",
      "old_id": "24a6e410de680ac9162db3b208a7092a7cbf8a5a",
      "old_mode": 33188,
      "old_path": "src/main/java/eu/mulk/aendggner/web/StaticHandler.java",
      "new_id": "0000000000000000000000000000000000000000",
      "new_mode": 0,
      "new_path": "/dev/null"
    },
    {
      "type": "delete",
      "old_id": "efcb512cd5b8e69f2b92248ac0ae26550ff0fa74",
      "old_mode": 33188,
      "old_path": "src/main/java/eu/mulk/aendggner/web/UploadHandler.java",
      "new_id": "0000000000000000000000000000000000000000",
      "new_mode": 0,
      "new_path": "/dev/null"
    },
    {
      "type": "delete",
      "old_id": "815f0dba14c6cfefb377303b2a049299767716eb",
      "old_mode": 33188,
      "old_path": "src/main/java/eu/mulk/aendggner/web/WebMain.java",
      "new_id": "0000000000000000000000000000000000000000",
      "new_mode": 0,
      "new_path": "/dev/null"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "4f85735f66f5a6e2bc863dcc43a53e9b97e1f2d6",
      "new_mode": 33188,
      "new_path": "src/main/resources/META-INF/native-image/eu.mulk/aendggner/reachability-metadata.json"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "c59f6e3c4184418b05fff82dd2b4a37e647a42d9",
      "new_mode": 33188,
      "new_path": "src/main/resources/eu/mulk/aendggner/web/app.js"
    },
    {
      "type": "modify",
      "old_id": "65ec0c98d09af4b078c05dd65390670af4ba3c21",
      "old_mode": 33188,
      "old_path": "src/main/resources/eu/mulk/aendggner/web/datenschutz.html",
      "new_id": "5b9bbacaabccefc963eb95fc6e3bdb29ba80890a",
      "new_mode": 33188,
      "new_path": "src/main/resources/eu/mulk/aendggner/web/datenschutz.html"
    },
    {
      "type": "modify",
      "old_id": "303db8e6c35f27fe1db905fde1e5ecc53deb059a",
      "old_mode": 33188,
      "old_path": "src/main/resources/eu/mulk/aendggner/web/impressum.html",
      "new_id": "525ef77406de7d8f2533f32064e02d4087ffcd86",
      "new_mode": 33188,
      "new_path": "src/main/resources/eu/mulk/aendggner/web/impressum.html"
    },
    {
      "type": "modify",
      "old_id": "02f8f75b4ad51b4fd4834526e262dcb4f8f93632",
      "old_mode": 33188,
      "old_path": "src/main/resources/eu/mulk/aendggner/web/index.html",
      "new_id": "9f26889f01d1aa10576857e0e78ad22b659d31a4",
      "new_mode": 33188,
      "new_path": "src/main/resources/eu/mulk/aendggner/web/index.html"
    },
    {
      "type": "modify",
      "old_id": "6e2ec70c3f21f9c18c0aaa116bce0cb3c06d8310",
      "old_mode": 33188,
      "old_path": "src/main/resources/eu/mulk/aendggner/web/style.css",
      "new_id": "cdea20e9d1018b49dd26faf0779f4370ed561637",
      "new_mode": 33188,
      "new_path": "src/main/resources/eu/mulk/aendggner/web/style.css"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "12ba400650be0d43319d98711c534d760576aa73",
      "new_mode": 33188,
      "new_path": "src/main/resources/eu/mulk/aendggner/web/worker.js"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "c4f5a9a3abb1d86d7a12ced20a6b3c7cd9446cef",
      "new_mode": 33188,
      "new_path": "src/wasm/java/eu/mulk/aendggner/wasm/BrowserMain.java"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "8817e4de3ed6881fc6bf4a44112e16401c02b545",
      "new_mode": 33188,
      "new_path": "src/wasm/java/eu/mulk/aendggner/wasm/InflaterErsatz.java"
    }
  ]
}
