)]}'
{
  "commit": "8ae49729ee18a102d503324f2be49c35694b244a",
  "tree": "1712c78dbf321a0c671425cfbbd4c9a7a5a7106b",
  "parents": [
    "99962fb4aff2a11074b7179b71ed5a5f0cdbc8e4"
  ],
  "author": {
    "name": "Matthias Andreas Benkard",
    "email": "code@mail.matthias.benkard.de",
    "time": "Mon Jul 13 21:32:53 2026 +0200"
  },
  "committer": {
    "name": "Matthias Andreas Benkard",
    "email": "code@mail.matthias.benkard.de",
    "time": "Mon Jul 13 21:32:53 2026 +0200"
  },
  "message": "Support the digital BGBl format and bill drafts as inputs.\n\nThe Bundesgesetzblatt has been published digitally via recht.bund.de\nsince 2023 in a new single-column layout, and pending amendment acts\nare only available as Referenten-/Regierungsentwuerfe or Bundestag\nprinted papers.  Both now work as patch inputs:\n\n* PDF extraction filters out small print by font size (two-pass\n  PDFTextStripper): in the new BGBl format, footnote blocks and\n  superscript footnote markers would otherwise land in the middle of\n  the statutory text, even inside quoted passages.\n* TextBereiniger recognizes the new page headers (BGBl \"Seite N von\n  M\", draft page markers \" - N - \", Bundestag printed-paper headers)\n  and joins markerless end-of-line hyphenation (BT-Drs PDFs break\n  words without a hyphen character; regular wraps carry a trailing\n  space, so its absence is the signal -- gated on the source using\n  the trailing-space convention at all, protecting hand-written\n  plain-text inputs).  BMJV draft templates draw the hanging opening\n  quote after the paragraph marker (\"(1) „\" / \"§ 19„\"); this\n  inversion is repaired.\n* Drafts embed the statutory text between a cover sheet and a\n  Begruendung section; article scanning now stops at the Begruendung\n  heading.  Articles without numbered items (single-command articles\n  like ProdHaftG-RegE Artikel 2) are parsed from the preamble rest.\n* Target-law matching is declension-tolerant (\"Das Allgemeine\n  Gleichbehandlungsgesetz\" matches \"Allgemeines\n  Gleichbehandlungsgesetz\") via rough word-stem comparison.\n* New command form StrukturErsetzung (\"§ 2 Absatz 2 wird durch die\n  folgenden Absätze 2 und 3 ersetzt\"); \"durch die folgende\n  Überschrift/den folgenden § N ersetzt\" map to Neufassung; plural\n  insertions (\"die folgenden Absätze 6 und 7\"), triple-letter outline\n  markers (aaa), the compound punctuation replacement (\"durch ein\n  Komma und die Wörter ... ersetzt\"), and Inhaltsuebersicht-Angaben\n  inside a context frame are recognized.\n\nEnd-to-end smoke tests cover the four new datasets: UWG (new BGBl\nformat, footnote-filter assertion), GEG 2023 (\"Heizungsgesetz\",\n121 commands), AGG (BT-Drs draft against an unconsolidated base --\nthe first dataset with real diffs, spot-checked against the official\nBMJV synopsis), and ProdHaftG (draft whose Artikel 1 is a replacement\nlaw and only Artikel 2 amends the base).\n\nCo-Authored-By: Claude Fable 5 \u003cnoreply@anthropic.com\u003e\nChange-Id: Id1b12bc0bee4178bd1a5c55b3a83f6e13944af69\n",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "c44cfcf143b591d5c5475d9743a967ac8a50db39",
      "old_mode": 33188,
      "old_path": "src/main/java/eu/mulk/aendggner/aenderung/Aenderungsbefehl.java",
      "new_id": "60f5971aeee4ca416d8bfa7102cfdbbad76440e2",
      "new_mode": 33188,
      "new_path": "src/main/java/eu/mulk/aendggner/aenderung/Aenderungsbefehl.java"
    },
    {
      "type": "modify",
      "old_id": "085da2ac1d53524dbf5b42126e9c7a6a84a7fd47",
      "old_mode": 33188,
      "old_path": "src/main/java/eu/mulk/aendggner/aenderung/parse/AenderungsgesetzParser.java",
      "new_id": "61c917adde3603dfc0810792888791a2e61d515a",
      "new_mode": 33188,
      "new_path": "src/main/java/eu/mulk/aendggner/aenderung/parse/AenderungsgesetzParser.java"
    },
    {
      "type": "modify",
      "old_id": "55155ddc53eda84e003225d5be11525dd5ad9a3b",
      "old_mode": 33188,
      "old_path": "src/main/java/eu/mulk/aendggner/aenderung/parse/BefehlErkenner.java",
      "new_id": "22c297605aeb8686a4454a76dde98554ac91fd56",
      "new_mode": 33188,
      "new_path": "src/main/java/eu/mulk/aendggner/aenderung/parse/BefehlErkenner.java"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "4303f6b95e3d4a955d0600c576517734b8f0a3ef",
      "new_mode": 33188,
      "new_path": "src/main/java/eu/mulk/aendggner/aenderung/parse/FontgroessenFilter.java"
    },
    {
      "type": "modify",
      "old_id": "02024f94ae17f40a7faeab1598399bcf161db9d3",
      "old_mode": 33188,
      "old_path": "src/main/java/eu/mulk/aendggner/aenderung/parse/GliederungsScanner.java",
      "new_id": "3163a6283eb8165d7f39a61b5aac171062e89868",
      "new_mode": 33188,
      "new_path": "src/main/java/eu/mulk/aendggner/aenderung/parse/GliederungsScanner.java"
    },
    {
      "type": "modify",
      "old_id": "1b07d40917fe5f2cad0833fd9ff13c5f9f1c568b",
      "old_mode": 33188,
      "old_path": "src/main/java/eu/mulk/aendggner/aenderung/parse/PatchTextExtraktor.java",
      "new_id": "9112cb69939061c0716d93b9bd862c8a40e951e3",
      "new_mode": 33188,
      "new_path": "src/main/java/eu/mulk/aendggner/aenderung/parse/PatchTextExtraktor.java"
    },
    {
      "type": "modify",
      "old_id": "777b2d5bb529f987ccfe354267e41e11951635d5",
      "old_mode": 33188,
      "old_path": "src/main/java/eu/mulk/aendggner/aenderung/parse/StellenParser.java",
      "new_id": "ad794b51ae8a21a28f4f0e00b1a751cc5ae84590",
      "new_mode": 33188,
      "new_path": "src/main/java/eu/mulk/aendggner/aenderung/parse/StellenParser.java"
    },
    {
      "type": "modify",
      "old_id": "3fd6a8c358ad8e3b528c80afbc98c9032eeb51b7",
      "old_mode": 33188,
      "old_path": "src/main/java/eu/mulk/aendggner/aenderung/parse/TextBereiniger.java",
      "new_id": "bbe4e403b34d370421195391c544fcf7e48e8680",
      "new_mode": 33188,
      "new_path": "src/main/java/eu/mulk/aendggner/aenderung/parse/TextBereiniger.java"
    },
    {
      "type": "modify",
      "old_id": "3d36575f9721f70a014e0ff7ebd46617a32c9eba",
      "old_mode": 33188,
      "old_path": "src/main/java/eu/mulk/aendggner/anwendung/BefehlAnwender.java",
      "new_id": "02be593e0ac5982d6789fceb3902e06d48678edc",
      "new_mode": 33188,
      "new_path": "src/main/java/eu/mulk/aendggner/anwendung/BefehlAnwender.java"
    },
    {
      "type": "modify",
      "old_id": "57e745f690e1e5e0da2b9ecc27acaf19659ef22e",
      "old_mode": 33188,
      "old_path": "src/test/java/eu/mulk/aendggner/EndToEndTest.java",
      "new_id": "5254ff29fa1806404c616595d57916937f39d233",
      "new_mode": 33188,
      "new_path": "src/test/java/eu/mulk/aendggner/EndToEndTest.java"
    },
    {
      "type": "modify",
      "old_id": "c8f9cb82a2d3b522dfb3338707c05f6b53a0e0ee",
      "old_mode": 33188,
      "old_path": "src/test/java/eu/mulk/aendggner/aenderung/parse/BefehlErkennerTest.java",
      "new_id": "f0282c55d3a6299f403fd989a6244fd3c197d77d",
      "new_mode": 33188,
      "new_path": "src/test/java/eu/mulk/aendggner/aenderung/parse/BefehlErkennerTest.java"
    },
    {
      "type": "modify",
      "old_id": "d8c5a03aef6b880431ff5ecf29097033522434b6",
      "old_mode": 33188,
      "old_path": "src/test/java/eu/mulk/aendggner/aenderung/parse/TextBereinigerTest.java",
      "new_id": "98dc1d3000c8a8215d72b1e9325a03f15d33fbe0",
      "new_mode": 33188,
      "new_path": "src/test/java/eu/mulk/aendggner/aenderung/parse/TextBereinigerTest.java"
    },
    {
      "type": "modify",
      "old_id": "26557d1f15e80f35dc0729c06bda189c95b87381",
      "old_mode": 33188,
      "old_path": "src/test/java/eu/mulk/aendggner/anwendung/BefehlAnwenderTest.java",
      "new_id": "beae519ee40ca03ac11d3999f469a4d65e1bd039",
      "new_mode": 33188,
      "new_path": "src/test/java/eu/mulk/aendggner/anwendung/BefehlAnwenderTest.java"
    }
  ]
}
