)]}'
{
  "commit": "2d33bf7cdf9160a2ba2d44194a264c3660831978",
  "tree": "2ad93e3c06f1528e25a3b69bd8a9805589e2d512",
  "parents": [
    "74a84c56047f3463f9086fcffad5c62f402e047e"
  ],
  "author": {
    "name": "Matthias Andreas Benkard",
    "email": "code@mail.matthias.benkard.de",
    "time": "Sun Aug 16 06:40:07 2026 +0200"
  },
  "committer": {
    "name": "Matthias Andreas Benkard",
    "email": "code@mail.matthias.benkard.de",
    "time": "Sun Aug 16 06:40:07 2026 +0200"
  },
  "message": "Die Web-Version wird öffentlich betreibbar\n\nDie Browserfassung war für den öffentlichen Betrieb gesperrt, und zwar\nausdrücklich: Impressum und Datenschutzerklärung trugen TODO-Blöcke statt\nAngaben, der Quelltextverweis im Fuß zeigte auf\nhttps://TODO-QUELLCODE-URL-EINTRAGEN, und der README führte beides als „vor dem\nproduktiven Betrieb zwingend zu erledigen“. Beide Sperren fallen; die\nAuslieferung wird zugleich auf das tatsächliche Ziel eingerichtet — einen\nUnterpfad einer bestehenden Domain (/aendggner/), nicht einen eigenen Server.\n\nImpressum und Datenschutz führen nun die wirklichen Angaben: § 5 DDG (nicht mehr\n§ 5 TMG) samt § 18 Abs. 2 MStV, Verantwortlicher nach Art. 4 Nr. 7 DSGVO,\nRechtsgrundlage Art. 6 Abs. 1 lit. f für die Zugriffsprotokolle, deren Frist mit\nvierzehn Tagen benannt ist, sowie die Betroffenenrechte samt Aufsichtsbehörde.\nDie Aussage über die Dateien der Nutzer:innen bleibt, wie sie war; sie trifft zu,\nweil die Verarbeitung den Rechner nicht verlässt.\n\nDer Quelltext wird beigelegt statt verlinkt. deploy/webpaket.sh tritt in der\nPhase „package“ hinter den Übersetzer und macht aus dessen Ergebnis ein\nauslieferbares Verzeichnis: Es wirft den .wat-Zwischenschritt fort (368 MB, der\nbislang von Hand zu übergehen war), legt den Quelltext der gebauten Fassung als\naendggner-quelltext.tar.gz nebst Fassungskennung daneben und komprimiert nach\n.gz und .br vor. Ein veränderter Arbeitsbaum bricht den Bau ab: Der beigelegte\nQuelltext wäre alsdann nicht der ausgelieferte, und die Auflage des § 13 AGPLv3\nwäre gerade verfehlt. Der Fuß verweist primär auf den Tarball, kompakt daneben\nauf Gerrit als fortlaufende Quelle.\n\nDie nginx-Vorlage wird vom server-Block zum location-Schnipsel. Vier Punkte sind\ndabei mehr als Umschrift:\n\n* Die Dateien werden über root statt über alias zugeordnet. In einer\n  Präfix-Location löst try_files gegen den root auf, nicht gegen den alias, und\n  lieferte sonst 404 für alles.\n\n* Die Haltefrist von sieben Tagen entfällt zugunsten der Revalidierung. Die\n  Dateinamen tragen keine Fassungskennung; ein Wiederkehrer mit altem app.js und\n  neuem .wasm bekäme sonst eine Mischfassung, die es nie gegeben hat. Ein 304\n  für das unveränderte Modul kostet nichts.\n\n* Vorkomprimiertes wird ausgeliefert (gzip_static/brotli_static), statt 24 MB je\n  Abruf neu zu packen — brotli drückt sie auf 7,1 MB.\n\n* Hinzu treten die Sicherheitskopfzeilen samt Inhaltsrichtlinie. Zwei ihrer\n  Freigaben sind unvermeidlich, beide in der Vorlage begründet: \u0027wasm-unsafe-eval\u0027\n  für die Instanziierung des Moduls (echtes eval kommt in der erzeugten\n  aendggner.js nicht vor), und \u0027unsafe-inline\u0027 für Stile, weil die Synopse als\n  blob:-Dokument die Richtlinie der erzeugenden Seite erbt, ihr Stylesheet aber\n  eingebettet trägt. Die Notwendigkeit ist gemessen, nicht vermutet: ohne die\n  Freigabe meldet das Synopse-Dokument null aktive Stylesheets und\n  Standardschrift, mit ihr eines mit dreiundzwanzig Regeln.\n\nDazu drei Kleinigkeiten, die erst unter einem Unterpfad auffallen: ein Hinweis\nfür abgeschaltetes JavaScript (bislang blieb das Formular wortlos wirkungslos),\nein relativ verwiesenes favicon.svg (der Abruf der Domainwurzel ginge ins Leere)\nsowie Kurzbeschreibung und kanonische Adresse. Eine robots.txt unterbleibt\nbewusst: Unter einem Unterpfad ist sie wirkungslos, maßgeblich ist allein die der\nDomainwurzel; die Vorlage vermerkt, was dort einzutragen wäre.\n\nGeprüft ist beides, Bau und Lauf: 304 Prüfungen laufen durch, -Pwasm package\nhinterlässt ein Verzeichnis ohne .wat und mit vollständigem Tarball, und der\nIfSG-Fall ergibt im Browser unter der Inhaltsrichtlinie 48 angewandte Befehle,\n27 zur manuellen Prüfung und 21 geänderte Normen — dasselbe wie die\nBefehlszeile, ohne eine einzige Beanstandung in der Konsole.\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\nChange-Id: I004490ddaa7c424a60fb0ebac63fc9fc098736e3\n",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "ec8aeb5f7ef5bfeda1eec8f65393f40eb97ea658",
      "old_mode": 33188,
      "old_path": "FASSUNGEN.txt",
      "new_id": "ad304baa7f30b85e87fc2191d5525925562156e7",
      "new_mode": 33188,
      "new_path": "FASSUNGEN.txt"
    },
    {
      "type": "modify",
      "old_id": "586b17feb4388345ec66ba62f9cc2cebd3a36de2",
      "old_mode": 33188,
      "old_path": "README.adoc",
      "new_id": "b2329b7428d02df927e9557617907c53b58dd36b",
      "new_mode": 33188,
      "new_path": "README.adoc"
    },
    {
      "type": "modify",
      "old_id": "46eacb50a4ee95799175e4b9338c8de48cb4d121",
      "old_mode": 33188,
      "old_path": "deploy/nginx-aendggner.conf",
      "new_id": "78677b512ee9e39655eaea7cac8993c090d39b58",
      "new_mode": 33188,
      "new_path": "deploy/nginx-aendggner.conf"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "20031346e8501ec4c21449ee187732ae3aecedb0",
      "new_mode": 33261,
      "new_path": "deploy/webpaket.sh"
    },
    {
      "type": "modify",
      "old_id": "601b9e9c7906c910e2ac617ff8296700d69dbcea",
      "old_mode": 33188,
      "old_path": "pom.xml",
      "new_id": "b66267f3a55c7ef4d0183bf044c87f57d5fa33b4",
      "new_mode": 33188,
      "new_path": "pom.xml"
    },
    {
      "type": "modify",
      "old_id": "5b9bbacaabccefc963eb95fc6e3bdb29ba80890a",
      "old_mode": 33188,
      "old_path": "src/main/resources/eu/mulk/aendggner/web/datenschutz.html",
      "new_id": "a8d046aa2f8e97699bbe93230aed38ba16ed34ab",
      "new_mode": 33188,
      "new_path": "src/main/resources/eu/mulk/aendggner/web/datenschutz.html"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "4f6a8471a3c841dfacb904cdc045983f6f13a42f",
      "new_mode": 33188,
      "new_path": "src/main/resources/eu/mulk/aendggner/web/favicon.svg"
    },
    {
      "type": "modify",
      "old_id": "525ef77406de7d8f2533f32064e02d4087ffcd86",
      "old_mode": 33188,
      "old_path": "src/main/resources/eu/mulk/aendggner/web/impressum.html",
      "new_id": "3832d0387007372ccf5b894fe905089bfa5089ac",
      "new_mode": 33188,
      "new_path": "src/main/resources/eu/mulk/aendggner/web/impressum.html"
    },
    {
      "type": "modify",
      "old_id": "9f26889f01d1aa10576857e0e78ad22b659d31a4",
      "old_mode": 33188,
      "old_path": "src/main/resources/eu/mulk/aendggner/web/index.html",
      "new_id": "9d1e343aeb03d9b23e73ba30d3b3b76444fb6023",
      "new_mode": 33188,
      "new_path": "src/main/resources/eu/mulk/aendggner/web/index.html"
    },
    {
      "type": "modify",
      "old_id": "cdea20e9d1018b49dd26faf0779f4370ed561637",
      "old_mode": 33188,
      "old_path": "src/main/resources/eu/mulk/aendggner/web/style.css",
      "new_id": "8aa1e11e69dfd7dea7d535f8915f8b51083886ba",
      "new_mode": 33188,
      "new_path": "src/main/resources/eu/mulk/aendggner/web/style.css"
    }
  ]
}
