)]}'
{
  "log": [
    {
      "commit": "ebd5a7bcfb13c1a74a5ad65de772e171d98ad156",
      "tree": "d43c01a878323bd14999ca5f6167ecf0cc5bae82",
      "parents": [
        "73c5dbae7a487db2b9ea29cd050eac94644974bb"
      ],
      "author": {
        "name": "Matthias Andreas Benkard",
        "email": "code@mail.matthias.benkard.de",
        "time": "Wed Jul 15 20:54:27 2026 +0200"
      },
      "committer": {
        "name": "Matthias Andreas Benkard",
        "email": "code@mail.matthias.benkard.de",
        "time": "Wed Jul 15 20:54:27 2026 +0200"
      },
      "message": "Support range structure replacement, struct renumbering, and multi-paragraph blocks\n\nAdds bisStelle to StrukturErsetzung for coordinated target ranges, recognizes\ndeletion/renumbering of whole structural units (paragraphs and Gliederung\nentries), and handles insertion/replacement of multi-paragraph blocks split on\n§-headings. Updates FASSUNGEN.txt accordingly.\n\nCo-Authored-By: Claude Sonnet 5 \u003cnoreply@anthropic.com\u003e\nChange-Id: I637cc5effbe32c094e62c070b63c470149a77c85\n"
    },
    {
      "commit": "e486b1f4efb034ed83247f4d4a84964ef9887221",
      "tree": "1fed779c320a9c1b7c750073f461bfe6fea0c971",
      "parents": [
        "9a29b384b84fac20f3c417ff9dcf3d461627e185"
      ],
      "author": {
        "name": "Matthias Andreas Benkard",
        "email": "code@mail.matthias.benkard.de",
        "time": "Mon Jul 13 21:33:47 2026 +0200"
      },
      "committer": {
        "name": "Matthias Andreas Benkard",
        "email": "code@mail.matthias.benkard.de",
        "time": "Mon Jul 13 21:33:47 2026 +0200"
      },
      "message": "Model and apply structural (Teil/Abschnitt) and TOC commands\n\nIntroduce the Gliederungsbaum into the model and support the structural\ncommand families that were the bulk of the remaining unknowns:\n\n- Gliederung gains a kennzahl; Gesetz carries the ordered list of\n  Gliederungseinheiten, which the loader now collects.\n- New Stelle components Gliederungseinheit (Teil/Abschnitt/Unterabschnitt/\n  Anlage/…) and Absatzbezeichnung; StellenParser parses these plus\n  \"Überschrift von \u003cGliederung\u003e\" and drops \"Satzteil/Angabe vor Nummer N\"\n  chapeau qualifiers.\n- Gliederungs-Überschrift Neufassung/Streichung apply to the tree and\n  render as a \"Geänderte Gliederungs-Überschriften\" diff section;\n  Absatzbezeichnung-Streichung removes an Absatz number; Inhaltsübersicht\n  \"Angabe(n) zu …\" commands are recognized (applied via the existing TOC\n  path).\n\nReuses Neufassung/Aufhebung with structural Stellen rather than adding new\ncommand types. Final UnbekannterBefehl counts: GEG 50-\u003e5, IfSG 11-\u003e3,\nAGG 2-\u003e0 (§ 1 Alters-\u003eLebensalters now applies), UWG 2-\u003e0.\n\nCo-Authored-By: Claude Opus 4.8 \u003cnoreply@anthropic.com\u003e\nChange-Id: I0cc91bfe65798140dd982b19f1884dfe60be87c4\n"
    },
    {
      "commit": "9a29b384b84fac20f3c417ff9dcf3d461627e185",
      "tree": "f872126e803a9b6452a18050cc4b701fd9b12da2",
      "parents": [
        "51712fc87ec0487bd471f24b2986a367847d24e9"
      ],
      "author": {
        "name": "Matthias Andreas Benkard",
        "email": "code@mail.matthias.benkard.de",
        "time": "Mon Jul 13 21:33:43 2026 +0200"
      },
      "committer": {
        "name": "Matthias Andreas Benkard",
        "email": "code@mail.matthias.benkard.de",
        "time": "Mon Jul 13 21:33:43 2026 +0200"
      },
      "message": "Support range, renumbering, and punctuation commands\n\nExtend the parser and applier for several command families that were\nfalling back to UnbekannterBefehl:\n\n- Range/coordinated Aufhebung (\"Die Nummern 1 bis 3 werden aufgehoben.\",\n  \"Die Absätze 4 und 5 werden aufgehoben.\") via bis-range expansion in\n  StellenParser.parseMehrfach and ausStellen.\n- Range renumbering without \"zu den\" and for Nummern/Buchstaben (\"Die\n  bisherigen Nummern 4 bis 6 werden die Nummern 8 bis 10.\"); single\n  renumbering now also covers Nummer/Buchstabe and \"Die bisherige\".\n- §-range Neufassung (\"Die §§ 52 bis 56 werden wie folgt gefasst: …\"),\n  splitting the quoted block at \"§ N\" boundaries.\n- \"Der Wortlaut wird Absatz N.\" — a new WortlautZuAbsatz command that\n  numbers the previously unnumbered body.\n- Word-to-punctuation replacement (\"… das Wort „oder\" am Ende durch ein\n  Komma ersetzt\") and comma+words insert/replace variants.\n\nStellenParser gains plural component words (Absätze/Sätze/Nummern/\nBuchstaben) and bis-range expansion. Cuts UnbekannterBefehl further:\nGEG 36-\u003e21, IfSG 7-\u003e3.\n\nCo-Authored-By: Claude Opus 4.8 \u003cnoreply@anthropic.com\u003e\nChange-Id: I4972d4eb1d6062521a55710c1f23822e8e22b0c4\n"
    },
    {
      "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"
    }
  ]
}
