)]}'
{
  "commit": "d1e2facd01c88dbd4758fbc2a64bf9e01abca4e7",
  "tree": "05984a493b1a583543068be368aeb191ccd01d79",
  "parents": [
    "1b9bfb1bfed11593e08cde8bb072dbfb5980b740"
  ],
  "author": {
    "name": "Matthias Andreas Benkard",
    "email": "code@mail.matthias.benkard.de",
    "time": "Mon Jul 13 07:09:04 2026 +0200"
  },
  "committer": {
    "name": "Matthias Andreas Benkard",
    "email": "code@mail.matthias.benkard.de",
    "time": "Mon Jul 13 07:09:04 2026 +0200"
  },
  "message": "Implement the synopsis pipeline for amendment acts.\n\nAdd the full vertical slice from input files to a two-column HTML\nsynopsis:\n\n* gesetz, gesetz.gii: immutable law model (Gesetz/Norm/Absatz) and an\n  offline loader for the gii-norm XML format of gesetze-im-internet.de,\n  flattening DL enumerations, tables, and pre blocks.\n* aenderung: amendment command model as a sealed interface with records\n  (Ersetzung, Neufassung, Einfuegung, Anfuegung, Aufhebung, Streichung,\n  Umnummerierung), including UnbekannterBefehl as the mandatory\n  fallback -- unrecognized commands are reported, never dropped.\n* aenderung.parse: text extraction (PDFBox in content-stream order for\n  two-column BGBl PDFs, plain text as escape hatch), BGBl header and\n  hyphenation cleanup, quote extraction with placeholder substitution\n  (quoted blocks cannot confuse the command regexes; unbalanced quotes\n  -- which occur in real BGBl documents -- become warnings), outline\n  scanning with successor-validated markers (1., a), aa), aa1)), and\n  the command recognizer with context-frame stacking.\n* anwendung: sequential command application with a per-command protocol\n  (ANGEWANDT / MANUELL_PRUEFEN plus reason), scope resolution down to\n  sentence/enumeration ranges via a German sentence splitter.\n* synopse: norm pairing, word-level diff via java-diff-utils, and a\n  self-contained HTML renderer with a Manuell-pruefen section.\n\nThe CLI gains -o/--output, --vollstaendig, --artikel, --extract-only,\nand hidden debug flags (--dump-gesetz, --dump-befehle).\n\nOn the IfSG sample (Drittes Bevoelkerungsschutzgesetz, BGBl. I 2020\nS. 2397), 63 of 75 commands in Artikel 1 and 2 parse into typed\ncommands; the remainder are ranges and compound commands that are\ndeliberately out of scope for v1.\n\nCo-Authored-By: Claude Fable 5 \u003cnoreply@anthropic.com\u003e\nChange-Id: I93ef8ba300f1cac70916722f23c0cefc5f62da2b\n",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "c4efd458ec1fdab87fcc01c7b35712b1ea5526c1",
      "old_mode": 33188,
      "old_path": "src/main/java/eu/mulk/aendggner/AendGgner.java",
      "new_id": "f7e6bf7db2f76469f730de48c0a7f47f047fdadf",
      "new_mode": 33188,
      "new_path": "src/main/java/eu/mulk/aendggner/AendGgner.java"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "c44cfcf143b591d5c5475d9743a967ac8a50db39",
      "new_mode": 33188,
      "new_path": "src/main/java/eu/mulk/aendggner/aenderung/Aenderungsbefehl.java"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "07a1087065638551ab9154f2046fcfdb570244b2",
      "new_mode": 33188,
      "new_path": "src/main/java/eu/mulk/aendggner/aenderung/Provenienz.java"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "0bcceb6b80e30199ddd6ba29936009b436cd8c9b",
      "new_mode": 33188,
      "new_path": "src/main/java/eu/mulk/aendggner/aenderung/Stelle.java"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "085da2ac1d53524dbf5b42126e9c7a6a84a7fd47",
      "new_mode": 33188,
      "new_path": "src/main/java/eu/mulk/aendggner/aenderung/parse/AenderungsgesetzParser.java"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "55155ddc53eda84e003225d5be11525dd5ad9a3b",
      "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": "02024f94ae17f40a7faeab1598399bcf161db9d3",
      "new_mode": 33188,
      "new_path": "src/main/java/eu/mulk/aendggner/aenderung/parse/GliederungsScanner.java"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "1b07d40917fe5f2cad0833fd9ff13c5f9f1c568b",
      "new_mode": 33188,
      "new_path": "src/main/java/eu/mulk/aendggner/aenderung/parse/PatchTextExtraktor.java"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "777b2d5bb529f987ccfe354267e41e11951635d5",
      "new_mode": 33188,
      "new_path": "src/main/java/eu/mulk/aendggner/aenderung/parse/StellenParser.java"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "3fd6a8c358ad8e3b528c80afbc98c9032eeb51b7",
      "new_mode": 33188,
      "new_path": "src/main/java/eu/mulk/aendggner/aenderung/parse/TextBereiniger.java"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "c24a1dc823bf9db937cf50402f9f802a5e5a9fbb",
      "new_mode": 33188,
      "new_path": "src/main/java/eu/mulk/aendggner/aenderung/parse/ZitatExtraktor.java"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "3d36575f9721f70a014e0ff7ebd46617a32c9eba",
      "new_mode": 33188,
      "new_path": "src/main/java/eu/mulk/aendggner/anwendung/BefehlAnwender.java"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "a15aafae625aa3885e6f80257cb9ab0e1341fc1b",
      "new_mode": 33188,
      "new_path": "src/main/java/eu/mulk/aendggner/anwendung/SatzTeiler.java"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "8c19c78c4f24388f78525286fb71e01007785d7c",
      "new_mode": 33188,
      "new_path": "src/main/java/eu/mulk/aendggner/anwendung/StellenAufloeser.java"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "9ab00f574409b29d7c9dd890ec01e4788752c854",
      "new_mode": 33188,
      "new_path": "src/main/java/eu/mulk/aendggner/gesetz/Absatz.java"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "5db08605c74bf43ad374cf5a783cd2fb37a303af",
      "new_mode": 33188,
      "new_path": "src/main/java/eu/mulk/aendggner/gesetz/Gesetz.java"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "21c9c4a63f8fe4d0c7601c4fa6d0bbc4646a64a2",
      "new_mode": 33188,
      "new_path": "src/main/java/eu/mulk/aendggner/gesetz/Gliederung.java"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "10c3fa656cc8f32f1a925733481bf192f196bd00",
      "new_mode": 33188,
      "new_path": "src/main/java/eu/mulk/aendggner/gesetz/Norm.java"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "eef8536c7b282b92be3b7daeb692733838ba9b3f",
      "new_mode": 33188,
      "new_path": "src/main/java/eu/mulk/aendggner/gesetz/gii/ContentFlattener.java"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "ca7bdf6b5b7bc560e4ef7db693ec0fbf338a78b4",
      "new_mode": 33188,
      "new_path": "src/main/java/eu/mulk/aendggner/gesetz/gii/GiiXmlLoader.java"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "2f5f735fccb646ed07151b7e7eaeedbd322998a9",
      "new_mode": 33188,
      "new_path": "src/main/java/eu/mulk/aendggner/synopse/HtmlRenderer.java"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "26730a2ab448df2630e7add040d2f69ea8634cb9",
      "new_mode": 33188,
      "new_path": "src/main/java/eu/mulk/aendggner/synopse/Synopse.java"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "0f88538e6f117bd628c214f8e45484c743a78646",
      "new_mode": 33188,
      "new_path": "src/main/java/eu/mulk/aendggner/synopse/SynopseBuilder.java"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "00e69238e9625e5ce72060c47aadde00dc0b765a",
      "new_mode": 33188,
      "new_path": "src/main/java/eu/mulk/aendggner/synopse/WortDiff.java"
    }
  ]
}
