)]}'
{
  "log": [
    {
      "commit": "65eff08b32a0f00ff0f5e4bda3fe5793f631ed64",
      "tree": "1d101859b51c80bc117ec72a871933575ed8b2f3",
      "parents": [
        "f20828ffd8ea9d554566636a9c53a3abd57507c5"
      ],
      "author": {
        "name": "Matthias Andreas Benkard",
        "email": "code@mail.matthias.benkard.de",
        "time": "Sat Jul 18 12:24:32 2026 +0200"
      },
      "committer": {
        "name": "Matthias Andreas Benkard",
        "email": "code@mail.matthias.benkard.de",
        "time": "Sun Jul 19 09:00:01 2026 +0200"
      },
      "message": "Support Bavarian state law (BayJG) with Art./§ inversion and superscripts\n\nExtend ÄndGgner from federal-only to Bavarian state law. Bavarian base\nlaws are structured in Artikel while their amending acts are structured\nin Paragraphen (inverted from the Bund); official sentence numbers and\nfootnote markers are carried as Unicode superscripts (¹²³, ⁶)).\n\n- Generalise Stelle.Paragraph to carry a sigil (\"§\" or \"Art.\") and route\n  it through recogniser, applier and resolver (bit-identical Bund output).\n- Superscript pipeline: geometric detection in FontgroessenFilter\n  (SuperskriptModus BEHALTEN), Superskript util, exact sentence splitting\n  in SatzTeiler, label-based sentence resolution.\n- BayRechtLoader/BayRechtTextParser for gesetze-bayern.de PDF/plaintext.\n- §-structured amending acts, GVBl/Landtag column titles, non-breaking\n  spaces, the GVBl continuation quote; Bavarian command forms (footnote\n  aufhebung, Satznummerierung streichung, Wortlaut forms, Halbsatz,\n  gapping chains).\n\nAcceptance (EndToEndTest.bayJgGvblAcceptance): the pre-2026 BayJG\nfassung (BayJG-alt.txt, reconstructed from Wayback single-article\nsnapshots) with GVBl 6/2026 §§ 1-2 applied — 154 commands, 0 unknown,\n149 applied automatically, 5 pinned residuals (follow-up edits inside\ntwo multi-step renumbering sequences in Art. 29a and Art. 56).\n\nApplication-side fixes surfaced by the acceptance run (all Bund-safe):\nsentence-start superscript before §; sentence boundaries \u003d {0} ∪ {each\nnumber ≥ 2}; gapping scope inheritance for bare word operations;\nfootnote definition lines hidden from word operations; absatz aufhebung\nmarks \"(weggefallen)\" keeping its number, and absatz renumbering\noverwrites an empty placeholder (weggefallen/gegenstandslos) target.\n\n211 tests green (mvnw verify); federal reference numbers unchanged.\n\nCo-Authored-By: Claude Opus 4.8 \u003cnoreply@anthropic.com\u003e\nChange-Id: Iebae4c17ca90755c5fd36251362042f3d5796fd0\n"
    },
    {
      "commit": "f20828ffd8ea9d554566636a9c53a3abd57507c5",
      "tree": "6d795f85206b7b427fe92fc1c89df5a2fba07595",
      "parents": [
        "99511a961d741e2dc06113cf5f24180bfea2b26b"
      ],
      "author": {
        "name": "Matthias Andreas Benkard",
        "email": "code@mail.matthias.benkard.de",
        "time": "Sat Jul 18 08:57:22 2026 +0200"
      },
      "committer": {
        "name": "Matthias Andreas Benkard",
        "email": "code@mail.matthias.benkard.de",
        "time": "Sun Jul 19 09:00:01 2026 +0200"
      },
      "message": "Classify line ends by alignment clusters and canonicalize definition lists\n\nThe percentile-based right-margin estimate from the previous commit\nmisclassified two real-world layouts: at the column switch of the\ntwo-column old-BGBl format a window contains both column margins, so the\n90th percentile returned the right column\u0027s margin and marked every\nleft-column soft wrap as deliberate (vetoing hyphen mending, IfSG 2020:\n\"Impf- surveillance\"); and series of equally wide centered \"Artikel N\"\nheadings in draft bills formed the top of their window\u0027s distribution,\nso they counted as full-width and were reflowed into the following line,\nbreaking teileInArtikel\u0027s line anchor (ProdHaftG RegE). Classify against\nalignment clusters instead: a line end is soft when at least five window\nlines end within 4 pt of it (the justified block\u0027s own margin), hard when\nsuch a cluster runs at least 10 pt above it, unclassified otherwise.\nStructure anchors (\"Artikel 2\", \"§ 19\", bare Gliederung labels) are\nalways exempt from reflow since equal-width heading series still form\nsham clusters. Also flush the pending line end-X at page ends — without\nit, the first line of the next page inherited the previous page\u0027s footer\ngeometry and was misclassified (UWG: \"Artikel 2\" swallowed the closing\nprovisions).\n\nMarkerless joins additionally never cross into a following enumeration\nmarker line (\"...vorgesehen und\" + \"d) die Überwachung\" no longer glues\nto \"undd)\"), a text-level veto that also works without geometry.\n\nOn the base-law side, ContentFlattener now separates sibling \u003cLA\u003e\nelements within a \u003cDD\u003e — the short-label/definition pairs of the UWG\nAnhang and § 2 IfSG were previously glued without any separator\n(\"Irreführung über Unternehmereigenschaftdie unwahre Angabe...\") in both\nsynopsis columns. The continuation line is indented two spaces deeper\nthan its enumeration line so StellenAufloeser.zeilenBlock keeps it inside\nthe unit\u0027s block (\"Anhang Nummer 31 Buchstabe b\"). BefehlAnwender writes\nthe same canonical shape when inserting or recasting quoted units\n(rueckeZitatEin), so XML-derived and PDF-derived items agree:\n\"  2a. Stichwort\" + \"    Definitionstext\".\n\nVerified by mvnw verify (179 tests, 7 new) and a before/after sweep of\nall 21 sample law/amendment combinations: applied/manual counts are\nunchanged throughout (UWG 19/0, GEG-BGBl 66/53, GModG-RegE 77/20,\nIfSG-0645 42/24, ...), no marker characters leak into the HTML output.\n\nCo-Authored-By: Claude Fable 5 \u003cnoreply@anthropic.com\u003e\nChange-Id: Ib7faae1bc5c59bda83f648a579af16a4c77e4285\n"
    },
    {
      "commit": "99511a961d741e2dc06113cf5f24180bfea2b26b",
      "tree": "e2f122bbb26bef6b69f72baf7901907a1084ed19",
      "parents": [
        "6311227992ba509b5e5e3256504980bf4632742d"
      ],
      "author": {
        "name": "Matthias Andreas Benkard",
        "email": "code@mail.matthias.benkard.de",
        "time": "Fri Jul 17 07:16:51 2026 +0200"
      },
      "committer": {
        "name": "Matthias Andreas Benkard",
        "email": "code@mail.matthias.benkard.de",
        "time": "Fri Jul 17 07:16:51 2026 +0200"
      },
      "message": "Classify line breaks geometrically via PDFBox coordinates and support list indentation\n\nReplaces the heuristic character-count full-width check with real geometric\nlayout analysis. FontgroessenFilter collects the right-edge X coordinate of\nthe text runs on each page and classifies line endings against the local\n90th percentile of page margins (using a 20-line sliding window) into soft,\nhard, or unclassified breaks.\n\nTextBereiniger uses this classification to reflow only soft line wraps (WEICH) and\nkeep deliberate ones (HART or UNBEKANNT).\n\nAlso aligns quote normalization and GII-XML flattening to indent continuation\nlines in lists (e.g., hanging definitions in UWG Anhang):\n- BefehlAnwender.normalisiereZitatText applies to single-unit Neufassung and indents\n  continuation lines deeper (4 spaces) than list items (2 spaces).\n- ContentFlattener generates the same structure for sibling \u003cLA\u003e elements inside \u003cDD\u003e.\n\nThis ensures the paragraph parser correctly groups these lines as child lines.\n\nChange-Id: I1fd7039d4933a273cc2dc55f958d34b439e2302c\n"
    },
    {
      "commit": "6311227992ba509b5e5e3256504980bf4632742d",
      "tree": "db8c65cf47c22c761f20f2a78fd548fced6858bd",
      "parents": [
        "b7e9f0f4756bf87ef98500d5fd0ce87d2916c3c4"
      ],
      "author": {
        "name": "Matthias Andreas Benkard",
        "email": "code@mail.matthias.benkard.de",
        "time": "Fri Jul 17 05:10:53 2026 +0200"
      },
      "committer": {
        "name": "Matthias Andreas Benkard",
        "email": "code@mail.matthias.benkard.de",
        "time": "Fri Jul 17 05:10:53 2026 +0200"
      },
      "message": "Fix markerless line-break join gluing whole words without a space\n\nTextBereiniger.verbindeUmbrueche assumed any letter-ending, no-trailing-space\nline followed by a lowercase continuation was a hyphen-less mid-word split\n(PDF extraction artifact) and joined it with zero separator. That assumption\nbreaks for deliberate word-boundary breaks, e.g. the short-label/hanging-\nindent definition format in the UWG Anhang (\"...Nachhaltigkeitssiegels\" +\n\"das Anbringen...\"), producing glued words in the rendered synopsis.\n\nGate the markerless join on the candidate line reaching a locally-typical\n\"full column width\" (90th percentile in a ±20-line window), since automatic\nwraps always land near the column edge while deliberate breaks don\u0027t. The\nwindow is local rather than document-wide because some source PDFs mix\ncolumn widths within one document (narrower Regelungstext vs. wider\nBegründung), which a global statistic would otherwise penalize.\n\nAlso route the single-unit Neufassung fallback through the existing\nnormalisiereZitatText normalization, matching its sibling code paths, so\nthat internal line breaks now more often preserved by the fix above don\u0027t\nleak into the HTML output as spurious line breaks instead.\n\nCo-Authored-By: Claude Sonnet 5 \u003cnoreply@anthropic.com\u003e\nChange-Id: I0a79f22f9286cd4a90eea32bad9b54cb4a082cf4\n"
    },
    {
      "commit": "b7e9f0f4756bf87ef98500d5fd0ce87d2916c3c4",
      "tree": "82c7f38b566d2ded6989cdd05ea628dcf4ba6de2",
      "parents": [
        "ebd5a7bcfb13c1a74a5ad65de772e171d98ad156"
      ],
      "author": {
        "name": "Matthias Andreas Benkard",
        "email": "code@mail.matthias.benkard.de",
        "time": "Thu Jul 16 21:12:08 2026 +0200"
      },
      "committer": {
        "name": "Matthias Andreas Benkard",
        "email": "code@mail.matthias.benkard.de",
        "time": "Thu Jul 16 21:12:08 2026 +0200"
      },
      "message": "Support Anhang/Anlage targets, Inhaltsübersicht Angabe commands, and Gliederungs-Überschriften insertion/replacement\n\nFourth enablement wave: Anhänge/Anlagen resolve as ordinary norm targets with\nnested Nummer/Buchstabe block resolution, InhaltsuebersichtAnwender applies\nAngabe commands automatically, GliederungsUeberschriften handles inserting and\nreplacing structural headings, the law\u0027s own heading can be recast, and\nFontgroessenFilter now determines body text per page instead of document-wide.\nSample data (UWG/AGG/ProdHaftG) now applies with 0 manual cases.\n\nCo-Authored-By: Claude Sonnet 5 \u003cnoreply@anthropic.com\u003e\nChange-Id: I1a76750afbecfa1aae734bcdabc91470a28420ca\n"
    },
    {
      "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": "73c5dbae7a487db2b9ea29cd050eac94644974bb",
      "tree": "02eb946f6b971f0960fe7c86cc79c15aaffe12a5",
      "parents": [
        "e486b1f4efb034ed83247f4d4a84964ef9887221"
      ],
      "author": {
        "name": "Matthias Andreas Benkard",
        "email": "code@mail.matthias.benkard.de",
        "time": "Mon Jul 13 21:42:38 2026 +0200"
      },
      "committer": {
        "name": "Matthias Andreas Benkard",
        "email": "code@mail.matthias.benkard.de",
        "time": "Mon Jul 13 21:42:38 2026 +0200"
      },
      "message": "Add FASSUNGEN.txt version register\n\nRecord the changes of the \"Fassung vom 13.7.2026\" in bureaucratic legal\nGerman, mirroring the amendment-act style the tool itself processes.\nConvention: add a dated section (newest first) for every day the code\nchanges.\n\nCo-Authored-By: Claude Opus 4.8 \u003cnoreply@anthropic.com\u003e\nChange-Id: Ib39e4f78405b33b439be006325e2c310b72b1511\n"
    }
  ]
}
