From 81777013dfa582053489efea874e84379f1f0805 Mon Sep 17 00:00:00 2001
From: Matthias Andreas Benkard <code@mail.matthias.benkard.de>
Date: Sun, 26 Jul 2026 08:53:10 +0200
Subject: Support unnumbered named Anlagen; strip control characters
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Investigating "Anlagen as amendment target" corrected the diagnosis from
yesterday: Anlagen are supported. In gii-XML they are norms of their own
("Anlage 8", "Anhang"), Stelle.anlagenEnbez() resolves them, and the GEG
sample applies annex-targeted commands — only two of its fifty manual
entries touch annexes, both for content reasons.

What actually failed in Berlin was narrower, and is fixed:

  * A law with a single annex names it after the provision it belongs to
    ("Die Anlage zu § 2 Absatz 4 Satz 1"). StellenParser demanded a
    number after "Anlage" and rejected the phrase, so the article's frame
    command went unrecognised and its items lost their context. The
    annex now carries the designation "Anlage", like "Anhang". The naming
    suffix is skipped deliberately: read along, the "§ 2" inside it would
    become the target and the wrong norm would be amended.

  * C0 control characters are now stripped. Berlin's enumeration indent
    carries a U+0007 that sits invisibly in front of the command and made
    its start-of-line anchor miss.

  * Command verbs torn apart by a stray space in the official typesetting
    ("ein gefügt" for "eingefügt") are rejoined, restricted to sequences
    that are not valid German word order.

Three of Article 1's four commands are now recognised. The fourth places
the new unit by a word anchor ("Vor den Wörtern … wird folgender Absatz 5
eingefügt"), which StrukturEinfuegung cannot express; that and the
inability of the plain-text stem format to carry an Anlage at all are
recorded in Landesrecht-Beispiele.adoc.

231 tests green; all pinned figures unchanged.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Change-Id: Ic5804bf343dd5d8ce435c07b8f882ca0372890d2
---
 src/main/resources/sampledata/Landesrecht-Beispiele.adoc | 16 +++++++++++-----
 1 file changed, 11 insertions(+), 5 deletions(-)

(limited to 'src/main/resources/sampledata/Landesrecht-Beispiele.adoc')

diff --git a/src/main/resources/sampledata/Landesrecht-Beispiele.adoc b/src/main/resources/sampledata/Landesrecht-Beispiele.adoc
index 482ceac..00cb08b 100644
--- a/src/main/resources/sampledata/Landesrecht-Beispiele.adoc
+++ b/src/main/resources/sampledata/Landesrecht-Beispiele.adoc
@@ -106,7 +106,8 @@ folgt geändert").
   abgeglichen. Die übrigen Artikel (WDR-Gesetz, Landesmediengesetz, 17. RÄStV-AusfG) bleiben offen.
 * *Berlin* ist bis zur Befehlserkennung umgesetzt (`EndToEndTest.asogLafAendGBerlin`): Artikel 2
   (LAF-Errichtungsgesetz) wird vollständig erkannt, beide Punkte erben ihr Ziel aus der
-  Änderungsformel. Artikel 1 bleibt offen — er ändert eine Anlage (siehe „Noch offen“).
+  Änderungsformel. Von Artikel 1 werden drei der vier Befehle erkannt, einschließlich der
+  Änderungen an der unnummerierten Anlage; der vierte nutzt einen Wortanker (siehe „Noch offen“).
 * Baden-Württemberg (GBl 2026 Nr. 26): großes Anlage-lastiges Änderungsgesetz (§§ 4–57a + Anlagen
   1/3b/4b); Stammfassung/Akzeptanztest noch offen.
 
@@ -121,10 +122,15 @@ folgt geändert").
   vom 05.02.2025 eingefügt). Auch die archivierten Einzelnorm-Seiten (113 Stück) sind bereits
   SPA-Hüllen ohne Inhalt. Ein voller Akzeptanztest bleibt daher offen, bis die konsolidierte
   Fassung aus einer anderen Quelle vorliegt.
-* *Anlagen als Änderungsziel*: Berlin Artikel 1 („Die Anlage zu § 2 Absatz 4 Satz 1 wird wie folgt
-  geändert“ mit Unterpunkten auf „Nummer 23 Absatz 4a“) und Baden-Württemberg (Anlagen 1/3b/4b)
-  scheitern an derselben Stelle: ÄndGgner modelliert Anlagen nicht als eigene Einheiten mit
-  interner Nummern-Gliederung. Das ist die größte verbleibende Modelllücke im Landesrecht.
+* *Anlagen im kanonischen Klartext*: Anlagen sind als Änderungsziel unterstützt — im gii-XML sind
+  sie eigene Normen („Anlage 8“, „Anhang“), und `Stelle.anlagenEnbez()` löst sie auf; im GEG werden
+  anlagenbezogene Befehle angewandt. Der `LandesRechtTextParser` kennt jedoch nur „§“- und
+  „Art.“-Normköpfe: Eine handgepflegte Stammfassung kann *keine* Anlage tragen. Das ist die
+  konkrete Lücke für Berlin (Artikel 1) und Baden-Württemberg (Anlagen 1/3b/4b) — sie wird erst
+  behebbar, wenn für eines der beiden eine Stammfassung vorliegt.
+* *Struktureinfügung mit Wortanker*: „Vor den Wörtern „Aus dem Bereich Verkehr:“ wird folgender
+  Absatz 5 eingefügt“ (Berlin Artikel 1 Nr. 2 b) bb)) — die Position der neuen Einheit bestimmt
+  ein Wortanker statt einer Stellenangabe. `StrukturEinfuegung` trägt bislang nur eine Stelle.
 * *Unbalancierte Anführungszeichen innerhalb eines Artikels*: Die Strukturgrenze des
   Zitatextraktors greift nur an Artikel-Überschriften. In Berlin Artikel 1 fehlt bei Nummer 2 b) bb)
   das schließende Anführungszeichen; das Zitat verschlingt daher die folgenden Punkte cc) und c).
-- 
cgit v1.2.1

