)]}'
{
  "log": [
    {
      "commit": "51712fc87ec0487bd471f24b2986a367847d24e9",
      "tree": "131061eaf3664bfbb2a49abf9a43628e31a33867",
      "parents": [
        "b05e44a627b3bbdf6f8b2e920b963709fd348f5a"
      ],
      "author": {
        "name": "Matthias Andreas Benkard",
        "email": "code@mail.matthias.benkard.de",
        "time": "Mon Jul 13 21:33:25 2026 +0200"
      },
      "committer": {
        "name": "Matthias Andreas Benkard",
        "email": "code@mail.matthias.benkard.de",
        "time": "Mon Jul 13 21:33:25 2026 +0200"
      },
      "message": "Recognize compound and multi-pair amendment commands\n\nSplit BefehlErkenner into a single-command pass and a fallback that\ncomposes Sammelbefehle from commands chained with \"und\"/\", wird\":\n\n- Multi-pair replacement (\"… A durch B und C durch D ersetzt\") emits one\n  Ersetzung per pair, crossed with the (possibly coordinated) Stelle.\n- Verbund splitter probes each \"und\"/\", wird\" boundary; when both halves\n  parse — trying the right clause as-is, capitalized, or with the left\n  clause\u0027s locative prefix — it folds them into one Sammelbefehl.\n\nThe single pass no longer short-circuits when a pattern matches but its\nStelle is unparseable, so the fallback still gets a chance. Add\n\"ein Komma eingefügt\" and anchor-first insertion patterns the splitter\nneeds, and let StellenParser.parseMehrfach inherit the component type for\nbare-number continuations (\"Absatz 1 und 5\").\n\nCuts UnbekannterBefehl counts: GEG 50-\u003e36, IfSG 11-\u003e7, AGG/UWG 2-\u003e1.\n\nCo-Authored-By: Claude Opus 4.8 \u003cnoreply@anthropic.com\u003e\nChange-Id: I8f76edd0c9ed6cf68c10c50f535a8182e13e378e\n"
    },
    {
      "commit": "b05e44a627b3bbdf6f8b2e920b963709fd348f5a",
      "tree": "af77a6cf2fb584de346e6a9387aa10fca9b14767",
      "parents": [
        "91a57498aa4acf266d0ab255aa06c18527846eec"
      ],
      "author": {
        "name": "Matthias Andreas Benkard",
        "email": "code@mail.matthias.benkard.de",
        "time": "Mon Jul 13 21:33:20 2026 +0200"
      },
      "committer": {
        "name": "Matthias Andreas Benkard",
        "email": "code@mail.matthias.benkard.de",
        "time": "Mon Jul 13 21:33:20 2026 +0200"
      },
      "message": "Support multi-target \"jeweils\" commands and range renumbering\n\nAdd a Sammelbefehl command that applies one operation to several\n\"und\"/\"sowie\"/comma-coordinated Stellen sharing a common prefix, and\nresolve \"Die bisherigen Absätze X bis Y werden zu den Absätzen X\u0027 bis Y\u0027\"\ninto descending single renumberings. Parsing gains\nStellenParser.parseMehrfach; the applier folds sub-commands into one log\nentry.\n\nCo-Authored-By: Claude Opus 4.8 \u003cnoreply@anthropic.com\u003e\nChange-Id: Iaa2c7161066d40d0605c00d3b6ca9a08696070e7\n"
    },
    {
      "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"
    },
    {
      "commit": "58e19982f25ae6433d7837454bb54b8edc37589c",
      "tree": "ba5f4f8712150e0a9aae195e59290393831845a4",
      "parents": [
        "d1e2facd01c88dbd4758fbc2a64bf9e01abca4e7"
      ],
      "author": {
        "name": "Matthias Andreas Benkard",
        "email": "code@mail.matthias.benkard.de",
        "time": "Mon Jul 13 07:09:19 2026 +0200"
      },
      "committer": {
        "name": "Matthias Andreas Benkard",
        "email": "code@mail.matthias.benkard.de",
        "time": "Mon Jul 13 07:09:19 2026 +0200"
      },
      "message": "Add tests, usage documentation, and .claude/ to .gitignore.\n\nUnit tests for the gii-norm loader, text cleanup, quote extraction,\ncommand recognition (literal sentences from the sample amendment act),\nsentence splitting, and command application on a synthetic mini law;\nan HTML renderer test including escaping; and an end-to-end smoke test\non the IfSG sample data that skips itself when the (untracked) sample\nfiles are absent.  The README gains a German usage section.\n\nCo-Authored-By: Claude Fable 5 \u003cnoreply@anthropic.com\u003e\nChange-Id: I7f02ff349f9c3bd34fa90a2a84678b9e6fad697d\n"
    }
  ]
}
