aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthias Andreas Benkard <code@mail.matthias.benkard.de>2026-08-27 07:10:40 +0200
committerMatthias Andreas Benkard <code@mail.matthias.benkard.de>2026-08-27 07:10:40 +0200
commit036fb101bbc92e88e2b0e99d04ed827b96afd927 (patch)
treeaa1cb8ca4515d61c587136e5e2be03e25b0a674e
parent17c87d1cddd6968161d28aa0365a1a1964dc6409 (diff)
Bremen öffnet seine Fassungen, und zwei Zitate bleiben offen
Bremen tritt als fünfzehntes Land hinzu. Sein Transparenzportal ist nach BRAVORS und recht.nrw.de das dritte, das einer Skriptabfrage gewöhnliches HTML liefert, und das erste außerhalb Brandenburgs, das jede frühere Gesamtausgabe einzeln adressierbar führt; Vor- und Nachfassung stammen daher aus derselben Quelle. Das Heft (Brem.GBl. 2026 Nr. 87) versäumt es zweimal, ein Zitat zu schließen. Daran zeigte sich, dass die Grenze am Aufzählungspunkt zu eng gefasst war: Sie verlangte, dass der Rest des Abschnitts ausbalanciert zurückbleibe, und konnte deshalb nur den letzten Mangel heilen. Nunmehr prüft sie, dass kein schließendes Anführungszeichen ohne öffnendes zurückbleibt — ein Abschnitt darf mehrere offene Zitate tragen, und jedes wird an seiner eigenen Grenze geschlossen. Das Heft gab vorher 22 Befehle her, nun 41. Die bremische Befehlssprache brachte sechs Nebenformen (Name der Verordnung, bloße Aufzählungsmarke als Stelle, Marke mit Schlusspunkt, „geändert“ statt „ersetzt“, „um Satz 2 ergänzt“, benanntes Satzzeichen) und fünf Anwendungsfunde: Eine unvollendet endende Neufassung lässt die Untergliederung stehen; das Zitat des ersten Satzes trägt die Absatzbezeichnung mit; ein Umbruch mitten im Satz ist Satzspiegel; ein Platzhalter hält nur im eigenen Block Platz; und eine angefügte Einheit, die ihre Nummer nennt, tritt an den genannten Platz. Dabei kam ein stiller Mangel ans Licht: „hinter dem Wort“ war in den Mustern zugelassen, wurde aber nirgends geprüft — die Wörter traten vor den Anker. Geprüft: mvnw verify (428 Testfälle) und reuse lint (204/204) gehen durch; der neue Akzeptanzfall pinnt 41 gelesene, 37 angewandte Befehle und den Gleichlauf von 26 der 29 Normen mit der amtlichen Nachfassung. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Change-Id: If83a1f3204cd4599168888f2701db71d560b7bc7
-rw-r--r--FASSUNGEN.txt115
-rw-r--r--REUSE.toml8
-rw-r--r--src/main/java/eu/mulk/aendggner/aenderung/parse/BefehlErkenner.java122
-rw-r--r--src/main/java/eu/mulk/aendggner/aenderung/parse/StellenParser.java65
-rw-r--r--src/main/java/eu/mulk/aendggner/aenderung/parse/TextBereiniger.java10
-rw-r--r--src/main/java/eu/mulk/aendggner/aenderung/parse/ZitatExtraktor.java34
-rw-r--r--src/main/java/eu/mulk/aendggner/anwendung/BefehlAnwender.java174
-rw-r--r--src/main/java/eu/mulk/aendggner/anwendung/StellenAufloeser.java13
-rw-r--r--src/test/java/eu/mulk/aendggner/EndToEndTest.java73
-rw-r--r--src/test/resources/sampledata/Bremen/AssBerFSchulV-BR-alt.txt179
-rw-r--r--src/test/resources/sampledata/Bremen/AssBerFSchulV-BR-neu.txt178
-rw-r--r--src/test/resources/sampledata/Bremen/BremGBl-2026-87_BerufsfachschulVO-AendVO.pdfbin0 -> 238036 bytes
-rw-r--r--src/test/resources/sampledata/Bremen/SOURCES100
-rw-r--r--src/test/resources/sampledata/Landesrecht-Beispiele.adoc46
14 files changed, 1084 insertions, 33 deletions
diff --git a/FASSUNGEN.txt b/FASSUNGEN.txt
index cfe31bc..20c29cb 100644
--- a/FASSUNGEN.txt
+++ b/FASSUNGEN.txt
@@ -21,6 +21,121 @@ Vorbemerkung zur Führung dieses Verzeichnisses
════════════════════════════════════════════════════════════════════════════════
+ Fassung vom 27. August 2026 (erste Fassung des Tages),
+ zuletzt geändert durch die am 27. August 2026 vorgenommenen Änderungen
+════════════════════════════════════════════════════════════════════════════════
+
+Bremen tritt als fünfzehntes Land hinzu. Sein Portal ist nach BRAVORS und
+recht.nrw.de das dritte, das einer Skriptabfrage gewöhnliches HTML liefert, und
+das erste außerhalb Brandenburgs, das jede frühere Gesamtausgabe einzeln
+adressierbar führt; Vor- und Nachfassung stammen daher aus derselben Quelle. Das
+Heft selbst ist einfach gesetzt, seine Befehlssprache dagegen eigen: Sie fasst
+den Namen der Verordnung neu, bezeichnet Stellen durch die bloße
+Aufzählungsmarke, ändert „durch die Worte“ statt zu ersetzen, ergänzt „um Satz 2“
+statt anzufügen und benennt ihr Satzzeichen, statt es zu zeigen. Zweimal versäumt
+sie es, ein Zitat zu schließen.
+
+
+Artikel 1
+Grenze eines nicht geschlossenen Zitats
+
+(1) Die Grenze am Aufzählungspunkt (ZitatExtraktor) verlangte bisher, dass der
+ Rest des Abschnitts nach dem Schluss ausbalanciert zurückbleibe. Diese
+ Bedingung ist zu eng: Ein Abschnitt kann mehrere nicht geschlossene Zitate
+ tragen, und jedes ist an seiner eigenen Grenze zu schließen. An ihre Stelle
+ tritt die Probe, dass im Rest kein schließendes Anführungszeichen ohne
+ öffnendes steht — wer mitten in einem ordentlich geschlossenen Zitat schnitte,
+ ließe dessen Schlusszeichen ohne Gegenstück zurück.
+
+(2) Im bremischen Heft öffnen die Nummern 8 Buchstabe a und 13 je ein Zitat, das
+ sie nicht schließen. Vor dieser Änderung verschlang das erste die Nummern 9
+ bis 13; das Heft gab 22 Befehle her, nunmehr gibt es 41.
+
+
+Artikel 2
+Aufbereitung und Befehlserkennung
+
+(1) Der Textbereiniger (TextBereiniger) schneidet den Kolumnentitel des bremischen
+ Gesetzblattes heraus. Er steht im Inhaltsstrom und klebt am Seitenumbruch
+ hinter dem letzten Satz der Vorseite.
+
+(2) Der Stellenparser (StellenParser) nimmt drei Bezeichnungsweisen an: die bloße
+ Aufzählungsmarke als ganze Stellenangabe („In e) …“, „f) wird gestrichen“) —
+ jedoch nur, wenn sie die ganze Angabe ausmacht —, den Aufzählungspunkt am Ende
+ einer Nummernangabe („Nummer 1. wird wie folgt gefasst“) und den der Stellung
+ nach bezeichneten letzten Satz („Im letzten Satz …“), dessen Zählung erst am
+ Text feststeht.
+
+(3) Der Name des Werkes („Der Name der Verordnung wird wie folgt gefasst“) gilt
+ als dessen Überschrift; der Anwender setzt daraufhin den Langtitel.
+
+(4) Der Befehlserkenner (BefehlErkenner) nimmt vier Nebenformen an: „geändert“
+ als Verb der Wortersetzung neben „ersetzt“; die Streichung mit Positionsanker
+ („In Satz 2 werden nach dem Wort „…“ die Worte „…“ gestrichen“); die Anfügung
+ in der Wortwahl „am Ende um Satz 2 ergänzt“; und die Aufhebung eines benannten
+ Satzzeichens samt Anfügung („das Satzzeichen „Punkt“ wird aufgehoben und
+ folgendes angefügt: „…““), die der Sache nach eine Ersetzung des
+ Schlusszeichens ist.
+
+
+Artikel 3
+Berichtigung der Einfügungsrichtung
+
+Das Richtungswort „hinter“ war in den Mustern der Wörter-Einfügung zwar
+zugelassen, wurde bei der Bildung des Ankers aber nirgends geprüft; die
+Einfügung fiel daher stets in den Vor-Zweig, und die Wörter traten vor den Anker
+statt dahinter. Betroffen waren sämtliche Einfügungen mit Wortanker. Die Prüfung
+erfolgt fortan an einer Stelle (nachAnker).
+
+
+Artikel 4
+Anwendung: was eine Neufassung stehen lässt
+
+(1) Eine Neufassung, die unvollendet endet — auf Doppelpunkt oder Komma —, meint
+ den Vordersatz allein und lässt die Untergliederung stehen, die ihm folgt.
+ Wer die Glieder mitändern will, führt sie im Zitat mit auf. Ohne diese Regel
+ verlöre § 3 Absatz 2 der bremischen Verordnung seine zwölf Glieder, und die
+ vier folgenden Befehle fänden ihr Ziel nicht mehr.
+
+(2) Das Zitat des ersten Satzes trägt die Absatzbezeichnung mit. Sie gehört dem
+ Absatz und nicht dem Satz; bliebe sie stehen, so führte der Absatz seine
+ Nummer zweimal.
+
+(3) Ein Umbruch mitten im Satz ist Satzspiegel und kein Textbestand. Endet die
+ vorige Zeile auf ein Binde- oder Verhältniswort und beginnt die folgende klein
+ oder mit einer Ziffer, so werden beide zusammengezogen. Die Kurzüberschrift
+ eines Aufzählungsgliedes und ihre Begriffsbestimmung (Anhang zu § 3 Abs. 3
+ UWG) bleiben davon unberührt — jene endet nicht auf ein solches Wort.
+
+(4) Ein Platzhalter („(weggefallen)“) hält nur Platz innerhalb desselben Blockes.
+ Die Aufzählung endet dort, wo eine Zeile flacher einrückt als die aufgehobene
+ Einheit; die Buchstaben einer anderen Nummer gehen sie nichts an.
+
+(5) Eine angefügte Einheit, die ihre Nummer nennt, tritt an den genannten Platz
+ und nicht ans Ende, sofern der Zieltext schon so weit zählt („Absatz 1 wird am
+ Ende um Satz 2 ergänzt“ macht den neuen Satz zum zweiten). Reicht die Zählung
+ nicht so weit, so fallen beide Lesarten ohnehin zusammen.
+
+
+Artikel 5
+Beispieldaten
+
+Unter „sampledata/Bremen“ treten das Heft Brem.GBl. 2026 Nr. 87, die Vorfassung
+und die amtliche Nachfassung der Berufsfachschulverordnung nebst Herkunftsnachweis
+hinzu; der Akzeptanzfall (EndToEndTest.berufsfachschulVOBremen) pinnt 41 gelesene
+und 37 angewandte Befehle sowie den Gleichlauf von 26 der 29 Normen mit der
+amtlichen Nachfassung. Die drei Reste liegen sämtlich an der Vorlage und sind in
+„Bremen/SOURCES“ benannt.
+
+
+Schlussbestimmung
+
+Die vorstehenden Änderungen sind durch die vollständige Prüfung (mvnw verify,
+vierhundertachtundzwanzig Testfälle) und durch die Lizenzprüfung (reuse lint,
+zweihundertvier von zweihundertvier Dateien) bestätigt worden.
+
+
+════════════════════════════════════════════════════════════════════════════════
Fassung vom 26. August 2026 (vierte Fassung des Tages),
zuletzt geändert durch die am 26. August 2026 vorgenommenen Änderungen
════════════════════════════════════════════════════════════════════════════════
diff --git a/REUSE.toml b/REUSE.toml
index 6005618..568a7c9 100644
--- a/REUSE.toml
+++ b/REUSE.toml
@@ -195,6 +195,11 @@ SPDX-FileCopyrightText = "Freie und Hansestadt Hamburg"
SPDX-License-Identifier = "LicenseRef-AmtlichesWerk"
[[annotations]]
+path = ["src/test/resources/sampledata/Bremen/BremGBl-2026-87_BerufsfachschulVO-AendVO.pdf"]
+SPDX-FileCopyrightText = "Freie Hansestadt Bremen"
+SPDX-License-Identifier = "LicenseRef-AmtlichesWerk"
+
+[[annotations]]
path = ["src/test/resources/sampledata/RheinlandPfalz/GVBl-2026-21_UKAPOGS-E3-AendVO.pdf"]
SPDX-FileCopyrightText = "Land Rheinland-Pfalz"
SPDX-License-Identifier = "LicenseRef-AmtlichesWerk"
@@ -215,6 +220,8 @@ path = [
"src/test/resources/sampledata/Berlin/ASOG-Bln-alt.txt",
"src/test/resources/sampledata/Brandenburg/FraktG-alt.txt",
"src/test/resources/sampledata/Brandenburg/FraktG-neu.txt",
+ "src/test/resources/sampledata/Bremen/AssBerFSchulV-BR-alt.txt",
+ "src/test/resources/sampledata/Bremen/AssBerFSchulV-BR-neu.txt",
"src/test/resources/sampledata/Hamburg/GAusschV-HH-alt.txt",
"src/test/resources/sampledata/Hamburg/GAusschV-HH-neu.txt",
"src/test/resources/sampledata/RheinlandPfalz/UKAPOGS-E3-neu.txt",
@@ -246,6 +253,7 @@ path = [
"src/test/resources/sampledata/GEG/SOURCES",
"src/test/resources/sampledata/Berlin/SOURCES",
"src/test/resources/sampledata/Brandenburg/SOURCES",
+ "src/test/resources/sampledata/Bremen/SOURCES",
"src/test/resources/sampledata/Hamburg/SOURCES",
"src/test/resources/sampledata/RheinlandPfalz/SOURCES",
"src/test/resources/sampledata/Hessen/SOURCES",
diff --git a/src/main/java/eu/mulk/aendggner/aenderung/parse/BefehlErkenner.java b/src/main/java/eu/mulk/aendggner/aenderung/parse/BefehlErkenner.java
index c60bbaf..35afabf 100644
--- a/src/main/java/eu/mulk/aendggner/aenderung/parse/BefehlErkenner.java
+++ b/src/main/java/eu/mulk/aendggner/aenderung/parse/BefehlErkenner.java
@@ -50,6 +50,12 @@ final class BefehlErkenner {
"(?:die (?:Wörter|Worte)|das Wort|die Angabe|die Zahl|die Verweisung|die Textstelle)";
private static final String Z = "«(\\d+)»";
+ // Verb der Wortersetzung. Das Handbuch der Rechtsförmlichkeit kennt nur „ersetzt“; das bremische
+ // Gesetzblatt schreibt daneben „geändert“ („werden die Worte «1» durch die Worte «2» geändert“,
+ // Brem.GBl. 2026 Nr. 87 Nr. 5 a). Gemeint ist dasselbe. Die Rahmenform „wird wie folgt geändert“
+ // gerät dadurch nicht in Gefahr: Sie führt weder Zieltext noch „durch“.
+ private static final String ERSETZUNGS_VERB = "(?:ersetzt|geändert)";
+
// Der Doppelpunkt fehlt gelegentlich (Seitenumbruch-Artefakt); für einen Punkt mit Unterpunkten
// ist die Rahmenform trotzdem eindeutig.
private static final Pattern KONTEXT =
@@ -133,7 +139,9 @@ final class BefehlErkenner {
+ WOERTER
+ " )?"
+ Z
- + " ersetzt\\.$");
+ + " "
+ + ERSETZUNGS_VERB
+ + "\\.$");
// Wie ERSETZUNG, nur ohne Fundstelle — die liefert der Kontextrahmen. Das Objekt nach „durch“
// darf auch hier verkürzt sein („Die Angabe „X“ wird durch „Y“ ersetzt“, hessisches GVBl).
@@ -145,7 +153,9 @@ final class BefehlErkenner {
+ WOERTER
+ " )?"
+ Z
- + " ersetzt\\.$");
+ + " "
+ + ERSETZUNGS_VERB
+ + "\\.$");
// „In Nummer 2 werden nach den Wörtern «1» die Wörter «2» durch die Wörter «3» ersetzt.“ —
// Ersetzung mit Positionsanker; der Anker präzisiert nur die Fundstelle, die Eindeutigkeits-
@@ -179,6 +189,22 @@ final class BefehlErkenner {
// „In Absatz 1 Satz 2 wird der Punkt am Ende durch folgende Wörter / den folgenden Wortlaut
// ersetzt: „…““ — der Ersatz steht als Zitatblock hinter dem Doppelpunkt.
+ // „In Absatz 2 Satz 1 wird am Textende nach dem Wort «1» das Satzzeichen «2» aufgehoben und
+ // folgendes angefügt: «3».“ (Brem.GBl. 2026 Nr. 87 Nr. 5 c) — der Sache nach die Ersetzung des
+ // Schlusszeichens durch den angefügten Wortlaut. Zweierlei ist neu: Das Satzzeichen wird
+ // *benannt* („Punkt“) statt gezeigt („.“), und es steht dabei selbst in Anführungszeichen, ist
+ // für den Zitat-Extraktor also ein Zitat wie jedes andere.
+ private static final Pattern SATZZEICHEN_AUFHEBUNG_MIT_ANFUEGUNG =
+ Pattern.compile(
+ "^(?:In )?(.+?) (?:wird|werden)(?: am (?:Text)?ende)?"
+ + "(?: nach (?:dem Wort|den (?:Wörtern|Worten)|der Angabe) "
+ + Z
+ + ")? das Satzzeichen "
+ + Z
+ + " aufgehoben und folgende[nrs]? (?:Wortlaut |Wörter )?angefügt: "
+ + Z
+ + "\\.?$");
+
private static final Pattern PUNKT_DURCH_WORTLAUT =
Pattern.compile(
"^(?:In )?(.+?) (?:wird|werden) (der Punkt|das Komma|das Semikolon|der Strichpunkt)"
@@ -306,6 +332,16 @@ final class BefehlErkenner {
+ Z
+ "\\.?$");
+ // „Absatz 1 wird am Ende um Satz 2 ergänzt: „…““ (Brem.GBl. 2026 Nr. 87 Nr. 11 a) — dieselbe
+ // Anfügung in anderer Wortwahl: „um … ergänzt“ statt „… angefügt“, wobei die angefügte Einheit
+ // ihre Bezeichnung gleich mitführt.
+ private static final Pattern STRUKTUR_ANFUEGUNG_ERGAENZUNG =
+ Pattern.compile(
+ "^(?:Dem |Der |In )?(.+?) (?:wird|werden)(?: am Ende)? um (.+?) ergänzt ?: "
+ + ENUM
+ + Z
+ + "\\.?$");
+
private static final Pattern STRUKTUR_ANFUEGUNG =
Pattern.compile(
"^(?:Es (?:wird|werden) )?(?:Der |Die |Das )?[Ff]olgende[nrs]? (.+?) (?:(?:wird|werden) )?angefügt ?: "
@@ -399,6 +435,21 @@ final class BefehlErkenner {
Pattern.compile(
"^(?:In )?(.+?) (?:wird|werden) (?:jeweils )?" + WOERTER + " " + Z + " gestrichen\\.$");
+ // „In Satz 2 werden nach dem Wort «1» die Worte «2» gestrichen.“ — Streichung mit Positionsanker.
+ // Wie bei ERSETZUNG_MIT_ANKER präzisiert der Anker allein die Fundstelle; die Eindeutigkeits-
+ // prüfung des Anwenders schützt vor Fehlgriffen.
+ private static final Pattern STREICHUNG_MIT_ANKER =
+ Pattern.compile(
+ "^(?:In )?(.+?) (?:wird|werden) (?:jeweils )?(?:nach|hinter|vor) "
+ + "(?:dem Wort|den (?:Wörtern|Worten)|der Angabe|der Zahl|der Verweisung"
+ + "|der Textstelle) "
+ + Z
+ + " "
+ + WOERTER
+ + " "
+ + Z
+ + " gestrichen\\.$");
+
// „Die Angabe „X“ wird gestrichen.“ — ohne Stellenangabe (Kontext liefert das Ziel); tritt vor
// allem als rechte Klausel eines Verbunds auf („… ersetzt und die Angabe „X“ wird gestrichen“).
private static final Pattern STREICHUNG_OHNE_STELLE =
@@ -1125,6 +1176,16 @@ final class BefehlErkenner {
m.group(1), s -> new WoerterEinfuegung(kontext.plus(s), anker, woerter, provenienz));
}
+ if ((m = SATZZEICHEN_AUFHEBUNG_MIT_ANFUEGUNG.matcher(text)).matches()) {
+ var zeichen = benanntesSatzzeichen(wortZitat(zitate, m.group(3)));
+ if (zeichen == null) {
+ return Optional.empty();
+ }
+ var neu = wortZitat(zitate, m.group(4));
+ return ausStellen(
+ m.group(1), s -> new Ersetzung(kontext.plus(s), zeichen, neu, false, true, provenienz));
+ }
+
if ((m = PUNKT_DURCH_WORTLAUT.matcher(text)).matches()) {
var alt = satzzeichen(m.group(2));
var neu = wortZitat(zitate, m.group(3));
@@ -1177,7 +1238,7 @@ final class BefehlErkenner {
if ((m = WOERTER_EINFUEGUNG.matcher(text)).matches()) {
var ankerWoerter = wortZitat(zitate, m.group(3));
var anker =
- m.group(2).equals("nach")
+ nachAnker(m.group(2))
? new WortAnker.NachWoertern(ankerWoerter)
: new WortAnker.VorWoertern(ankerWoerter);
var woerter = wortZitat(zitate, m.group(4));
@@ -1197,7 +1258,7 @@ final class BefehlErkenner {
if ((m = KOMMA_EINFUEGUNG.matcher(text)).matches()) {
var ankerWoerter = wortZitat(zitate, m.group(3));
var anker =
- m.group(2).equals("nach")
+ nachAnker(m.group(2))
? new WortAnker.NachWoertern(ankerWoerter)
: new WortAnker.VorWoertern(ankerWoerter);
var woerter = satzzeichen(m.group(4));
@@ -1208,7 +1269,7 @@ final class BefehlErkenner {
if ((m = KOMMA_UND_WOERTER_EINFUEGUNG.matcher(text)).matches()) {
var ankerWoerter = wortZitat(zitate, m.group(3));
var anker =
- m.group(2).equals("nach")
+ nachAnker(m.group(2))
? new WortAnker.NachWoertern(ankerWoerter)
: new WortAnker.VorWoertern(ankerWoerter);
var woerter = ", " + wortZitat(zitate, m.group(4));
@@ -1426,6 +1487,26 @@ final class BefehlErkenner {
provenienz));
}
+ if ((m = STRUKTUR_ANFUEGUNG_ERGAENZUNG.matcher(text)).matches()) {
+ var stelle = StellenParser.parse(m.group(1));
+ var ebeneBez = ebeneUndBezeichnung(m.group(2));
+ if (stelle.isEmpty() || ebeneBez.isEmpty()) {
+ return Optional.empty();
+ }
+ var textInhalt =
+ mitEnumerator(
+ m.group(3),
+ labelFuer(ebeneBez.get().ebene(), ebeneBez.get().bezeichnung()),
+ zitat(zitate, m.group(4)));
+ return Optional.of(
+ new Anfuegung(
+ kontext.plus(stelle.get()),
+ ebeneBez.get().ebene(),
+ ebeneBez.get().bezeichnung(),
+ textInhalt,
+ provenienz));
+ }
+
if ((m = STRUKTUR_ANFUEGUNG.matcher(text)).matches()) {
var ebeneBez = ebeneUndBezeichnung(m.group(1));
if (ebeneBez.isEmpty()) {
@@ -1479,6 +1560,11 @@ final class BefehlErkenner {
return Optional.of(new Aufhebung(kontext.plus(stelle), provenienz));
}
+ if ((m = STREICHUNG_MIT_ANKER.matcher(text)).matches()) {
+ var woerter = wortZitat(zitate, m.group(3));
+ return ausStellen(m.group(1), s -> new Streichung(kontext.plus(s), woerter, provenienz));
+ }
+
if ((m = STREICHUNG.matcher(text)).matches()) {
var woerter = wortZitat(zitate, m.group(2));
return ausStellen(m.group(1), s -> new Streichung(kontext.plus(s), woerter, provenienz));
@@ -1626,7 +1712,7 @@ final class BefehlErkenner {
}
var ankerWoerter = wortZitat(zitate, pm.group(2));
var anker =
- pm.group(1).equals("nach")
+ nachAnker(pm.group(1))
? (WortAnker) new WortAnker.NachWoertern(ankerWoerter)
: new WortAnker.VorWoertern(ankerWoerter);
String woerter;
@@ -2386,6 +2472,30 @@ final class BefehlErkenner {
private static final Pattern AM_ENDE = Pattern.compile("\\bam Ende\\b");
+ /**
+ * Das benannte Satzzeichen („Punkt“, „Komma“) als Zeichen; {@code null}, wenn das Wort keines
+ * benennt. Anders als {@link #satzzeichen} steht der Name hier ohne Artikel und stammt aus einem
+ * Zitat des Änderungsgesetzes.
+ */
+ /**
+ * Ob das Richtungswort einer Einfügung hinter den Anker weist. „hinter“ ist die Nebenform von
+ * „nach“ (Hamburg, Bremen); wurde sie nur im Muster zugelassen, nicht aber hier geprüft, so fiel
+ * sie stillschweigend in den Vor-Zweig und die Wörter traten vor den Anker.
+ */
+ private static boolean nachAnker(String richtung) {
+ return richtung.equalsIgnoreCase("nach") || richtung.equalsIgnoreCase("hinter");
+ }
+
+ private static @Nullable String benanntesSatzzeichen(String wort) {
+ return switch (wort.strip()) {
+ case "Punkt" -> ".";
+ case "Komma" -> ",";
+ case "Semikolon", "Strichpunkt" -> ";";
+ case "Doppelpunkt" -> ":";
+ default -> null;
+ };
+ }
+
private static String satzzeichen(String phrase) {
// Am Satzanfang steht dieselbe Phrase großgeschrieben („Der Punkt am Ende wird …“).
return switch (Character.toLowerCase(phrase.charAt(0)) + phrase.substring(1)) {
diff --git a/src/main/java/eu/mulk/aendggner/aenderung/parse/StellenParser.java b/src/main/java/eu/mulk/aendggner/aenderung/parse/StellenParser.java
index 466adfe..f6e7360 100644
--- a/src/main/java/eu/mulk/aendggner/aenderung/parse/StellenParser.java
+++ b/src/main/java/eu/mulk/aendggner/aenderung/parse/StellenParser.java
@@ -42,6 +42,18 @@ public final class StellenParser {
"bisherige",
"bisherigen");
+ // „Der Name der Verordnung wird wie folgt gefasst“ (Brem.GBl. 2026 Nr. 87 Nr. 1): Gemeint ist
+ // die Überschrift des Werkes selbst. Der Anwender erkennt sie daran, dass die Stelle nichts
+ // weiter nennt, und setzt den Langtitel.
+ private static final Pattern NAME_DES_WERKES =
+ Pattern.compile(
+ "(?:Der Name|Die Bezeichnung|Die Überschrift) (?:des Gesetzes|der Verordnung)");
+
+ /** Bezeichnung des der Stellung nach benannten letzten Satzes („Im letzten Satz …“). */
+ public static final String LETZTER_SATZ = "letzter";
+
+ private static final Set<String> SATZ_WOERTER = Set.of("Satz", "Satzes", "Sätze", "Sätzen");
+
private static final Pattern PARAGRAPH = Pattern.compile("§");
// Gestufte Nummern („Nr. 1.29“) kommen in Listen vor, die ihre Glieder dezimal durchzählen —
// etwa der Artenkatalog des BayJG. Der Punkt muss von einer Ziffer gefolgt sein, damit „Nummer
@@ -49,6 +61,12 @@ public final class StellenParser {
private static final Pattern NUMMER_WERT = Pattern.compile("\\d+(?:\\.\\d+)*[a-z]?");
private static final Pattern BUCHSTABE_WERT = Pattern.compile("[a-z]{1,3}");
+ // Die bloße Aufzählungsmarke als ganze Stellenangabe: „In e) wird das Wort … ersetzt“, „f) wird
+ // gestrichen“ (Brem.GBl. 2026 Nr. 87 Nr. 4 c und d). Sie gilt nur, wenn sie die *ganze* Angabe
+ // ausmacht — innerhalb einer längeren Angabe bliebe offen, worauf sie sich bezöge.
+ private static final Pattern BLOSSE_BUCHSTABENMARKE = Pattern.compile("([a-z]{1,3})\\)");
+ private static final Pattern BLOSSE_NUMMERNMARKE = Pattern.compile("(\\d+[a-z]?)\\.");
+
private StellenParser() {}
// „in dem Satzteil vor Nummer 1“, „in der Angabe vor Nummer 1“, bayerisch auch „Satzteil nach
@@ -79,6 +97,13 @@ public final class StellenParser {
public static Optional<Stelle> parse(String phrase) {
phrase = CHAPEAU_QUALIFIER.matcher(phrase).replaceAll(" ").strip();
+ if (NAME_DES_WERKES.matcher(phrase).matches()) {
+ return Optional.of(new Stelle(List.of(new Stelle.Ueberschrift())));
+ }
+ var marke = blosseMarke(phrase.strip());
+ if (marke != null) {
+ return Optional.of(new Stelle(List.of(marke)));
+ }
var woerter = phrase.strip().split("\\s+");
var komponenten = new ArrayList<Stelle.Komponente>();
@@ -130,7 +155,7 @@ public final class StellenParser {
i++;
}
case "Nummer", "Nr.", "Nummern", "Nrn." -> {
- var wert = naechstesWort(woerter, i);
+ var wert = wertOhneAufzaehlungspunkt(woerter, i);
if (wert == null || !NUMMER_WERT.matcher(wert).matches()) {
return Optional.empty();
}
@@ -193,6 +218,17 @@ public final class StellenParser {
case "Anhang" -> komponenten.add(new Stelle.Gliederungseinheit("Anhang", ""));
case "Inhaltsübersicht" -> komponenten.add(new Stelle.Inhaltsuebersicht());
case "Überschrift" -> komponenten.add(new Stelle.Ueberschrift());
+ case "letzte", "letzten", "letzter", "letztem", "letztes" -> {
+ // „Im letzten Satz werden …“ (Brem.GBl. 2026 Nr. 87 Nr. 15 f): der Satz ist nicht
+ // gezählt, sondern der Stellung nach bezeichnet. Die Auflösung nimmt dafür den letzten
+ // Satz des Bereichs, den die übrigen Glieder übriglassen.
+ var art = naechstesWort(woerter, i);
+ if (art == null || !SATZ_WOERTER.contains(art)) {
+ return Optional.empty();
+ }
+ komponenten.add(new Stelle.SatzNr(LETZTER_SATZ));
+ i++;
+ }
default -> {
// Ordinal vor der Gliederungsart: „zum zweiten Abschnitt“, „des 2. Abschnitts“.
var ordinal = ordinalZahl(wort);
@@ -550,6 +586,33 @@ public final class StellenParser {
};
}
+ /**
+ * Die Stellenangabe, die nur aus einer Aufzählungsmarke besteht („e)“, „3.“), als Komponente;
+ * sonst {@code null}.
+ */
+ private static Stelle.@Nullable Komponente blosseMarke(String phrase) {
+ if (BLOSSE_BUCHSTABENMARKE.matcher(phrase).matches()) {
+ return new Stelle.BuchstabeNr(phrase.substring(0, phrase.length() - 1));
+ }
+ if (BLOSSE_NUMMERNMARKE.matcher(phrase).matches()) {
+ return new Stelle.NummerNr(phrase.substring(0, phrase.length() - 1));
+ }
+ return null;
+ }
+
+ /**
+ * Der Wert hinter „Nummer“/„Buchstabe“, wobei ein Aufzählungspunkt am Ende der ganzen Angabe
+ * abgestreift wird: Das bremische Gesetzblatt schreibt „Nummer 1. wird wie folgt gefasst“ und
+ * meint die Nummer 1, nicht eine gestufte Nummer.
+ */
+ private static @Nullable String wertOhneAufzaehlungspunkt(String[] woerter, int i) {
+ var wert = naechstesWort(woerter, i);
+ if (wert != null && wert.endsWith(".") && i + 2 >= woerter.length) {
+ wert = wert.substring(0, wert.length() - 1);
+ }
+ return wert;
+ }
+
private static String naechstesWort(String[] woerter, int i) {
return i + 1 < woerter.length ? entfernePunktuation(woerter[i + 1]) : null;
}
diff --git a/src/main/java/eu/mulk/aendggner/aenderung/parse/TextBereiniger.java b/src/main/java/eu/mulk/aendggner/aenderung/parse/TextBereiniger.java
index 073abfa..e5021a0 100644
--- a/src/main/java/eu/mulk/aendggner/aenderung/parse/TextBereiniger.java
+++ b/src/main/java/eu/mulk/aendggner/aenderung/parse/TextBereiniger.java
@@ -313,6 +313,15 @@ public final class TextBereiniger {
"[ \\t]*Gesetz- und Verordnungsblatt für das Land Rheinland-Pfalz[ \\t\\n]*-[ \\t\\n]*"
+ "Nr\\.\\s*\\d+ vom \\d{1,2}\\. \\p{L}+ \\d{4}[ \\t]*");
+ // Brem.GBl.: Der Kolumnentitel („Nr. 87 Gesetzblatt der Freien Hansestadt Bremen vom
+ // 20. August 2026 574“) steht meist auf eigener Zeile, klebt aber am Seitenumbruch mitunter
+ // hinter dem letzten Satz der Vorseite. Deshalb herausschneiden statt als Kolumnentitel zu
+ // entfernen — sonst zerfällt die Gliederung des Heftes an ihm.
+ private static final Pattern GBL_HB_KOPF =
+ Pattern.compile(
+ "[ \\t]*Nr\\. \\d+ Gesetzblatt der Freien Hansestadt Bremen"
+ + " vom \\d{1,2}\\. \\p{L}+ \\d{4}[ \\t]*\\d{0,4}[ \\t]*");
+
// Die Blattzählung des GBl. BW („Seite 2 von 7“) steht im Inhaltsstrom mitunter für sich allein,
// getrennt vom übrigen Seitenfuß, und zwar zwischen zwei Gliederungspunkten — sie hinge sonst dem
// vorangehenden Befehl an und machte ihn unkenntlich.
@@ -368,6 +377,7 @@ public final class TextBereiniger {
text = GVBL_HH_KOPF.matcher(text).replaceAll("\n");
text = GBL_BW_FUSS.matcher(text).replaceAll("\n");
text = GVBL_RP_FUSS.matcher(text).replaceAll("\n");
+ text = GBL_HB_KOPF.matcher(text).replaceAll("\n");
var zeilen = entferneKolumnentitel(zerlegeInZeilen(text));
var verbunden = verbindeUmbrueche(zeilen);
// Falsch-positive markerlose Zusammenzüge („durch“ + „die“ → „durchdie“) reparieren — die
diff --git a/src/main/java/eu/mulk/aendggner/aenderung/parse/ZitatExtraktor.java b/src/main/java/eu/mulk/aendggner/aenderung/parse/ZitatExtraktor.java
index a7fb050..cfac715 100644
--- a/src/main/java/eu/mulk/aendggner/aenderung/parse/ZitatExtraktor.java
+++ b/src/main/java/eu/mulk/aendggner/aenderung/parse/ZitatExtraktor.java
@@ -244,8 +244,13 @@ public final class ZitatExtraktor {
* <li>Der Marker der Folgezeile liegt auf derselben oder einer flacheren Ebene als der Marker,
* auf dessen Punkt das Zitat aufging („bb)“ → „cc)“, „c)“, „3.“).
* <li>Der Zeilenrest trägt Befehlssprache.
- * <li>Ein Schluss an dieser Stelle lässt den Rest des Abschnitts ausbalanciert zurück — die
- * Stelle behebt den Defekt also wirklich.
+ * <li>Im Rest des Abschnitts steht kein schließendes Anführungszeichen ohne öffnendes. Das ist
+ * die Probe darauf, dass hier wirklich ein Zitat endet und nicht mitten in einem gültigen
+ * Zitat abgeschnitten wird: Wer mitten in einem ordentlich geschlossenen Zitat schnitte,
+ * ließe dessen schließendes Zeichen ohne Gegenstück zurück. Ein Rest, der seinerseits ein
+ * Zitat offen lässt, steht dem nicht entgegen — ein Abschnitt darf mehrere solcher
+ * Satzfehler tragen (Brem.GBl. 2026 Nr. 87 trägt zwei), und jeder wird an seiner eigenen
+ * Grenze geschlossen.
* </ol>
*/
private static @Nullable String aufzaehlungsGrenze(
@@ -260,7 +265,7 @@ public final class ZitatExtraktor {
var marker = zeile.group(1);
if (markerEbene(marker) > markerEbene(markerVorZitat)
|| !BEFEHLSSPRACHE.matcher(zeile.group(2)).find()
- || offeneZitate(text, von, segment.bis()) != 0) {
+ || schlussOhneOeffnung(text, von, segment.bis())) {
return null;
}
return marker;
@@ -324,6 +329,29 @@ public final class ZitatExtraktor {
return tiefe;
}
+ /**
+ * Ob in {@code [von, bis)} ein schließendes Anführungszeichen ohne öffnendes steht — dieselbe
+ * Tiefenzählung wie {@link #offeneZitate}, nur auf die Gegenrichtung gesehen.
+ */
+ private static boolean schlussOhneOeffnung(String text, int von, int bis) {
+ int tiefe = 0;
+ for (int i = von; i < bis; i++) {
+ char c = text.charAt(i);
+ if (c == OEFFNEND) {
+ if (tiefe > 0 && istFortfuehrungszeichen(text, i)) {
+ continue;
+ }
+ tiefe++;
+ } else if (c == SCHLIESSEND) {
+ if (tiefe == 0) {
+ return true;
+ }
+ tiefe--;
+ }
+ }
+ return false;
+ }
+
/** Die bei {@code von} beginnende Zeile (ohne Zeilenumbruch). */
private static String zeileAb(String text, int von) {
int ende = text.indexOf('\n', von);
diff --git a/src/main/java/eu/mulk/aendggner/anwendung/BefehlAnwender.java b/src/main/java/eu/mulk/aendggner/anwendung/BefehlAnwender.java
index 92cd569..eb69423 100644
--- a/src/main/java/eu/mulk/aendggner/anwendung/BefehlAnwender.java
+++ b/src/main/java/eu/mulk/aendggner/anwendung/BefehlAnwender.java
@@ -1390,16 +1390,84 @@ public final class BefehlAnwender {
(text, bereich) ->
TextErgebnis.ok(
text.substring(0, bereich.von())
- + rueckeZitatEin(
- normalisiereZitatText(befehl.neuerText()),
- einrueckungVon(text, bereich.von()))
+ + behalteUntergliederung(
+ text.substring(bereich.von(), bereich.bis()),
+ rueckeZitatEin(
+ normalisiereZitatText(befehl.neuerText()),
+ einrueckungVon(text, bereich.von())))
+ text.substring(bereich.bis())));
}
// Neufassung eines Satzes / Halbsatzes: Bereich ersetzen. Eine Einrückung gibt es hier
// nicht — der Bereich beginnt mitten in der Zeile.
- return bearbeiteText(
- normen, befehl, text -> TextErgebnis.ok(normalisiereZitatText(befehl.neuerText())));
+ return bearbeiteText(normen, befehl, text -> TextErgebnis.ok(neuerSatzWortlaut(befehl, text)));
+ }
+
+ /** Ob die Stelle den ersten Satz ihrer Einheit bezeichnet. */
+ private static boolean istErsterSatz(Stelle stelle) {
+ return stelle.komponenten().stream()
+ .anyMatch(k -> k instanceof Stelle.SatzNr s && s.nummer().equals("1"));
+ }
+
+ /** Eine Aufzählungszeile innerhalb eines Absatzes („1. …“, „b) …“), auch eingerückt. */
+ private static final Pattern EINGERUECKTE_AUFZAEHLUNGSZEILE =
+ Pattern.compile("(?m)^[ \\t]*(?:\\d+[a-z]?\\.|[a-z]{1,3}\\))\\s");
+
+ /**
+ * Der Wortlaut, der an die Stelle eines neugefassten Satzes tritt. Das Zitat des ersten Satzes
+ * trägt die Absatzbezeichnung mit („Satz 1 wird wie folgt gefasst: „(2) Mit Genehmigung …““). Sie
+ * gehört dem Absatz, nicht dem Satz; bliebe sie stehen, so führte der Absatz seine Nummer
+ * zweimal.
+ */
+ private static String neuerSatzWortlaut(Neufassung befehl, String alterSatz) {
+ var neu = normalisiereZitatText(befehl.neuerText());
+ if (istErsterSatz(befehl.stelle())) {
+ neu = neu.replaceFirst("^\\(\\d+[a-z]?\\)\\s+", "");
+ }
+ // Ein Satz steht im kanonischen Klartext auf einer Zeile. Die Umbrüche, die das Zitat aus dem
+ // Gesetzblattsatz mitbringt, sind Satzspiegel und kein Textbestand — anders als bei der
+ // Neufassung eines ganzen Absatzes, deren Aufzählungszeilen ihre Zeilen behalten müssen.
+ if (untergliederungsBeginn(neu) < 0) {
+ neu = neu.replaceAll("\\s*\\n\\s*", " ");
+ }
+ return behalteUntergliederung(alterSatz, neu);
+ }
+
+ /**
+ * Eine Neufassung, die unvollendet endet — auf Doppelpunkt oder Komma —, meint den Vordersatz
+ * allein und lässt die Untergliederung stehen, die ihm folgt. Das ist die Lesart des amtlichen
+ * Satzes: Wer die Glieder mitändern will, führt sie im Zitat mit auf, und wer sie einzeln ändert,
+ * tut es in den folgenden Punkten.
+ *
+ * <p>Brem.GBl. 2026 Nr. 87 Nr. 4 führt beides vor: a) fasst den Vordersatz des § 3 Abs. 2 neu („…
+ * eingerichtet werden:“), b) und e) je eine Nummer („1. Bildungsgänge …,“), und c) und d) greifen
+ * danach auf die Buchstaben e und f zu, die unter der Nummer 1 hängen. Ohne diese Regel nähme
+ * jede der Neufassungen ihrer Einheit die Glieder, und die folgenden Befehle fänden ihr Ziel
+ * nicht mehr.
+ */
+ private static String behalteUntergliederung(String alterBlock, String neuerText) {
+ var kern = neuerText.stripTrailing();
+ if (!kern.endsWith(":") && !kern.endsWith(",")) {
+ return neuerText;
+ }
+ if (untergliederungsBeginn(neuerText) >= 0) {
+ return neuerText; // der neue Wortlaut bringt seine Glieder selbst mit
+ }
+ int beginn = untergliederungsBeginn(alterBlock);
+ return beginn < 0 ? neuerText : kern + alterBlock.substring(beginn);
+ }
+
+ /**
+ * Die Stelle des Zeilenumbruchs, mit dem die Untergliederung eines Blockes beginnt — also des
+ * ersten Umbruchs, dem eine Aufzählungszeile folgt; sonst {@code -1}.
+ */
+ private static int untergliederungsBeginn(String block) {
+ int umbruch = block.indexOf('\n');
+ if (umbruch < 0) {
+ return -1;
+ }
+ var aufzaehlung = EINGERUECKTE_AUFZAEHLUNGSZEILE.matcher(block.substring(umbruch));
+ return aufzaehlung.find() && aufzaehlung.start() == 1 ? umbruch : -1;
}
/** Ein Ziel (Absatz, Satz, Nummer, Buchstabe) wird durch einen Block ersetzt (ggf. 1 → N). */
@@ -1892,6 +1960,26 @@ public final class BefehlAnwender {
return gestutzt + "\n" + einrueckung + satz;
}
+ /**
+ * Setzt den angefügten Satz an seinen Platz. Nennt der Befehl die Nummer des neuen Satzes und
+ * zählt der Zieltext schon so viele Sätze, so ist der genannte Platz gemeint und nicht das Ende:
+ * „Absatz 1 wird am Ende um Satz 2 ergänzt“ macht den neuen Satz zum zweiten und schiebt den
+ * bisherigen zweiten nach hinten (Brem.GBl. 2026 Nr. 87 Nr. 11 a; so führt es auch die amtliche
+ * Nachfassung). Reicht die Zählung nicht so weit, so ist das Ende gemeint — dort fallen beide
+ * Lesarten ohnehin zusammen.
+ */
+ private static String setzeSatzEin(String text, String satz, @Nullable String bezeichnung) {
+ if (bezeichnung != null && bezeichnung.matches("\\d+")) {
+ int nummer = Integer.parseInt(bezeichnung);
+ var saetze = SatzTeiler.teile(text);
+ if (nummer >= 1 && nummer <= saetze.size()) {
+ int von = saetze.get(nummer - 1).von();
+ return (text.substring(0, von) + satz + " " + text.substring(von)).stripTrailing();
+ }
+ }
+ return haengeSatzAn(text, satz);
+ }
+
private static AngewandteAenderung wendeAnfuegungAn(List<Norm> normen, Anfuegung befehl) {
return switch (befehl.ebene()) {
case ABSATZ -> {
@@ -1907,7 +1995,10 @@ public final class BefehlAnwender {
}
case SATZ ->
bearbeiteText(
- normen, befehl, text -> TextErgebnis.ok(haengeSatzAn(text, befehl.text().strip())));
+ normen,
+ befehl,
+ text ->
+ TextErgebnis.ok(setzeSatzEin(text, befehl.text().strip(), befehl.bezeichnung())));
// Ein Halbsatz beginnt keinen neuen Satz, sondern setzt den bestehenden hinter dem
// Strichpunkt fort. Angehängt wird deshalb wie beim Satz — aber nur, wenn der Zieltext
// tatsächlich auf einen Strichpunkt endet: Sonst stünde der Halbsatz hinter einem Punkt und
@@ -2067,8 +2158,8 @@ public final class BefehlAnwender {
befehl,
(text, bereich) -> {
var label = labelVon(stelle);
- if (label != null && haeltPlatz(text, bereich.bis(), label)) {
- var einrueckung = einrueckungVon(text, bereich.von());
+ var einrueckung = einrueckungVon(text, bereich.von());
+ if (label != null && haeltPlatz(text, bereich.bis(), label, einrueckung.length())) {
return TextErgebnis.ok(
text.substring(0, bereich.von())
+ einrueckung
@@ -2855,17 +2946,40 @@ public final class BefehlAnwender {
* weitere Platzhalter folgen —, so ist kein Platz zu halten und sie entfällt ganz. So endet § 14
* der hessischen Verkehrsrechts-Zuständigkeitsverordnung nach Aufhebung der Nrn. 9 bis 11 mit der
* Nr. 6, wie es auch die amtliche Nachfassung tut.
+ *
+ * <p>Gesucht wird dabei nur innerhalb desselben Blockes: Die Aufzählung endet dort, wo eine Zeile
+ * flacher einrückt als die aufgehobene Einheit, denn dann beginnt die Untergliederung einer
+ * anderen Einheit. Ohne diese Schranke hielte der letzte Buchstabe der Nummer 1 einen Platz für
+ * die Buchstaben der Nummer 2 — die ihn nie brauchen (Brem.GBl. 2026 Nr. 87 Nr. 4 d).
*/
- private static boolean haeltPlatz(String text, int ab, String label) {
+ private static boolean haeltPlatz(String text, int ab, String label, int einrueckung) {
var art =
label.endsWith(")")
- ? Pattern.compile("^\\s*[a-zA-Z]{1,2}\\)\\s+(.*)$")
- : Pattern.compile("^\\s*\\d+[a-z]?\\.\\s+(.*)$");
- return text.substring(ab)
- .lines()
- .map(art::matcher)
- .filter(java.util.regex.Matcher::matches)
- .anyMatch(m -> !m.group(1).strip().equals("(weggefallen)"));
+ ? Pattern.compile("^(\\s*)[a-zA-Z]{1,2}\\)\\s+(.*)$")
+ : Pattern.compile("^(\\s*)\\d+[a-z]?\\.\\s+(.*)$");
+ for (var zeile : text.substring(ab).lines().toList()) {
+ if (zeile.isBlank()) {
+ continue;
+ }
+ if (fuehrendeBreite(zeile) < einrueckung) {
+ return false;
+ }
+ var m = art.matcher(zeile);
+ if (m.matches()
+ && m.group(1).length() == einrueckung
+ && !m.group(2).strip().equals("(weggefallen)")) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ private static int fuehrendeBreite(String zeile) {
+ int i = 0;
+ while (i < zeile.length() && (zeile.charAt(i) == ' ' || zeile.charAt(i) == '\t')) {
+ i++;
+ }
+ return i;
}
private static String einrueckungVon(String text, int position) {
@@ -3135,6 +3249,27 @@ public final class BefehlAnwender {
private static final Pattern MARKEN_ZWISCHENRAUM =
Pattern.compile("^(\\d+[a-z]?\\.|[a-z]{1,3}\\))[ \\t]+");
+ /**
+ * Ob die Zeile den Satz der zuletzt geschriebenen Zeile offenkundig fortsetzt. Maßstab ist allein
+ * das Ende der vorigen Zeile: Wer auf ein Binde- oder Verhältniswort endet, ist nicht zu Ende
+ * ({@link #UNVOLLENDET}). Die bloße Kleinschreibung der Folgezeile genügt nicht — im Anhang zu §
+ * 3 Abs. 3 UWG folgt der Kurzüberschrift eines Aufzählungsgliedes regelmäßig eine
+ * kleingeschriebene Begriffsbestimmung („2. unerlaubte Verwendung von Gütezeichen“ / „die
+ * Verwendung von Gütezeichen …“), und die sind zwei Zeilen und nicht eine.
+ */
+ private static boolean setztSatzFort(StringBuilder bisher, String zeile) {
+ if (zeile.isEmpty() || bisher.length() == 0) {
+ return false;
+ }
+ int zeilenAnfang = bisher.lastIndexOf("\n") + 1;
+ var vorige = bisher.substring(zeilenAnfang).stripTrailing();
+ if (!UNVOLLENDET.matcher(vorige).find()) {
+ return false;
+ }
+ int erstes = zeile.codePointAt(0);
+ return Character.isLowerCase(erstes) || Character.isDigit(erstes);
+ }
+
private static String normalisiereZitatText(String text) {
var zeilen = text.split("\n");
var sb = new StringBuilder();
@@ -3157,6 +3292,13 @@ public final class BefehlAnwender {
// Aufzählungspunkt: eigene Zeile mit Einzug.
sb.append("\n ").append(gestutzt);
fortsetzungsEinzug = " ";
+ } else if (setztSatzFort(sb, gestutzt)) {
+ // Ein Umbruch mitten im Satz ist Satzspiegel, kein Textbestand: Das Gesetzblatt bricht die
+ // Zeile, wo die Spalte endet, und der geometrische Befund kann sie als hart ausweisen
+ // (kurze Schlusszeile eines eingerückten Zitats). Zusammengezogen wird nur dort, wo die
+ // Fortsetzung unverkennbar ist — die vorige Zeile schließt keinen Satz, und diese beginnt
+ // klein oder mit einer Ziffer.
+ sb.append(' ').append(gestutzt);
} else {
sb.append('\n').append(fortsetzungsEinzug).append(gestutzt);
}
diff --git a/src/main/java/eu/mulk/aendggner/anwendung/StellenAufloeser.java b/src/main/java/eu/mulk/aendggner/anwendung/StellenAufloeser.java
index 22ce4c6..32d9c8b 100644
--- a/src/main/java/eu/mulk/aendggner/anwendung/StellenAufloeser.java
+++ b/src/main/java/eu/mulk/aendggner/anwendung/StellenAufloeser.java
@@ -3,6 +3,7 @@
package eu.mulk.aendggner.anwendung;
import eu.mulk.aendggner.aenderung.Stelle;
+import eu.mulk.aendggner.aenderung.parse.StellenParser;
import eu.mulk.aendggner.gesetz.Gesetz;
import eu.mulk.aendggner.gesetz.Norm;
import java.util.List;
@@ -220,8 +221,18 @@ final class StellenAufloeser {
*/
private static SatzTeiler.@Nullable SatzBereich satzBereichIn(
String text, SatzTeiler.SatzBereich rahmen, Stelle.SatzNr satz) {
- int nummer = Integer.parseInt(satz.nummer().replaceAll("[a-z]$", ""));
var ausschnitt = text.substring(rahmen.von(), rahmen.bis());
+ // Der Stellung nach benannter Satz („Im letzten Satz …“): Gezählt wird erst hier, weil die
+ // Zahl der Sätze erst am Text feststeht.
+ if (StellenParser.LETZTER_SATZ.equals(satz.nummer())) {
+ var saetze = SatzTeiler.teile(ausschnitt);
+ if (saetze.isEmpty()) {
+ return null;
+ }
+ var letzter = saetze.get(saetze.size() - 1);
+ return new SatzTeiler.SatzBereich(rahmen.von() + letzter.von(), rahmen.von() + letzter.bis());
+ }
+ int nummer = Integer.parseInt(satz.nummer().replaceAll("[a-z]$", ""));
var innen = satzBereich(ausschnitt, nummer, SatzTeiler.teile(ausschnitt));
return innen == null
? null
diff --git a/src/test/java/eu/mulk/aendggner/EndToEndTest.java b/src/test/java/eu/mulk/aendggner/EndToEndTest.java
index bb67978..6bb82eb 100644
--- a/src/test/java/eu/mulk/aendggner/EndToEndTest.java
+++ b/src/test/java/eu/mulk/aendggner/EndToEndTest.java
@@ -1778,6 +1778,79 @@ class EndToEndTest {
.containsExactly("§ 3", "§ 4", "§ 6", "§ 9");
}
+ /**
+ * Bremen: Die Änderung der Verordnung über die Berufsfachschule für technische und kaufmännische
+ * Assistentinnen und Assistenten (Brem.GBl. 2026 Nr. 87, S. 573).
+ *
+ * <p>Der Fall ist der erste, dessen Vor- <em>und</em> Nachfassung aus demselben offenen Portal
+ * stammen (siehe {@code Bremen/SOURCES}); er bringt sechs Idiome, die das übrige Landesrecht
+ * nicht führt: die Neufassung des <em>Namens</em> der Verordnung, die bloße Aufzählungsmarke als
+ * Stellenangabe („In e) …“, „f) wird gestrichen“), die Marke mit Schlusspunkt („Nummer 1. wird
+ * wie folgt gefasst“), „durch die Worte … <em>geändert</em>“ statt „ersetzt“, die Anfügung als
+ * „am Ende um Satz 2 ergänzt“ und das <em>benannte</em> Satzzeichen („das Satzzeichen „Punkt“
+ * wird aufgehoben und folgendes angefügt“).
+ *
+ * <p>Zwei Zitate des Heftes sind nicht geschlossen (Nummern 8 a und 13). Beide Satzfehler
+ * zusammen sind der Prüfstein der Aufzählungs-Zitatgrenze: Sie muss auch dann greifen, wenn der
+ * Rest des Abschnitts seinerseits noch ein Zitat offen lässt.
+ */
+ @Test
+ void berufsfachschulVOBremen() throws Exception {
+ var alt = SAMPLEDATA.resolve("Bremen/AssBerFSchulV-BR-alt.txt");
+ var pdf = SAMPLEDATA.resolve("Bremen/BremGBl-2026-87_BerufsfachschulVO-AendVO.pdf");
+ var neu = SAMPLEDATA.resolve("Bremen/AssBerFSchulV-BR-neu.txt");
+ assumeTrue(Files.exists(alt) && Files.exists(pdf), "Bremer Beispieldaten fehlen");
+
+ var gesetz = new eu.mulk.aendggner.gesetz.land.LandesRechtLoader().load(alt);
+ assertThat(gesetz.jurabk()).isEqualTo("AssBerFSchulV BR 2019");
+ assertThat(gesetz.normen()).hasSize(28);
+
+ var text = TextBereiniger.bereinige(new PatchTextExtraktor().extrahiere(pdf));
+ // Der Kolumnentitel steht im Inhaltsstrom und klebt am Seitenumbruch hinter dem letzten Satz
+ // der Vorseite; bliebe er stehen, zerfiele die Gliederung des Heftes an ihm.
+ assertThat(text).doesNotContain("Gesetzblatt der Freien Hansestadt Bremen vom 20. August 2026");
+
+ var parseErgebnis = new AenderungsgesetzParser().parse(text, gesetz, null);
+ assertThat(parseErgebnis.artikel()).containsExactly("1");
+ assertThat(parseErgebnis.befehle()).hasSize(41);
+
+ // Beide offenen Zitate werden am folgenden Aufzählungspunkt geschlossen — das erste vor
+ // „b)“, das zweite vor „14.“. Vor dieser Welle schloss nur das letzte, und die Nummern 9 bis
+ // 13 verschwanden im Zitat der Nummer 8 a).
+ assertThat(parseErgebnis.warnungen())
+ .anyMatch(w -> w.contains("vor dem Aufzählungspunkt „b)“"))
+ .anyMatch(w -> w.contains("vor dem Aufzählungspunkt „14.“"));
+
+ var anwendung = BefehlAnwender.anwenden(gesetz, parseErgebnis.befehle());
+ assertThat(anwendung.anzahlAngewandt()).isEqualTo(37);
+
+ // Die Neufassung eines Vordersatzes lässt die Aufzählung stehen, die ihm folgt — und der
+ // gestrichene letzte Buchstabe der Nummer 1 hält keinen Platz für die Buchstaben der Nummer 2.
+ var dritter = anwendung.neu().norm("§ 3").orElseThrow().absaetze().get(1).text();
+ assertThat(dritter)
+ .startsWith("Mit Genehmigung der Senatorin oder des Senators für Kinder und Bildung")
+ .contains("Künstliche Intelligenz und Wirtschaftsinformatik")
+ .doesNotContain("(weggefallen)");
+
+ // „hinter dem Wort“ setzt die Wörter dahinter, nicht davor.
+ assertThat(anwendung.neu().norm("§ 23").orElseThrow().absaetze().get(0).text())
+ .contains("Die Senatorin oder der Senator für Kinder und Bildung kann auf Antrag");
+
+ assumeTrue(Files.exists(neu), "Bremer Nachfassung fehlt");
+ var soll = new eu.mulk.aendggner.gesetz.land.LandesRechtLoader().load(neu);
+ var abgleich = Nachfassungsabgleich.vergleiche(soll, anwendung.neu());
+ // § 26 fehlt, weil die Nummer 18 des Heftes ihr Zitat gar nicht erst öffnet: Sie verbindet
+ // eine Umnummerierung mit einer Neufassung, deren Wortlaut ohne Anführungszeichen dasteht.
+ // Geraten wird nicht.
+ assertThat(abgleich.fehlende()).containsExactly("§ 26");
+ assertThat(abgleich.ueberzaehlige()).isEmpty();
+ // § 22: „Im letzten Satz“ nennt keinen Absatz, und die Norm hat deren drei — der Befehl bleibt
+ // zu Recht mehrdeutig. § 29: die Nummer 21 verteilt den neuen Wortlaut auf zwei Unterpunkte,
+ // die je nur aus einem Zitat bestehen.
+ assertThat(abgleich.abweichungen().stream().map(a -> a.enbez()).toList())
+ .containsExactly("§ 22", "§ 29");
+ }
+
private static Aenderungsbefehl befehlZu(
AenderungsgesetzParser.ParseErgebnis ergebnis, String gliederungsPfad) {
return ergebnis.befehle().stream()
diff --git a/src/test/resources/sampledata/Bremen/AssBerFSchulV-BR-alt.txt b/src/test/resources/sampledata/Bremen/AssBerFSchulV-BR-alt.txt
new file mode 100644
index 0000000..ab1ab34
--- /dev/null
+++ b/src/test/resources/sampledata/Bremen/AssBerFSchulV-BR-alt.txt
@@ -0,0 +1,179 @@
+Verordnung über die Berufsfachschule für Assistentinnen und Assistenten
+(AssBerFSchulV BR 2019)
+Vom 24. April 2019
+(Brem.GBl. 2019, S. 297)
+Teil 1 Ausbildung
+§ 1 Aufgaben und Ziele
+Die Ausbildung in den Bildungsgängen der Berufsfachschule für Assistenten soll die Schülerinnen und Schüler auf ihre spätere Berufstätigkeit in Laboratorien, Instituten, Werkseinrichtungen, Prüf- und Versuchsfeldern der Wirtschaft, Verwaltung und Wissenschaft vorbereiten. Zentrales Ziel der Berufsfachschule für Assistenten ist es, die Entwicklung beruflicher Handlungskompetenz zu fördern und die Schülerinnen und Schüler zum selbstständigen Planen, Durchführen und Beurteilen von Arbeitsaufgaben zu befähigen. Handlungskompetenz entfaltet sich in den Dimensionen von Fachkompetenz, Selbstkompetenz und Sozialkompetenz. Die Entwicklung beruflicher Flexibilität und Mobilität sowie die Fähigkeit und Bereitschaft zur Fort- und Weiterbildung sind ebenfalls Ziele des Bildungsgangs.
+§ 2 Unterrichtsgrundsätze
+Der berufsbezogene Unterricht in der Berufsfachschule für Assistenten folgt didaktisch dem Lernfeldkonzept. Der berufsübergreifende Lernbereich ist nach Fächern strukturiert. Die Lernfelder in den Bildungsgängen der Berufsfachschule für Assistenten finden ihre unterrichtliche Umsetzung in Lernsituationen, die sich sowohl bei der Auswahl der Inhalte als auch als methodisches Prinzip bei der Gestaltung des Unterrichts an beruflichen Handlungssituationen orientieren.
+§ 3 Dauer und Organisation der Ausbildung
+(1) Die Ausbildung dauert in der Regel zwei Jahre. Der Unterricht umfasst einen berufsübergreifenden und einen berufsbezogenen Lernbereich sowie ein Betriebspraktikum.
+(2) Mit Genehmigung der Senatorin für Kinder und Bildung können folgende Bildungsgänge mit Schwerpunkten eingerichtet werden:
+ 1. Bildungsgänge zur technischen Assistentin/zum technischen Assistenten,
+ a) Biologisch-technische Assistentin/Biologisch-technischer Assistent mit dem Schwerpunkt Biochemie
+ b) Chemisch-technische Assistentin/Chemisch-technischer Assistent
+ c) Gestaltungstechnische Assistentin/Gestaltungstechnischer Assistent mit dem Schwerpunkt Grafik
+ d) Informationstechnische Assistentin/Informationstechnischer Assistent mit dem Schwerpunkt Informations- und Netzwerksystemtechnik
+ e) Mathematisch-technische Assistentin/Mathematisch-technischer Assistent mit dem Schwerpunkt Wirtschaftswissenschaft und Wirtschaftsinformatik
+ f) Physikalisch-technische Assistentin/Physikalisch-technischer Assistent
+ 2. Bildungsgänge zur kaufmännischen Assistentin/zum kaufmännischen Assistenten
+ a) Kaufmännische Assistentin/Kaufmännischer Assistent mit dem Schwerpunkt Fremdsprachen
+ b) Kaufmännische Assistentin/Kaufmännischer Assistent mit dem Schwerpunkt Informationsverarbeitung
+§ 4 Unterrichtsfächer, Lernfelder und Stundentafeln
+(1) Die Unterrichtsfächer und Lernfelder, ihre Zuordnung zu den Lernbereichen und die Zahl der Unterrichtsstunden je Lernbereich ergeben sich aus der Rahmenstundentafel der Anlage in Verbindung mit der für den jeweiligen Bildungsgang gültigen Stundentafel.
+(2) Wird Englisch im berufsübergreifenden Lernbereich angeboten, können Schülerinnen und Schüler nicht deutscher Herkunftssprache, die anstelle der Note in der Fremdsprache Englisch im berechtigenden Zeugnis einer deutschen Schule die Note in der Herkunftssprache erhalten haben oder die nicht über einen an einer deutschen Schule erworbenen Abschluss nach § 6 Absatz 1 Nummer 1 verfügen, anstelle der Prüfung in der Fremdsprache Englisch die Feststellungsprüfung in ihrer Herkunftssprache wählen. Diese Prüfung findet am Anfang des Bildungsgangs statt. Bei nicht ausreichenden Leistungen kann die Prüfung einmal wiederholt werden. Die Wiederholung findet bis zum Ende des ersten Ausbildungsjahres statt. Ausgenommen sind die Schülerinnen und Schüler der Bildungsgänge, in denen Englisch im berufsbezogenen Lernbereich der Stundentafel ausgewiesen ist. Die Schülerinnen und Schüler, die sich für eine Feststellungsprüfung in ihrer Herkunftssprache entschieden haben, nehmen am Englisch-Anfängerunterricht teil. Die Note des Englisch-Anfängerunterrichts wird nicht in die Bewertung der Abschlussqualifikation einbezogen. Im Abschlusszeugnis oder im Abgangszeugnis wird der Unterricht mit dem Vermerk „Nicht Gegenstand der Prüfung” ausgewiesen. Auf Wunsch der Schülerin oder des Schülers wird eine Note erteilt. Im Abschlusszeugnis oder im Abgangszeugnis wird die Note der Sprachfeststellungsprüfung in der Herkunftssprache anstelle der Note in der Fremdsprache Englisch ausgewiesen und in die Bewertung der Abschlussqualifikation einbezogen.
+§ 5 Praktikum
+(1) Als Teil der schulischen Ausbildung wird ein Praktikum in geeigneten Betrieben oder Einrichtungen (Praktikumsstellen) oder in Form anderer Lernortekooperationen durchgeführt. In begründeten Ausnahmefällen und nach Genehmigung durch die Fachaufsicht, kann das Praktikum beim Fehlen geeigneter Praktikumsstellen in schuleigenen Einrichtungen stattfinden. Das Praktikum soll gleichzeitig für alle Schülerinnen und Schüler eines Klassenverbandes durchgeführt werden. Die Schülerinnen und Schüler unterliegen während der Dauer des Praktikums denselben gesetzlichen Bestimmungen über Unfall- und Haftpflichtversicherung, die für die Teilnahme an schulischen Veranstaltungen gelten.
+(2) Das Praktikum soll mindestens vier Wochen in Vollzeit dauern. Davon soll ein Teil in den Ferien abgeleistet werden. Das Praktikum kann unter Einhaltung des zeitlichen Umfangs statt in Blockform auch in anderen Organisationsformen durchgeführt werden. Über die Dauer des Praktikums, über die Möglichkeit einer Verlängerung und über die Organisationsform entscheidet die Schule.
+(3) Die Ziele und der Ablauf des Praktikums sowie die Aufgaben der Schülerin oder des Schülers werden zwischen Schule und Praktikumsstelle abgestimmt. Während des Praktikums wird die Schülerin oder der Schüler von einer Lehrerin oder einem Lehrer der Schule betreut.
+(4) Am Ende des Praktikums wird von der Praktikumsstelle eine schriftliche Beurteilung abgegeben. Sie soll mindestens Angaben über den Beurteilungszeitraum, die erworbenen Kompetenzen, die erbrachten Leistungen und die Fehlzeiten enthalten. Die Bewertung wird durch die Schule auf der Grundlage der Beurteilung der Praktikumsstelle sowie der betreuenden Lehrerin oder des betreuenden Lehrers vorgenommen und lautet „mit Erfolg teilgenommen“ oder „ohne Erfolg teilgenommen”. Das Praktikum kann nur dann als „mit Erfolg teilgenommen“ gewertet werden, wenn die Schülerin oder der Schüler mindestens 75 vom Hundert der Praktikumszeit abgeleistet hat; sie ist Voraussetzung für das Erreichen des Ausbildungszieles. Über Ausnahmen zur Dauer der Teilnahme am Praktikum entscheidet die Schule.
+§ 6 Voraussetzungen für die Zulassung
+(1) Voraussetzung für die Zulassung ist
+ 1. der Mittlere Schulabschluss,
+ 2. in zwei für den Bildungsgang maßgeblichen Unterrichtsfächern mindestens die Note „befriedigend“ und
+ 3. die Teilnahme an einem Beratungsgespräch in der Schule, wenn die Schülerin oder der Schüler einen Antrag nach Absatz 2 stellt.
+Die für den Bildungsgang maßgeblichen Unterrichtsfächer nach Nummer 2 werden von den aufnehmenden Schulen in Abstimmung mit der Senatorin für Kinder und Bildung bestimmt. Wurde der Mittlere Schulabschluss an einer Schule mit Fachleistungsdifferenzierung erworben, so gilt für die zwei Unterrichtsfächer, die für die Zulassung zum Bildungsgang maßgeblich sind, für das erweiterte Anforderungsniveau mindestens die Note „ausreichend“ und für das grundlegende Anforderungsniveau mindestens die Note „befriedigend“.
+(2) Aus besonderen Gründen, die in der Person der Schülerin oder des Schülers liegen, kann die Senatorin für Kinder und Bildung eine Bewerberin oder einen Bewerber unter Berücksichtigung einer Stellungnahme der Schule abweichend von den Zulassungsvoraussetzungen des Absatzes 1 Nummer 1 und 2 zulassen.
+(3) Bewerberinnen und Bewerber, die bereits einen Abschluss besitzen, der in diesem Bildungsgang erworben wird, oder jene, die eine Abschlussprüfung in einer zweijährigen Berufsfachschule mit einer vergleichbaren Fachrichtung endgültig nicht bestanden haben, werden nicht zugelassen.
+(4) Bewerberinnen und Bewerber nicht deutscher Herkunftssprache, die nicht über einen an einer deutschen Schule erworbenen berechtigenden Abschluss nach Absatz 1 Nummer 1 verfügen, müssen ausreichende deutsche Sprachkenntnisse nachweisen. Der Nachweis wird durch die erfolgreiche Teilnahme an einem Zulassungsverfahren nach § 7 erbracht.
+§ 7 Verfahren zum Nachweis deutscher Sprachkenntnisse für Bewerberinnen und Bewerber nicht deutscher Herkunftssprache
+(1) Die Senatorin für Kinder und Bildung bestimmt, an welchen Schulen ein Zulassungsverfahren für Bewerberinnen und Bewerber nicht deutscher Herkunftssprache durchgeführt wird und setzt den Zulassungsausschuss ein. Der Zulassungsausschuss besteht aus der Vorsitzenden oder dem Vorsitzenden und zwei Fachlehrerinnen oder Fachlehrern für Deutsch. Das Zulassungsverfahren wird unverzüglich nach dem in § 8 Absatz 1 bestimmten Termin durchgeführt.
+(2) Die Kenntnisse in der deutschen Sprache werden durch eine Feststellungsprüfung, die aus einem schriftlichen und einem mündlichen Teil besteht, nachgewiesen. Beide Prüfungsteile können an einem Tag stattfinden. Die Zeit für den schriftlichen Teil beträgt mindestens 60 und höchstens 90 Minuten, für den mündlichen Teil mindestens 15 und höchstens 20 Minuten. Die Sprachfeststellungsprüfung muss mindestens dem Niveau B1 des Gemeinsamen Europäischen Referenzrahmens für Sprachen entsprechen.
+(3) Die schriftliche Arbeit ist von zwei Fachlehrerinnen oder Fachlehrern zu beurteilen. Kommt nur eine oder einer der beiden Fachlehrerinnen oder Fachlehrer zu der Überzeugung, dass mit der Arbeit ausreichende Sprachkenntnisse nachgewiesen sind, entscheidet die Vorsitzende oder der Vorsitzende.
+(4) Unter Berücksichtigung der Ergebnisse des schriftlichen und des mündlichen Teils der Prüfung stellt der Zulassungsausschuss fest, ob die Bewerberin oder der Bewerber zugelassen werden kann.
+(5) Die Bewerberin oder der Bewerber kann ein zweites Mal am Zulassungsverfahren teilnehmen, wenn sie oder er eine ausreichende Vorbereitung glaubhaft macht. Die Senatorin für Kinder und Bildung kann auf Antrag gestatten, dass die Bewerberin oder der Bewerber ein drittes Mal am Zulassungsverfahren teilnimmt, wenn hinreichend wahrscheinlich ist, dass sie oder er die geforderten Sprachkenntnisse nachweisen wird.
+(6) Über alle mit dem Zulassungsverfahren zusammenhängenden Vorgänge sind Niederschriften anzufertigen.
+(7) Die Sprachfeststellungsprüfung entfällt bei Nachweis an anderer Stelle erworbener Zertifikate auf mindestens Niveau B1 des Gemeinsamen Europäischen Referenzrahmens für Sprachen.
+§ 8 Zulassung
+(1) Der Antrag auf Zulassung ist unter Angabe des gewünschten Bildungsgangs bei der Schule bis zum 1. März eines jeden Jahres einzureichen. Mit dem Antrag ist die Erfüllung der Zulassungsvoraussetzungen nach § 6 Absatz 1 nachzuweisen sowie eine Erklärung darüber abzugeben, ob ein Ablehnungsgrund nach § 6 Absatz 3 vorliegt.
+(2) Über die Zulassung entscheidet die Schule. Wenn die nach Absatz 1 erforderlichen Nachweise und die Erklärung noch nicht vorliegen, wird die Zulassung unter der Bedingung ausgesprochen, dass diese spätestens bis sieben Tage nach Beginn der Sommerferien vorgelegt werden.
+(3) Bewerberinnen und Bewerber nicht deutscher Herkunftssprache sind auf die Wahlmöglichkeit nach § 4 Absatz 2 hinzuweisen. Wollen sie von der Wahlmöglichkeit Gebrauch machen, teilen sie dies im Antrag auf Zulassung mit.
+§ 9 Wechsel des Bildungsganges
+(1) Ein Wechsel des Bildungsganges innerhalb der Berufsfachschule für Assistenten ist einmal möglich und der Senatorin für Kinder und Bildung von der Schule mitzuteilen.
+(2) Aus besonderen Gründen, die in der Person der Schülerin oder des Schülers liegen, kann die Senatorin für Kinder und Bildung einer Schülerin oder einem Schüler unter Berücksichtigung einer Stellungnahme der Schule abweichend von Absatz 1 einen zweiten Wechsel genehmigen.
+Teil 2 Prüfung
+§ 10 Allgemeines
+(1) Die Ausbildung schließt mit einer Prüfung ab. Die Prüfung besteht aus einem schriftlichen und einem praktischen Teil. Beide Teile werden in einer gemeinsamen Fallbeschreibung miteinander verknüpft und orientieren sich an vollständigen, betrieblichen Handlungen. Beide Teile der Prüfung können sich auf die Fächer und Lernfelder nach § 13 Absatz 1 erstrecken. Politische Inhalte sind Teil der schriftlichen Prüfung.
+(2) Schulen mit gleichem Bildungsgang und gleichem Schwerpunkt erstellen gemeinsame Prüfungen.
+§ 11 Abnahme der Prüfung
+Die Prüfung wird von den öffentlichen Schulen im Lande Bremen, die einen Bildungsgang der Berufsfachschule für Assistenten eingerichtet haben, durchgeführt.
+§ 12 Prüfungsausschuss
+(1) Zur Durchführung der Prüfung wird ein Prüfungsausschuss gebildet. Dem Prüfungsausschuss gehören als Mitglieder an:
+ 1. die Schulleiterin oder der Schulleiter,
+ 2. die für den Bildungsgang verantwortliche Abteilungsleiterin oder der für den Bildungsgang verantwortliche Abteilungsleiter oder die für den Bildungsgang verantwortliche Lehrerin oder der für den Bildungsgang verantwortliche Lehrer der Schule,
+ 3. die Fachlehrerinnen und die Fachlehrer, die in den für die Prüfung schwerpunktmäßig relevanten Lernfeldern unterrichtet haben.
+Den Vorsitz hat die Schulleiterin oder der Schulleiter oder eine von ihr oder ihm benannte Vertreterin oder ein von ihr oder ihm benannter Vertreter.
+(2) Der Prüfungsausschuss ist beschlussfähig, wenn die Mehrheit der Mitglieder, darunter die oder der Vorsitzende, anwesend ist. Beschlüsse werden mit Stimmenmehrheit der anwesenden Mitglieder gefasst. Bei Stimmengleichheit entscheidet die Stimme der Vorsitzenden oder des Vorsitzenden. Stimmenthaltungen sind nicht zulässig.
+(3) Die Vorsitzende oder der Vorsitzende des Prüfungsausschusses kann gegen Beschlüsse des Prüfungsausschusses Einspruch einlegen, über den die Senatorin für Kinder und Bildung entscheidet. Der Einspruch hat aufschiebende Wirkung.
+(4) Der Prüfungsausschuss verabredet vor Beginn der Prüfung einheitliche Maßstäbe für die Beurteilung der Prüfungsleistungen.
+(5) In Fällen, in denen nichts anderes bestimmt ist, trifft der Prüfungsausschuss die Entscheidungen.
+§ 13 Gegenstand, Ort und Termine der Prüfung, Belehrung
+(1) Gegenstand der Prüfung können alle Fächer und alle bis zur Prüfung abgeschlossenen Lernfelder beider Ausbildungsjahre sein. § 4 Absatz 2 bleibt unberührt.
+(2) Die Vorsitzende oder der Vorsitzende des Prüfungsausschusses setzt Ort, Datum und Uhrzeit für alle Teile der Prüfung verbindlich fest und teilt allen Beteiligten unverzüglich Prüfungsort und Termine in geeigneter Form mit.
+(3) Den Prüflingen ist vor Beginn der Prüfung der Text der §§ 24 und 25 bekannt zu geben.
+§ 14 Berücksichtigung besonderer Belange von Menschen mit Behinderung
+(1) Im Prüfungsverfahren sind die besonderen Belange von Menschen mit Behinderung durch Nachteilsausgleiche zu berücksichtigen.
+(2) Der Prüfling hat rechtzeitig vor der Prüfung auf seine Behinderung hinzuweisen, wenn diese im Prüfungsverfahren berücksichtigt werden soll.
+(3) Der Prüfungsausschuss legt in der ersten Prüfungskonferenz fest, durch welche besonderen Maßnahmen die Belange des Menschen mit Behinderung in der Prüfung berücksichtigt werden. Diese Maßnahmen sollen die behinderungsbedingte Benachteiligung ausgleichen, nicht jedoch die Prüfungsanforderungen qualitativ verändern.
+(4) Als geeignete Maßnahmen kommen eine besondere Organisation und eine besondere Gestaltung der Prüfung sowie die Zulassung spezieller Hilfen in Betracht.
+§ 15 Zulassung zur Prüfung
+(1) Zur Prüfung ist zugelassen, wer
+ 1. zu Beginn der Prüfung Schülerin oder Schüler des jeweiligen Bildungsgangs ist,
+ 2. kein mit „ungenügend“ abgeschlossenes Fach oder Lernfeld im zweiten Ausbildungsjahr hat,
+ 3. einen Notendurchschnitt nach Absatz 2 von 4,0 oder besser aufweist und
+ 4. erfolgreich am Praktikum nach § 5 teilgenommen hat.
+Über Ausnahmen entscheidet der Prüfungsausschuss.
+(2) Zur Ermittlung der Durchschnittsnote werden die Noten der abgeschlossenen Lernfelder und Fächer entsprechend ihres Stundenumfangs gemäß der Stundentafel gewichtet.
+(3) Die Entscheidung über die Nichtzulassung zur Prüfung wird in der ersten Prüfungskonferenz nach § 18 getroffen und der Schülerin oder dem Schüler schriftlich mitgeteilt.
+§ 16 Festlegungen zur Prüfung
+(1) Spätestens zu Beginn des letzten Ausbildungshalbjahres legt die Senatorin für Kinder und Bildung auf Vorschlag der Schule fest, aus welchen vier Lernfeldern und Fächern sich der schriftliche und der praktische Teil der Prüfung zusammensetzen sollen. Schulen mit gleichem Bildungsgang und gleichem Schwerpunkt einigen sich auf die gleichen vier Lernfelder und Fächer.
+(2) Die Entscheidungen über die Festlegungen zur Prüfung werden den Prüflingen unverzüglich zur Kenntnis gegeben.
+§ 17 Vornote
+Die Vornote ergibt sich aus den Leistungen im Bildungsgang in den Lernfeldern und Fächern nach § 13 Absatz 1. Die Vornote wird aus den nach Stundenumfang gewichteten Endnoten aller abgeschlossenen Lernfelder und der jeweils letzten Note aller Fächer des berufsübergreifenden Lernbereichs gebildet. Das Ergebnis wird auf eine Stelle nach dem Komma geschnitten.
+§ 18 Erste Prüfungskonferenz
+(1) Spätestens am dritten Unterrichtstag vor Beginn des ersten Prüfungsteils tritt der Prüfungsausschuss zur ersten Prüfungskonferenz zusammen.
+(2) In dieser Prüfungskonferenz beschließt der Prüfungsausschuss auf Vorschlag der Fachlehrerinnen und Fachlehrer die Vornote.
+(3) Auf der Grundlage der Zulassungsvoraussetzungen nach § 15 trifft der Prüfungsausschuss die Entscheidung über die Zulassung zur Prüfung.
+(4) Spätestens am zweiten Unterrichtstag vor Beginn des ersten Prüfungsteils wird dem Prüfling die Vornote mitgeteilt.
+§ 19 Durchführung der Prüfung
+(1) Die Prüfung erstreckt sich auf die nach den §§ 13 und 16 festgelegten Lernfelder und Fächer. Der Umfang der praktischen Prüfung beträgt mindestens 4 Zeitstunden. Der Umfang der schriftlichen Prüfung beträgt mindestens 8 Zeitstunden.
+(2) Die Schulleiterin oder der Schulleiter legt der Senatorin für Kinder und Bildung spätestens bis zum Ende des ersten Schulhalbjahres des zweiten Ausbildungsjahres zwei Prüfungsvorschläge mit jeweils einem schriftlichen und einem praktischen Teil in einem versiegelten Umschlag vor. Zu allen Aufgabenvorschlägen gehören die Angabe der Bearbeitungsdauer und eine genaue Beschreibung der vom Prüfling erwarteten Leistung (Erwartungshorizont) einschließlich der Angabe von Bewertungskriterien. Aus diesen Vorschlägen wählt die Senatorin für Kinder und Bildung einen Prüfungsvorschlag aus. Wenn ihr die Prüfungsvorschläge teilweise oder ganz änderungsbedürftig oder ungeeignet erscheinen, kann sie neue Prüfungsvorschläge anfordern.
+(3) Die Vorbereitungen für die Durchführung der Prüfung sind so zu treffen, dass die Prüfungsaufgaben den Prüflingen nicht vor der Prüfung bekannt werden.
+(4) Die Zeit für die Bearbeitung der Prüfungsaufgaben beginnt unmittelbar, nachdem die Prüfungsaufgaben bekanntgegeben und beigefügte Texte gelesen worden sind.
+(5) Die Prüfung findet unter Aufsicht statt.
+(6) Die Prüfungsarbeiten werden vom Mitglied des Prüfungsausschusses nach § 12 Absatz 1 Nummer 3 als Referentin oder Referent beurteilt und benotet. Die Vorsitzende oder der Vorsitzende des Prüfungsausschusses bestellt für jeden Prüfungsteil eine weitere Fachlehrerin oder einen weiteren Fachlehrer als Korreferentin oder Korreferenten. Diese oder dieser beurteilt und benotet die Prüfungsarbeiten ebenfalls. Stimmen die erteilten Noten nicht überein, entscheidet der Prüfungsausschuss.
+§ 20 Noten
+(1) Alle nach dieser Verordnung zu erteilenden Noten richten sich nach der Notenskala der Zeugnisordnung und dem für berufliche Vollzeit-Bildungsgänge festgelegten Notenschlüssel:
+1
+2
+3
+4
+5
+6
+ab 85 Prozent
+ab 73 Prozent
+ab 59 Prozent
+ab 45 Prozent
+ab 27 Prozent
+unter 27 Prozent
+sehr gut
+gut
+befriedigend
+ausreichend
+mangelhaft
+ungenügend
+(2) Auf der Grundlage der Prozentwerte des Notenschlüssels werden die Vornoten, die Noten der Prüfung und die Endnoten gebildet.
+§ 21 Ergebnis des Prüfungsblocks
+(1) Der Prüfungsblock umfasst den schriftlichen und praktischen Teil der Prüfung nach § 10. Die Note des schriftlichen Prüfungsteils und die Note des praktischen Prüfungsteils fließen zu gleichen Anteilen in die Note des Prüfungsblocks ein.
+(2) Der Prüfungsblock ist nicht bestanden, wenn
+ 1. die Bewertung der Leistungen eines Prüfungsteils „ungenügend“ lautet oder
+ 2. die Bewertung der Leistungen in beiden Prüfungsteilen „mangelhaft“ lautet oder
+ 3. die Bewertung der Leistungen in der Prüfung in einem Prüfungsteil „mangelhaft“ lautet und ein Ausgleich für diesen Prüfungsteil nicht gegeben ist; ein Ausgleich ist nur gegeben, wenn die Bewertung im anderen Prüfungsteil mindestens „befriedigend“ lautet.
+In allen anderen Fällen ist die Prüfung in den Fächern des Prüfungsblocks bestanden.
+§ 22 Zweite Prüfungskonferenz, Ergebnis der Prüfung
+(1) Der Prüfungsausschuss beschließt in der zweiten Prüfungskonferenz die Note des Prüfungsblocks, die Endnote der Prüfung und das Ergebnis der Prüfung. Die Endnote der Prüfung ergibt sich aus der Vornote und der Note des Prüfungsblocks. Die Vornote wird mit zwei Dritteln und die Note des Prüfungsblocks mit einem Drittel gewichtet.
+(2) Die Vorsitzende oder der Vorsitzende des Prüfungsausschusses gibt dem Prüfling im Anschluss an die zweite Prüfungskonferenz die Noten der einzelnen Prüfungsteile sowie das Ergebnis der Prüfung bekannt. Das Ergebnis der Prüfung lautet „bestanden“ oder „nicht bestanden“.
+(3) Hat der Prüfling die Prüfung bestanden, erhält er ein Abschlusszeugnis mit der Berechtigung, die Berufsbezeichnung
+ 1. Staatlich geprüfte Biologisch-technische Assistentin/Staatlich geprüfter Biologisch-technischer Assistent mit dem Schwerpunkt Biochemie
+ 2. Staatlich geprüfte Chemisch-technische Assistentin/Staatlich geprüfter Chemisch-technischer Assistent
+ 3. Staatlich geprüfte Gestaltungstechnische Assistentin/Staatlich geprüfter Gestaltungstechnischer Assistent mit dem Schwerpunkt Grafik
+ 4. Staatlich geprüfte Informationstechnische Assistentin/Staatlich geprüfter Informationstechnischer Assistent mit dem Schwerpunkt Informations- und Netzwerksystemtechnik
+ 5. Staatlich geprüfte Mathematisch-technische Assistentin/Staatlich geprüfter Mathematisch-technischer Assistent mit dem Schwerpunkt Wirtschaftswissenschaft und Wirtschaftsinformatik
+ 6. Staatlich geprüfte Physikalisch-technische Assistentin/Staatlich geprüfter Physikalisch-technischer Assistent
+ 7. Staatlich geprüfte kaufmännische Assistentin/Staatlich geprüfter kaufmännischer Assistent mit dem Schwerpunkt Fremdsprachen
+ 8. Staatlich geprüfte kaufmännische Assistentin/Staatlich geprüfter kaufmännischer Assistent mit dem Schwerpunkt Informationsverarbeitung zu führen.
+Hat der Prüfling die Prüfung nicht bestanden und verlässt er die Schule, erhält er ein Abgangszeugnis. Form und Inhalt der Zeugnisse legt die Senatorin für Kinder und Bildung fest.
+§ 23 Wiederholung der Prüfung
+(1) Ein Prüfling, der die Prüfung nicht bestanden hat, kann sie einmal wiederholen. Die Senatorin für Kinder und Bildung kann auf Antrag eine zweite Wiederholung der Prüfung gestatten, wenn ihr Bestehen hinreichend wahrscheinlich ist.
+(2) Die Wiederholung findet im Rahmen der nächstfolgenden Prüfung statt. Bis zum Prüfungstermin nimmt die Schülerin oder der Schüler am Unterricht des letzten Ausbildungsjahres teil.
+§ 24 Täuschung und Behinderung
+(1) Versucht ein Prüfling, das Ergebnis der Prüfung durch Täuschung zu beeinflussen, so ist die gesamte Prüfung für nicht bestanden zu erklären. In leichteren Fällen ist die betroffene Teilleistung für nicht bestanden zu erklären und mit der Note „ungenügend“ zu bewerten.
+(2) Behindert ein Prüfling durch sein Verhalten die Prüfung so schwerwiegend, dass es nicht möglich ist, seine Prüfung oder die anderer Prüflinge ordnungsgemäß durchzuführen, so kann er von der weiteren Prüfung ausgeschlossen werden. Die gesamte Prüfung ist dann für nicht bestanden zu erklären.
+(3) Der Prüfling hat das Recht, solange weiter an der Prüfung teilzunehmen, bis der Prüfungsausschuss, der unverzüglich einzuberufen ist, die notwendigen Entscheidungen nach Absatz 1 oder 2 getroffen hat. Vor seiner Entscheidung hat der Prüfungsausschuss den Prüfling anzuhören.
+§ 25 Versäumnis
+(1) Wer wegen Erkrankung oder aus anderen wichtigen Gründen einen Prüfungsteil versäumt, muss unverzüglich ein ärztliches Attest vorlegen beziehungsweise nachweisen, dass er das Versäumnis nicht zu vertreten hat.
+(2) Versäumt ein Prüfling aus von ihm zu vertretenden Gründen einen Prüfungsteil, sind die deswegen nicht erbrachten Leistungen mit „ungenügend“ zu bewerten. In leichteren Fällen ist der entsprechende Prüfungsteil zu wiederholen. Versäumt ein Prüfling aus von ihm zu vertretenden Gründen mehr als einen Prüfungsteil, ist die gesamte Prüfung für nicht bestanden zu erklären.
+(3) In Fällen, in denen der Prüfling aus von ihm nicht zu vertretenden Gründen einen Prüfungsteil erneut versäumt, setzt der Prüfungsausschuss einen neuen Termin fest. Für den Prüfungsteil kann ein nicht gewählter Aufgabenvorschlag gestellt werden, wenn er von der Fachaufsicht genehmigt wurde.
+§ 26 Niederschriften
+(1) Über alle mit der Prüfung zusammenhängenden Beratungen und Prüfungsvorgänge werden Niederschriften angefertigt.
+(2) Die Niederschriften sind von der Protokollführerin oder vom Protokollführer und von der Vorsitzenden oder vom Vorsitzenden des Prüfungsausschusses oder des Teilprüfungsausschusses zu unterzeichnen.
+(3) Die Niederschrift über die Prüfung führt die aufsichtführende Lehrerin oder der aufsichtführende Lehrer. Sie soll insbesondere enthalten:
+ 1. den Sitzplan der Prüflinge,
+ 2. die Namen der aufsichtführenden Lehrerinnen und Lehrer und die jeweiligen Aufsichtszeiten,
+ 3. den Beginn der Aufgabenstellung und der Arbeitszeit,
+ 4. den letztmöglichen Zeitpunkt für die Abgabe der Arbeit,
+ 5. die Zeiten, zu denen einzelne Prüflinge den Raum verlassen und zurückkehren,
+ 6. die Zeiten, zu denen die Prüflinge ihre Arbeiten abgeben,
+ 7. Schülerinnen und Schüler mit Nachteilsausgleichen und deren Umfang,
+ 8. besondere Vorkommnisse.
+(4) Den Niederschriften ist eine Liste beizufügen, die die Vornote, die Note des Prüfungsblocks, die Endnote der Prüfung sowie das Ergebnis der Prüfung enthält.
+Teil 3 Schlussbestimmungen
+§ 27 Übergangsbestimmung
+(1) Diese Verordnung ist ab dem 1. März 2019 für die Bildungsgänge Chemisch-technische Assistentin/Chemisch technischer Assistent sowie Biologisch-technische Assistentin/Biologisch-technischer Assistent mit dem Schwerpunkt Biochemie anzuwenden. Auf Bildungsgänge nach Satz 1, die vor dem 1. März 2019 begonnen haben, ist die Verordnung über die Berufsfachschule für Assistenten in ihrer bis zum Ablauf des 28. Februar 2019 geltenden Fassung weiter anzuwenden.
+(2) Diese Verordnung ist erst ab dem 1. März 2020 für die Bildungsgänge Informationstechnische Assistentin/Informationstechnischer Assistent mit dem Schwerpunkt Informations- und Netzwerksystemtechnik sowie Mathematisch-technische Assistentin/Mathematisch-technischer Assistent mit dem Schwerpunkt Wirtschaftswissenschaft und Wirtschaftsinformatik anzuwenden. Auf Bildungsgänge nach Satz 1, die vor dem 1. März 2020 begonnen haben, ist die Verordnung über die Berufsfachschule für Assistenten in ihrer bis zum Ablauf des 28. Februar 2019 geltenden Fassung weiter anzuwenden.
+(3) Diese Verordnung ist erst ab dem 1. März 2021 für die Bildungsgänge Kaufmännische Assistentin/Kaufmännischer Assistent mit dem Schwerpunkt Fremdsprachen sowie Kaufmännische Assistentin/Kaufmännischer Assistent mit dem Schwerpunkt Informationsverarbeitung anzuwenden. Auf Bildungsgänge nach Satz 1, die vor dem 1. März 2021 begonnen haben, ist die Verordnung über die Berufsfachschule für Assistenten in ihrer bis zum Ablauf des 28. Februar 2019 geltenden Fassung weiter anzuwenden.
+(4) Diese Verordnung ist erst ab dem 1. März 2022 für die Bildungsgänge Gestaltungstechnische Assistentin/Gestaltungstechnischer Assistent mit dem Schwerpunkt Grafik sowie Physikalisch-technische Assistentin/Physikalisch-technischer Assistent anzuwenden. Auf Bildungsgänge nach Satz 1, die vor dem 1. März 2022 begonnen haben, ist die Verordnung über die Berufsfachschule für Assistenten in ihrer bis zum Ablauf des 28. Februar 2019 geltenden Fassung weiter anzuwenden.
+§ 28 Inkrafttreten, Außerkrafttreten
+(1) Diese Verordnung tritt mit Wirkung vom 1. März 2019 in Kraft.
+(2) Gleichzeitig tritt die Verordnung über die Berufsfachschule für Assistenten vom 8. November 2012 (Brem.GBl. S. 452 - 223-o-5a), die zuletzt durch Artikel 4 der Verordnung vom 30. November 2016 (Brem.GBl. S. 1001) geändert worden ist, außer Kraft.
diff --git a/src/test/resources/sampledata/Bremen/AssBerFSchulV-BR-neu.txt b/src/test/resources/sampledata/Bremen/AssBerFSchulV-BR-neu.txt
new file mode 100644
index 0000000..f482815
--- /dev/null
+++ b/src/test/resources/sampledata/Bremen/AssBerFSchulV-BR-neu.txt
@@ -0,0 +1,178 @@
+Verordnung über die Berufsfachschule für technische und kaufmännische Assistentinnen und Assistenten
+(AssBerFSchulV BR 2019)
+Vom 24. April 2019
+(Brem.GBl. 2019, S. 297)
+Teil 1 Ausbildung
+§ 1 Aufgaben und Ziele
+Die Ausbildung in den Bildungsgängen der Berufsfachschule für technische und kaufmännische Assistentinnen und Assistenten soll die Schülerinnen und Schüler auf ihre spätere Berufstätigkeit in Laboratorien, Instituten, Werkseinrichtungen, Prüf- und Versuchsfeldern der Wirtschaft, Verwaltung und Wissenschaft vorbereiten. Zentrales Ziel der Berufsfachschule für Assistenten ist es, die Entwicklung beruflicher Handlungskompetenz zu fördern und die Schülerinnen und Schüler zum selbstständigen Planen, Durchführen und Beurteilen von Arbeitsaufgaben zu befähigen. Handlungskompetenz entfaltet sich in den Dimensionen von Fachkompetenz, Selbstkompetenz und Sozialkompetenz. Die Entwicklung beruflicher Flexibilität und Mobilität sowie die Fähigkeit und Bereitschaft zur Fort- und Weiterbildung sind ebenfalls Ziele des Bildungsgangs.
+§ 2 Unterrichtsgrundsätze
+Der berufsbezogene Unterricht in der Berufsfachschule für technische und kaufmännische Assistentinnen und Assistenten folgt didaktisch dem Lernfeldkonzept. Der berufsübergreifende Lernbereich ist nach Fächern strukturiert. Die Lernfelder in den Bildungsgängen der Berufsfachschule für technische und kaufmännische Assistentinnen und Assistenten finden ihre unterrichtliche Umsetzung in Lernsituationen, die sich sowohl bei der Auswahl der Inhalte als auch als methodisches Prinzip bei der Gestaltung des Unterrichts an beruflichen Handlungssituationen orientieren.
+§ 3 Dauer und Organisation der Ausbildung
+(1) Die Ausbildung dauert in der Regel zwei Jahre. Der Unterricht umfasst einen berufsübergreifenden und einen berufsbezogenen Lernbereich sowie ein Betriebspraktikum.
+(2) Mit Genehmigung der Senatorin oder des Senators für Kinder und Bildung können folgende Bildungsgänge eingerichtet werden:
+ 1. Bildungsgänge der Berufsfachschule für technische Assistentinnen und technische Assistenten,
+ a) Biologisch-technische Assistentin/Biologisch-technischer Assistent mit dem Schwerpunkt Biochemie
+ b) Chemisch-technische Assistentin/Chemisch-technischer Assistent
+ c) Gestaltungstechnische Assistentin/Gestaltungstechnischer Assistent mit dem Schwerpunkt Grafik
+ d) Informationstechnische Assistentin/Informationstechnischer Assistent mit dem Schwerpunkt Informations- und Netzwerksystemtechnik
+ e) Mathematisch-technische Assistentin/Mathematisch-technischer Assistent mit dem Schwerpunkt Künstliche Intelligenz und Wirtschaftsinformatik
+ 2. Bildungsgänge der Berufsfachschule für kaufmännische Assistentinnen und kaufmännische Assistenten,
+ a) Kaufmännische Assistentin/Kaufmännischer Assistent mit dem Schwerpunkt Fremdsprachen
+ b) Kaufmännische Assistentin/Kaufmännischer Assistent mit dem Schwerpunkt Informationsverarbeitung
+§ 4 Unterrichtsfächer, Lernfelder und Stundentafeln
+(1) Die Unterrichtsfächer und Lernfelder, ihre Zuordnung zu den Lernbereichen und die Zahl der Unterrichtsstunden je Lernbereich ergeben sich aus der Rahmenstundentafel der Anlage in Verbindung mit der für den jeweiligen Bildungsgang gültigen Stundentafel.
+(2) Wird Englisch im berufsübergreifenden Lernbereich angeboten, können Schülerinnen und Schüler nicht deutscher Herkunftssprache, die anstelle der Note in der Fremdsprache Englisch im berechtigenden Zeugnis einer deutschen Schule die Note in der Herkunftssprache erhalten haben oder die nicht über einen an einer deutschen Schule erworbenen Abschluss nach § 6 Absatz 1 Nummer 1 verfügen, anstelle der Prüfung in der Fremdsprache Englisch die Feststellungsprüfung in ihrer Herkunftssprache wählen. Diese Prüfung findet am Anfang des Bildungsgangs statt. Bei nicht ausreichenden Leistungen kann die Prüfung einmal wiederholt werden. Die Wiederholung findet bis zum Ende des ersten Ausbildungsjahres statt. Ausgenommen sind die Schülerinnen und Schüler der Bildungsgänge, in denen Englisch im berufsbezogenen Lernbereich der Stundentafel ausgewiesen ist. Die Schülerinnen und Schüler, die sich für eine Feststellungsprüfung in ihrer Herkunftssprache entschieden haben, nehmen am Englisch-Anfängerunterricht teil. Die Note des Englisch-Anfängerunterrichts wird nicht in die Bewertung der Abschlussqualifikation einbezogen. Im Abschlusszeugnis oder im Abgangszeugnis wird der Unterricht mit dem Vermerk „Nicht Gegenstand der Prüfung” ausgewiesen. Auf Wunsch der Schülerin oder des Schülers wird eine Note erteilt. Im Abschlusszeugnis oder im Abgangszeugnis wird die Note der Sprachfeststellungsprüfung in der Herkunftssprache anstelle der Note in der Fremdsprache Englisch ausgewiesen und in die Bewertung der Abschlussqualifikation einbezogen.
+§ 5 Praktikum
+(1) Als Teil der schulischen Ausbildung wird ein Praktikum in geeigneten Betrieben oder Einrichtungen (Praktikumsstellen) oder in Form anderer Lernortekooperationen durchgeführt. In begründeten Ausnahmefällen und nach Genehmigung durch die Fachaufsicht, kann das Praktikum beim Fehlen geeigneter Praktikumsstellen in schuleigenen Einrichtungen stattfinden. Das Praktikum soll gleichzeitig für alle Schülerinnen und Schüler eines Klassenverbandes durchgeführt werden. Die Schülerinnen und Schüler unterliegen während der Dauer des Praktikums denselben gesetzlichen Bestimmungen über Unfall- und Haftpflichtversicherung, die für die Teilnahme an schulischen Veranstaltungen gelten.
+(2) Das Praktikum soll mindestens vier Wochen in Vollzeit dauern. Davon soll ein Teil in den Ferien abgeleistet werden. Das Praktikum kann unter Einhaltung des zeitlichen Umfangs statt in Blockform auch in anderen Organisationsformen durchgeführt werden. Über die Dauer des Praktikums, über die Möglichkeit einer Verlängerung und über die Organisationsform entscheidet die Schule.
+(3) Die Ziele und der Ablauf des Praktikums sowie die Aufgaben der Schülerin oder des Schülers werden zwischen Schule und Praktikumsstelle abgestimmt. Während des Praktikums wird die Schülerin oder der Schüler von einer Lehrerin oder einem Lehrer der Schule betreut.
+(4) Am Ende des Praktikums wird von der Praktikumsstelle eine schriftliche Beurteilung abgegeben. Sie soll mindestens Angaben über den Beurteilungszeitraum, die erworbenen Kompetenzen, die erbrachten Leistungen und die Fehlzeiten enthalten. Die Bewertung wird durch die Schule auf der Grundlage der Beurteilung der Praktikumsstelle sowie der betreuenden Lehrerin oder des betreuenden Lehrers vorgenommen und lautet „mit Erfolg teilgenommen“ oder „ohne Erfolg teilgenommen”. Das Praktikum kann nur dann als „mit Erfolg teilgenommen“ gewertet werden, wenn die Schülerin oder der Schüler mindestens 75 vom Hundert der Praktikumszeit abgeleistet hat; sie ist Voraussetzung für das Erreichen des Ausbildungszieles. Über Ausnahmen zur Dauer der Teilnahme am Praktikum entscheidet die Schule.
+§ 6 Voraussetzungen für die Zulassung
+(1) Voraussetzung für die Zulassung ist
+ 1. der Mittlere Schulabschluss,
+ 2. in zwei für den Bildungsgang maßgeblichen Unterrichtsfächern mindestens die Note „befriedigend“ und
+ 3. die Teilnahme an einem Beratungsgespräch in der Schule, wenn die Schülerin oder der Schüler einen Antrag nach Absatz 2 stellt.
+Die für den Bildungsgang maßgeblichen Unterrichtsfächer nach Nummer 2 werden von den aufnehmenden Schulen in Abstimmung mit der Senatorin oder dem Senator für Kinder und Bildung bestimmt. Wurde der Mittlere Schulabschluss an einer Schule mit Fachleistungsdifferenzierung erworben, so gilt für die zwei Unterrichtsfächer, die für die Zulassung zum Bildungsgang maßgeblich sind, für das erweiterte Anforderungsniveau mindestens die Note „ausreichend“ und für das grundlegende Anforderungsniveau mindestens die Note „befriedigend“.
+(2) Aus besonderen Gründen, die in der Person der Schülerin oder des Schülers liegen, kann die Senatorin oder der Senator für Kinder und Bildung eine Bewerberin oder einen Bewerber unter Berücksichtigung einer Stellungnahme der Schule abweichend von den Zulassungsvoraussetzungen des Absatzes 1 Nummer 1 und 2 zulassen wenn die Bewerberin oder der Bewerber nachweisen kann, dass die nicht erfüllten Zulassungsvoraussetzungen durch gleichwertige, anderweitig erworbene Kompetenzen ausgeglichen werden können.
+(3) Bewerberinnen und Bewerber, die bereits einen Abschluss besitzen, der in diesem Bildungsgang erworben wird, oder jene, die eine Abschlussprüfung in einer zweijährigen Berufsfachschule mit einer vergleichbaren Fachrichtung endgültig nicht bestanden haben, werden nicht zugelassen.
+(4) Bewerberinnen und Bewerber nicht deutscher Herkunftssprache, die nicht über einen an einer deutschen Schule erworbenen berechtigenden Abschluss nach Absatz 1 Nummer 1 verfügen, müssen ausreichende deutsche Sprachkenntnisse nachweisen. Der Nachweis wird durch die erfolgreiche Teilnahme an einem Zulassungsverfahren nach § 7 erbracht.
+§ 7 Verfahren zum Nachweis deutscher Sprachkenntnisse für Bewerberinnen und Bewerber nicht deutscher Herkunftssprache
+(1) Die Senatorin oder der Senator für Kinder und Bildung bestimmt, an welchen Schulen ein Zulassungsverfahren für Bewerberinnen und Bewerber nicht deutscher Herkunftssprache durchgeführt wird und setzt den Zulassungsausschuss ein. Der Zulassungsausschuss besteht aus der Vorsitzenden oder dem Vorsitzenden und zwei Fachlehrerinnen oder Fachlehrern für Deutsch. Das Zulassungsverfahren wird unverzüglich nach dem in § 8 Absatz 1 bestimmten Termin durchgeführt.
+(2) Die Kenntnisse in der deutschen Sprache werden durch eine Feststellungsprüfung, die aus einem schriftlichen und einem mündlichen Teil besteht, nachgewiesen. Beide Prüfungsteile können an einem Tag stattfinden. Die Zeit für den schriftlichen Teil beträgt mindestens 60 und höchstens 90 Minuten, für den mündlichen Teil mindestens 15 und höchstens 20 Minuten. Die Sprachfeststellungsprüfung muss mindestens dem Niveau B1 des Gemeinsamen Europäischen Referenzrahmens für Sprachen entsprechen.
+(3) Die schriftliche Arbeit ist von zwei Fachlehrerinnen oder Fachlehrern zu beurteilen. Kommt nur eine oder einer der beiden Fachlehrerinnen oder Fachlehrer zu der Überzeugung, dass mit der Arbeit ausreichende Sprachkenntnisse nachgewiesen sind, entscheidet die Vorsitzende oder der Vorsitzende.
+(4) Unter Berücksichtigung der Ergebnisse des schriftlichen und des mündlichen Teils der Prüfung stellt der Zulassungsausschuss fest, ob die Bewerberin oder der Bewerber zugelassen werden kann.
+(5) Die Bewerberin oder der Bewerber kann ein zweites Mal am Zulassungsverfahren teilnehmen, wenn sie oder er eine ausreichende Vorbereitung glaubhaft macht. Die Senatorin oder der Senator für Kinder und Bildung kann auf Antrag gestatten, dass die Bewerberin oder der Bewerber ein drittes Mal am Zulassungsverfahren teilnimmt, wenn hinreichend wahrscheinlich ist, dass sie oder er die geforderten Sprachkenntnisse nachweisen wird.
+(6) Über alle mit dem Zulassungsverfahren zusammenhängenden Vorgänge sind Niederschriften anzufertigen.
+(7) Die Sprachfeststellungsprüfung entfällt bei Nachweis an anderer Stelle erworbener Zertifikate auf mindestens Niveau B1 des Gemeinsamen Europäischen Referenzrahmens für Sprachen.
+§ 8 Zulassung
+(1) Der Antrag auf Zulassung ist unter Angabe des gewünschten Bildungsgangs bei der Schule bis zum 1. März eines jeden Jahres einzureichen. Mit dem Antrag ist die Erfüllung der Zulassungsvoraussetzungen nach § 6 Absatz 1 nachzuweisen sowie eine Erklärung darüber abzugeben, ob ein Ablehnungsgrund nach § 6 Absatz 3 vorliegt.
+(2) Über die Zulassung entscheidet die Schule. Wenn die nach Absatz 1 erforderlichen Nachweise und die Erklärung noch nicht vorliegen, wird die Zulassung unter der Bedingung ausgesprochen, dass diese spätestens bis sieben Tage nach Beginn der Sommerferien vorgelegt werden.
+(3) Bewerberinnen und Bewerber nicht deutscher Herkunftssprache sind auf die Wahlmöglichkeit nach § 4 Absatz 2 hinzuweisen. Wollen sie von der Wahlmöglichkeit Gebrauch machen, teilen sie dies im Antrag auf Zulassung mit.
+§ 9 Wechsel des Bildungsganges
+(1) Ein Wechsel des Bildungsganges innerhalb der Berufsfachschule für technische und kaufmännische Assistentinnen und Assistenten ist einmal möglich und der Senatorin oder dem Senator für Kinder und Bildung von der Schule mitzuteilen.
+(2) Aus besonderen Gründen, die in der Person der Schülerin oder des Schülers liegen, kann die Senatorin oder der Senator für Kinder und Bildung einer Schülerin oder einem Schüler unter Berücksichtigung einer Stellungnahme der Schule abweichend von Absatz 1 einen zweiten Wechsel genehmigen.
+Teil 2 Prüfung
+§ 10 Allgemeines
+(1) Die Ausbildung schließt mit einer Prüfung ab. Diese besteht aus einem schriftlichen und einem praktischen Teil. Die Prüfungsteile sollen weitestgehend miteinander verknüpft sein und orientieren sich an vollständigen Handlungen auf Basis von betrieblichen Fallbeschreibungen.
+(2) Schulen mit gleichem Bildungsgang erstellen gemeinsame Prüfungen.
+§ 11 Abnahme der Prüfung
+Die Prüfung wird von den öffentlichen Schulen im Lande Bremen, die einen Bildungsgang der Berufsfachschule für technische und kaufmännische Assistentinnen und Assistenten eingerichtet haben, durchgeführt.
+§ 12 Prüfungsausschuss
+(1) Zur Durchführung der Prüfung wird ein Prüfungsausschuss gebildet. Dem Prüfungsausschuss gehören als Mitglieder an:
+ 1. die Schulleiterin oder der Schulleiter,
+ 2. die für den Bildungsgang verantwortliche Abteilungsleiterin oder der für den Bildungsgang verantwortliche Abteilungsleiter oder die für den Bildungsgang verantwortliche Lehrerin oder der für den Bildungsgang verantwortliche Lehrer der Schule,
+ 3. die Fachlehrerinnen und die Fachlehrer, die in den für die Prüfung schwerpunktmäßig relevanten Lernfeldern unterrichtet haben.
+Den Vorsitz hat die Schulleiterin oder der Schulleiter oder eine von ihr oder ihm benannte Vertreterin oder ein von ihr oder ihm benannter Vertreter.
+(2) Der Prüfungsausschuss ist beschlussfähig, wenn die Mehrheit der Mitglieder, darunter die oder der Vorsitzende, anwesend ist. Beschlüsse werden mit Stimmenmehrheit der anwesenden Mitglieder gefasst. Bei Stimmengleichheit entscheidet die Stimme der Vorsitzenden oder des Vorsitzenden. Stimmenthaltungen sind nicht zulässig.
+(3) Die Vorsitzende oder der Vorsitzende des Prüfungsausschusses kann gegen Beschlüsse des Prüfungsausschusses Einspruch einlegen, über den die Senatorin oder der Senator entscheidet. Der Einspruch hat aufschiebende Wirkung.
+(4) Der Prüfungsausschuss verabredet vor Beginn der Prüfung einheitliche Maßstäbe für die Beurteilung der Prüfungsleistungen.
+(5) In Fällen, in denen nichts anderes bestimmt ist, trifft der Prüfungsausschuss die Entscheidungen.
+§ 13 Gegenstand, Ort und Termine der Prüfung, Belehrung
+(1) Gegenstand der Prüfung können alle Fächer und alle bis zur Prüfung abgeschlossenen Lernfelder beider Ausbildungsjahre sein. Politische Inhalte sind Bestandteil der schriftlichen Prüfung. § 4 Absatz 2 bleibt unberührt.
+(2) Die Vorsitzende oder der Vorsitzende des Prüfungsausschusses setzt Ort, Datum und Uhrzeit für alle Teile der Prüfung verbindlich fest und teilt allen Beteiligten unverzüglich Prüfungsort und Termine in geeigneter Form mit.
+(3) Den Prüflingen ist vor Beginn der Prüfung der Text der §§ 24, 25 und 26 bekannt zu geben.
+§ 14 Berücksichtigung besonderer Belange von Menschen mit Behinderung
+(1) Im Prüfungsverfahren sind die besonderen Belange von Menschen mit Behinderung durch Nachteilsausgleiche zu berücksichtigen.
+(2) Der Prüfling hat rechtzeitig vor der Prüfung auf seine Behinderung hinzuweisen, wenn diese im Prüfungsverfahren berücksichtigt werden soll.
+(3) Der Prüfungsausschuss legt in der ersten Prüfungskonferenz fest, durch welche besonderen Maßnahmen die Belange des Menschen mit Behinderung in der Prüfung berücksichtigt werden. Diese Maßnahmen sollen die behinderungsbedingte Benachteiligung ausgleichen, nicht jedoch die Prüfungsanforderungen qualitativ verändern.
+(4) Als geeignete Maßnahmen kommen eine besondere Organisation und eine besondere Gestaltung der Prüfung sowie die Zulassung spezieller Hilfen in Betracht.
+§ 15 Zulassung zur Prüfung
+(1) Zur Prüfung ist zugelassen, wer
+ 1. zu Beginn der Prüfung Schülerin oder Schüler des jeweiligen Bildungsgangs ist,
+ 2. kein mit „ungenügend“ abgeschlossenes Fach oder Lernfeld im zweiten Ausbildungsjahr hat,
+ 3. einen Notendurchschnitt nach Absatz 2 von 4,0 oder besser aufweist und
+ 4. erfolgreich am Praktikum nach § 5 teilgenommen hat.
+Über Ausnahmen entscheidet der Prüfungsausschuss.
+(2) Zur Ermittlung der Durchschnittsnote werden die Noten der abgeschlossenen Lernfelder und Fächer entsprechend ihres Stundenumfangs gemäß der Stundentafel gewichtet.
+(3) Die Entscheidung über die Nichtzulassung zur Prüfung wird in der ersten Prüfungskonferenz nach § 18 getroffen und der Schülerin oder dem Schüler schriftlich mitgeteilt.
+§ 16 Festlegungen zur Prüfung
+(1) Spätestens zu Beginn des letzten Ausbildungshalbjahres legt die Senatorin oder der Senator für Kinder und Bildung auf Vorschlag der Schule fest, aus welchen vier Lernfeldern und Fächern sich der schriftliche und der praktische Teil der Prüfung zusammensetzen sollen. Schulen mit gleichem Bildungsgang einigen sich auf die gleichen vier Lernfelder und Fächer.
+(2) Die Entscheidungen über die Festlegungen zur Prüfung werden den Prüflingen unverzüglich zur Kenntnis gegeben.
+§ 17 Vornote
+Die Vornote wird auf Grundlage der Notenskala gemäß § 20 aus den in Prozentwerten beurteilten Leistungen im Bildungsgang in den Lernfeldern und Fächern nach § 13 Absatz 1 ermittelt. Sie ergibt sich aus den nach Stundenumfang gewichteten Prozentwerten der abgeschlossenen Lernfelder sowie dem jeweils letzten Prozentwert der abgeschlossenen Fächer des berufsübergreifenden Lernbereichs. Das Ergebnis wird auf eine Stelle nach dem Komma geschnitten.
+§ 18 Erste Prüfungskonferenz
+(1) Spätestens am dritten Unterrichtstag vor Beginn des ersten Prüfungsteils tritt der Prüfungsausschuss zur ersten Prüfungskonferenz zusammen.
+(2) In dieser Prüfungskonferenz beschließt der Prüfungsausschuss auf Vorschlag der Fachlehrerinnen und Fachlehrer die Vornote.
+(3) Auf der Grundlage der Zulassungsvoraussetzungen nach § 15 trifft der Prüfungsausschuss die Entscheidung über die Zulassung zur Prüfung.
+(4) Spätestens am zweiten Unterrichtstag vor Beginn des ersten Prüfungsteils wird dem Prüfling die Vornote mitgeteilt.
+§ 19 Durchführung der Prüfung
+(1) Die Prüfung erstreckt sich auf die nach den §§ 13 und 16 festgelegten Lernfeldern und Fächern. Die Gesamtdauer der Prüfung beträgt mindestens 12 Zeitstunden. Die Dauer der schriftlichen Prüfung beträgt mindestens acht Zeitstunden. Die Dauer der praktischen Prüfung beträgt mindestens vier Zeitstunden.
+(2) Die Schulleitung reicht bei der Senatorin oder dem Senator für Kinder und Bildung spätestens bis zum Ende des ersten Schulhalbjahres des zweiten Ausbildungsjahres zwei autorisierte Prüfungsvorschläge mit jeweils einem schriftlichen und einem praktischen Teil in einer zuvor abgesprochenen und gegen Missbrauch geschützten Form ein. Zu allen Aufgabenvorschlägen gehören die Angabe der Bearbeitungsdauer und eine genaue Beschreibung der vom Prüfling erwarteten Leistung (Erwartungshorizont) einschließlich der Angabe von Bewertungskriterien. Aus diesen Vorschlägen wählt die Senatorin oder der Senator für Kinder und Bildung einen Prüfungsvorschlag aus. Wenn der Senatorin oder dem Senator für Kinder und Bildung die Prüfungsvorschläge teilweise oder ganz änderungsbedürftig oder ungeeignet erscheinen, kann sie oder er neue Prüfungsvorschläge anfordern.
+(3) Die Vorbereitungen für die Durchführung der Prüfung sind so zu treffen, dass die Prüfungsaufgaben den Prüflingen nicht vor der Prüfung bekannt werden.
+(4) Die Zeit für die Bearbeitung der Prüfungsaufgaben beginnt unmittelbar, nachdem die Prüfungsaufgaben bekanntgegeben und beigefügte Texte gelesen worden sind.
+(5) Die Prüfung findet unter Aufsicht statt.
+(6) Die Prüfungsarbeiten werden vom Mitglied des Prüfungsausschusses nach § 12 Absatz 1 Nummer 3 als Referentin oder Referent beurteilt und benotet. Die Vorsitzende oder der Vorsitzende des Prüfungsausschusses bestellt für jeden Prüfungsteil eine weitere Fachlehrerin oder einen weiteren Fachlehrer als Korreferentin oder Korreferenten. Diese oder dieser beurteilt und benotet die Prüfungsarbeiten ebenfalls. Stimmen die erteilten Noten nicht überein, entscheidet der Prüfungsausschuss.
+§ 20 Noten
+(1) Alle nach dieser Verordnung zu erteilenden Noten richten sich nach der Notenskala der Zeugnisordnung und dem für berufliche Vollzeit-Bildungsgänge festgelegten Notenschlüssel:
+1
+2
+3
+4
+5
+6
+ab 85 Prozent
+ab 73 Prozent
+ab 59 Prozent
+ab 45 Prozent
+ab 27 Prozent
+unter 27 Prozent
+sehr gut
+gut
+befriedigend
+ausreichend
+mangelhaft
+ungenügend
+(2) Auf der Grundlage der Prozentwerte des Notenschlüssels werden die Vornoten, die Noten der Prüfung und die Endnoten gebildet.
+§ 21 Ergebnis des Prüfungsblocks
+(1) Der Prüfungsblock umfasst den schriftlichen und praktischen Teil der Prüfung nach § 10. Die Note des schriftlichen Prüfungsteils und die Note des praktischen Prüfungsteils fließen zu gleichen Anteilen in die Note des Prüfungsblocks ein.
+(2) Der Prüfungsblock ist nicht bestanden, wenn
+ 1. die Bewertung der Leistungen eines Prüfungsteils „ungenügend“ lautet oder
+ 2. die Bewertung der Leistungen in beiden Prüfungsteilen „mangelhaft“ lautet oder
+ 3. die Bewertung der Leistungen in der Prüfung in einem Prüfungsteil „mangelhaft“ lautet und ein Ausgleich für diesen Prüfungsteil nicht gegeben ist; ein Ausgleich ist nur gegeben, wenn die Bewertung im anderen Prüfungsteil mindestens „befriedigend“ lautet.
+In allen anderen Fällen ist die Prüfung in den Fächern des Prüfungsblocks bestanden.
+§ 22 Zweite Prüfungskonferenz, Ergebnis der Prüfung
+(1) Der Prüfungsausschuss beschließt in der zweiten Prüfungskonferenz die Note des Prüfungsblocks, die Endnote der Prüfung und das Ergebnis der Prüfung. Die Endnote der Prüfung ergibt sich aus den Prozentwerten der Vornote und den Prozentwerten der Note des Prüfungsblocks. Die Prozentwerte der Vornote werden mit zwei Dritteln und die Prozentwerte der Note des Prüfungsblocks mit einem Drittel gewichtet. Die Ermittlung der Endnoten erfolgt auf der Grundlage der nach § 20 in Prozentwerten beurteilten Leistungen.
+(2) Die Vorsitzende oder der Vorsitzende des Prüfungsausschusses gibt dem Prüfling im Anschluss an die zweite Prüfungskonferenz die Noten der einzelnen Prüfungsteile sowie das Ergebnis der Prüfung bekannt. Das Ergebnis der Prüfung lautet „bestanden“ oder „nicht bestanden“.
+(3) Hat der Prüfling die Prüfung bestanden, erhält er ein Abschlusszeugnis mit der Berechtigung, die Berufsbezeichnung
+ 1. Staatlich geprüfte Biologisch-technische Assistentin/Staatlich geprüfter Biologisch-technischer Assistent mit dem Schwerpunkt Biochemie
+ 2. Staatlich geprüfte Chemisch-technische Assistentin/Staatlich geprüfter Chemisch-technischer Assistent
+ 3. Staatlich geprüfte Gestaltungstechnische Assistentin/Staatlich geprüfter Gestaltungstechnischer Assistent mit dem Schwerpunkt Grafik
+ 4. Staatlich geprüfte Informationstechnische Assistentin/Staatlich geprüfter Informationstechnischer Assistent mit dem Schwerpunkt Informations- und Netzwerksystemtechnik
+ 5. Staatlich geprüfte Mathematisch-technische Assistentin/Staatlich geprüfter Mathematisch-technischer Assistent mit dem Schwerpunkt Künstliche Intelligenz und Wirtschaftsinformatik
+ 6. Staatlich geprüfte kaufmännische Assistentin/Staatlich geprüfter kaufmännischer Assistent mit dem Schwerpunkt Fremdsprachen
+ 7. Staatlich geprüfte kaufmännische Assistentin/Staatlich geprüfter kaufmännischer Assistent mit dem Schwerpunkt Informationsverarbeitung zu führen.
+Hat der Prüfling die Prüfung nicht bestanden und verlässt er die Schule, erhält er ein Abgangszeugnis. Form und Inhalt der Zeugnisse legt die Senatorin oder der Senator für Kinder und Bildung fest.
+§ 23 Wiederholung der Prüfung
+(1) Ein Prüfling, der die Prüfung nicht bestanden hat, kann sie einmal wiederholen. Die Senatorin oder der Senator für Kinder und Bildung kann auf Antrag eine zweite Wiederholung der Prüfung gestatten, wenn ihr Bestehen hinreichend wahrscheinlich ist.
+(2) Die Wiederholung findet im Rahmen der nächstfolgenden Prüfung statt. Bis zum Prüfungstermin nimmt die Schülerin oder der Schüler am Unterricht des letzten Ausbildungsjahres teil.
+§ 24 Täuschung und Behinderung
+(1) Versucht ein Prüfling, das Ergebnis der Prüfung durch Täuschung zu beeinflussen, so ist die gesamte Prüfung für nicht bestanden zu erklären. In leichteren Fällen ist die betroffene Teilleistung für nicht bestanden zu erklären und mit der Note „ungenügend“ zu bewerten.
+(2) Behindert ein Prüfling durch sein Verhalten die Prüfung so schwerwiegend, dass es nicht möglich ist, seine Prüfung oder die anderer Prüflinge ordnungsgemäß durchzuführen, so kann er von der weiteren Prüfung ausgeschlossen werden. Die gesamte Prüfung ist dann für nicht bestanden zu erklären.
+(3) Der Prüfling hat das Recht, solange weiter an der Prüfung teilzunehmen, bis der Prüfungsausschuss, der unverzüglich einzuberufen ist, die notwendigen Entscheidungen nach Absatz 1 oder 2 getroffen hat. Vor seiner Entscheidung hat der Prüfungsausschuss den Prüfling anzuhören.
+§ 25 Behinderung
+(1) Behindert ein Prüfling durch sein Verhalten einen Prüfungsteil so schwerwiegend, dass es den an der Prüfung Beteiligten nicht möglich ist, die Prüfung ordnungsgemäß durchzuführen, kann der Prüfling von der entsprechenden Teilprüfung ausgeschlossen werden.
+(2) Wurde ein Prüfling von der Teilprüfung ausgeschlossen, ist dies dem Prüfungsausschuss unverzüglich nach der Teilprüfung mitzuteilen. Der Prüfungsausschuss tritt schnellstmöglich, in jedem Fall aber vor der nächsten Teilprüfung, zusammen, um über die Behinderung zu beraten und zu entscheiden. Vor seiner Entscheidung hat der Prüfungsausschuss den Prüfling anzuhören.
+(3) Der Prüfungsausschuss entscheidet, ob der Prüfling die Prüfung so schwerwiegend behindert hat, dass er von der weiteren Prüfung ausgeschlossen und die gesamte Prüfung für nicht bestanden erklärt wird oder ob ausschließlich der Prüfungsteil für nicht bestanden erklärt wird, in dem die Behinderung stattgefunden hat. Stellt der Prüfungsausschuss keine Behinderung der Prüfung fest, bestimmt die Vorsitzende oder der Vorsitzende des Prüfungsausschusses einen neuen Termin für die Teilprüfung für den ausgeschlossenen Prüfling.
+§ 26 Versäumnis
+(1) Versäumt ein Prüfling eine Teilprüfung aus Gründen, die er nicht zu vertreten hat, ist unverzüglich ein Nachweis dafür zu erbringen. Die oder der Vorsitzende des Prüfungsausschusses entscheidet unverzüglich, ob das Versäumnis als entschuldigt gilt. Gilt das Versäumnis als entschuldigt, bestimmt die Vorsitzende oder der Vorsitzende des Prüfungsausschusses einen neuen Termin für die versäumte Teilprüfung.
+(2) Versäumt ein Prüfling aus von ihm zu vertretenden Gründen einen Prüfungstermin, entscheidet der Prüfungsausschuss über die Schwere des Versäumnisses. Der Prüfling ist vor der Entscheidung anzuhören. Trifft der Prüfungsausschuss die Entscheidung, dass es sich um einen leichteren Fall handelt, ist der entsprechende Prüfungsteil zu wiederholen. In allen anderen Fällen sind die deswegen nicht erbrachten Leistungen mit „ungenügend“ zu bewerten.
+(3) Versäumt ein Prüfling aus von ihm zu vertretenden Gründen mehr als einen Prüfungsteil, ist die gesamte Prüfung für nicht bestanden zu erklären.
+§ 27 Niederschriften
+(1) Über alle mit der Prüfung zusammenhängenden Beratungen und Prüfungsvorgänge werden Niederschriften angefertigt.
+(2) Die Niederschriften sind von der Protokollführerin oder vom Protokollführer und von der Vorsitzenden oder vom Vorsitzenden des Prüfungsausschusses oder des Teilprüfungsausschusses zu unterzeichnen.
+(3) Die Niederschrift über die Prüfung führt die aufsichtführende Lehrerin oder der aufsichtführende Lehrer. Sie soll insbesondere enthalten:
+ 1. den Sitzplan der Prüflinge,
+ 2. die Namen der aufsichtführenden Lehrerinnen und Lehrer und die jeweiligen Aufsichtszeiten,
+ 3. den Beginn der Aufgabenstellung und der Arbeitszeit,
+ 4. den letztmöglichen Zeitpunkt für die Abgabe der Arbeit,
+ 5. die Zeiten, zu denen einzelne Prüflinge den Raum verlassen und zurückkehren,
+ 6. die Zeiten, zu denen die Prüflinge ihre Arbeiten abgeben,
+ 7. Schülerinnen und Schüler mit Nachteilsausgleichen und deren Umfang,
+ 8. besondere Vorkommnisse.
+(4) Den Niederschriften ist eine Liste beizufügen, die die Vornote, die Note des Prüfungsblocks, die Endnote der Prüfung sowie das Ergebnis der Prüfung enthält.
+Teil 3 Schlussbestimmungen
+§ 28 Übergangsbestimmung
+Auf Bildungsgänge, die vor dem 1. August 2026 begonnen haben, ist die Verordnung über die Berufsfachschule für Assistentinnen und Assistenten in der bis zum 31. Juli 2026 geltenden Fassung weiter anzuwenden.
+§ 29 Inkrafttreten, Außerkrafttreten
+(1) Diese Verordnung tritt mit Wirkung vom 1. August 2026 in Kraft.
+(2) Gleichzeitig tritt die Verordnung über die Berufsfachschule für Assistenten vom 24. April 2019 (Brem.GBl. 2019, S. 297 - 223-o-5a) außer Kraft.
diff --git a/src/test/resources/sampledata/Bremen/BremGBl-2026-87_BerufsfachschulVO-AendVO.pdf b/src/test/resources/sampledata/Bremen/BremGBl-2026-87_BerufsfachschulVO-AendVO.pdf
new file mode 100644
index 0000000..7bf58d7
--- /dev/null
+++ b/src/test/resources/sampledata/Bremen/BremGBl-2026-87_BerufsfachschulVO-AendVO.pdf
Binary files differ
diff --git a/src/test/resources/sampledata/Bremen/SOURCES b/src/test/resources/sampledata/Bremen/SOURCES
new file mode 100644
index 0000000..e0425cc
--- /dev/null
+++ b/src/test/resources/sampledata/Bremen/SOURCES
@@ -0,0 +1,100 @@
+Beispieldaten Bremen — Herkunft und Aufbereitung
+================================================
+
+1. Änderungsdokument
+ BremGBl-2026-87_BerufsfachschulVO-AendVO.pdf
+ Gesetzblatt der Freien Hansestadt Bremen 2026 Nr. 87, verkündet am
+ 20. August 2026, S. 573: Änderung der Verordnung über die Berufsfachschule
+ für technische und kaufmännische Assistentinnen und Assistenten vom
+ 10. August 2026.
+ Bezogen über
+ https://www.gesetzblatt.bremen.de/fastmedia/218/2026_08_20_GBl_Nr_0087_signed.pdf
+ (abgerufen am 27.08.2026). Das Gesetzblatt liegt vollständig und ohne
+ Anmeldung unter https://www.gesetzblatt.bremen.de/; die Heftliste
+ (`?skip=<N>&max=100`) nennt zu jedem Heft einen Hinweistext, der das
+ geänderte Werk benennt. Das Heft trägt genau eine Verkündung.
+
+2. Stammfassung (vor der Änderung)
+ AssBerFSchulV-BR-alt.txt
+ Verordnung über die Berufsfachschule für Assistentinnen und Assistenten vom
+ 24. April 2019 (Brem.GBl. 2019, S. 297 – 223-o-5a), Gesamtausgabe in der
+ Gültigkeit vom 01.03.2019 bis 20.08.2026.
+ Entnommen dem Transparenzportal Bremen:
+ https://www.transparenz.bremen.de/sixcms/detail.php?gsid=bremen2014_tp.c.130920.de
+ &asl=bremen203_tpgesetz.c.55340.de&template=20_gp_ifg_meta_detail_d
+ (abgerufen am 27.08.2026).
+
+ Zum Portal: transparenz.bremen.de ist — nach BRAVORS (Brandenburg) und
+ recht.nrw.de — das dritte Landesportal, das einer Skriptabfrage gewöhnliches,
+ serverseitig gesetztes HTML liefert, und das erste außerhalb Brandenburgs,
+ das jede *frühere* Gesamtausgabe einzeln adressierbar führt. Der Weg dahin:
+ die Vorschrift über `…/metainformationen/<Titel-Slug>-<Id>?asl=…&template=
+ 20_gp_ifg_meta_detail_d` aufrufen, von dort die Schaltfläche „Frühere
+ Fassungen“ (`…&template=20_gp_ifg_meta_fassungen_d`); sie listet jede Fassung
+ mit ihrem Geltungszeitraum und einer eigenen `gsid`. Die Änderungshistorie
+ steht unter `…&template=20_gp_ifg_meta_historie_d`. Vor- und Nachfassung
+ stammen deshalb aus derselben Quelle.
+
+ Aufbereitung (Skript `clean_hb.py`, im Arbeitsverzeichnis der Welle): Der
+ Text steht je Einheit in einem `<div class="jgwsAiZDoc">`; `<h3>`/`<h4>` mit
+ `<br>` tragen Gliederung und Normkopf („Teil 1␣␣Ausbildung“, „§ 1␣␣Titel“),
+ `<p>` je Absatz, `<dl>/<dt>/<dd>` die Aufzählungen, die je Ebene um zwei
+ Stellen eingerückt werden. Der Kopf (Titel, Klammerzusatz mit der
+ juris-Abkürzung, Datumszeile, Fundstelle) ist von Hand gesetzt; die
+ Eingangsformel und das nichtamtliche Inhaltsverzeichnis des Portals sind
+ fortgelassen. Der Titel ist der *amtliche von 2019* — das Portal führt
+ Vorfassungen unter dem heutigen Namen, und der Einleitungssatz des Heftes
+ zitiert den alten.
+
+3. Nachfassung (nach der Änderung), nur als Prüfmaßstab
+ AssBerFSchulV-BR-neu.txt
+ Dieselbe Verordnung in der ab dem 21. August 2026 geltenden Fassung, aus der
+ aktuellen Gesamtausgabe desselben Portals
+ (https://www.transparenz.bremen.de/metainformationen/verordnung-ueber-die-
+ berufsfachschule-fuer-technische-und-kaufmaennische-assistentinnen-und-
+ assistenten-vom-24-april-2019-373512?asl=bremen203_tpgesetz.c.55340.de
+ &template=20_gp_ifg_meta_detail_d, Stand 27.08.2026), mit demselben Skript
+ aufbereitet.
+
+4. Was der Fall trägt
+ - Die Neufassung des *Namens* der Verordnung („Der Name der Verordnung wird
+ wie folgt gefasst“) — die Überschrift des Werkes selbst.
+ - Die bloße Aufzählungsmarke als ganze Stellenangabe („In e) wird das Wort …
+ ersetzt“, „f) wird gestrichen“) und die Marke mit Schlusspunkt („Nummer 1.
+ wird wie folgt gefasst“).
+ - „werden die Worte … durch die Worte … *geändert*“ statt „ersetzt“.
+ - Die Anfügung als „Absatz 1 wird am Ende *um Satz 2 ergänzt*“ — die
+ genannte Nummer bestimmt den Platz, nicht das Ende.
+ - Das *benannte* Satzzeichen: „das Satzzeichen „Punkt“ wird aufgehoben und
+ folgendes angefügt: „…““ — der Sache nach die Ersetzung des Schlusszeichens
+ durch den angefügten Wortlaut.
+ - Zwei nicht geschlossene Zitate in einem Abschnitt (Nummern 8 a und 13).
+ Beide zusammen sind der Prüfstein der Aufzählungs-Zitatgrenze: Sie muss
+ auch dann greifen, wenn der Rest des Abschnitts seinerseits noch ein Zitat
+ offen lässt.
+ - Der Kolumnentitel („Nr. 87 Gesetzblatt der Freien Hansestadt Bremen vom
+ 20. August 2026 574“) steht im Inhaltsstrom und klebt am Seitenumbruch
+ hinter dem letzten Satz der Vorseite.
+
+5. Benannte Abweichungen von der amtlichen Nachfassung
+ § 26 fehlt: Die Nummer 18 des Heftes verbindet eine Umnummerierung mit einer
+ Neufassung — „Der bisherige § 25 wird § 26 und wie folgt neu gefasst:“ —,
+ öffnet deren Zitat aber gar nicht erst; der neue Wortlaut steht ohne
+ Anführungszeichen da. Der Befehl bleibt darum unerkannt und § 26 ungesetzt.
+ Geraten wird nicht.
+ § 22: Die Nummer 15 f schreibt „Im letzten Satz werden hinter dem Wort
+ „Senatorin“ die Worte „oder der Senator“ eingefügt“. Sie nennt keinen
+ Absatz; § 22 hat deren drei, und jeder hat einen letzten Satz. Gemeint ist
+ ersichtlich der Absatz 3, von dem die Buchstaben b bis e handeln — der
+ Befehl selbst sagt es nicht, und der laufende Zusammenhang eines
+ Nachbarpunktes ist keine Stellenangabe. Die Auflösung meldet Mehrdeutigkeit.
+ § 29: Die Nummer 21 verteilt den neuen Wortlaut auf zwei Unterpunkte, die je
+ nur aus einem Zitat bestehen („a) „(1) …““, „b) „(2) …““), ohne dass diese
+ ein Verb trügen. Die Umnummerierung des bisherigen § 28 zu § 29 wird
+ vollzogen, die Neufassung nicht.
+
+ Nicht mitgeführt sind die *Anlagen* (Stundentafeln). Sie sind Tabellen, für
+ die der kanonische Klartext keine Form hat; und das Heft setzt an die Stelle
+ der einen Anlage der Vorfassung zwei neue, ohne dass ein Änderungsbefehl das
+ anordnete — ein Mangel der Vorlage, der sich nicht anwenden lässt. Beide
+ Klartextfassungen enden deshalb mit dem letzten Paragraphen.
diff --git a/src/test/resources/sampledata/Landesrecht-Beispiele.adoc b/src/test/resources/sampledata/Landesrecht-Beispiele.adoc
index 0a955ae..b699243 100644
--- a/src/test/resources/sampledata/Landesrecht-Beispiele.adoc
+++ b/src/test/resources/sampledata/Landesrecht-Beispiele.adoc
@@ -104,6 +104,18 @@ Kopfelement *vor* der Überschrift, die Aufzählungen sind echte `<ol>`-Listen,
Stilblatt erzeugt, und an ehemaligen Trennstellen führt das Portal vereinzelt *Steuerzeichen*
(U+0002) mit. Voller Akzeptanzfall (4/4 Befehle, alle 24 Normen).
+|Bremen
+|`Bremen/BremGBl-2026-87_BerufsfachschulVO-AendVO.pdf` — Brem.GBl. 2026 Nr. 87 vom 20.08.2026,
+S. 573 (Änderung der Verordnung über die Berufsfachschule für technische und kaufmännische
+Assistentinnen und Assistenten vom 10.08.2026)
+|Einspaltiges, sauberes Blatt; die Eigenheiten liegen in der *Befehlssprache*: die Neufassung des
+*Namens* der Verordnung, die bloße Aufzählungsmarke als Stellenangabe („In e) …“, „f) wird
+gestrichen“), die Marke mit Schlusspunkt („Nummer 1. wird wie folgt gefasst“), „durch die Worte …
+*geändert*“ statt „ersetzt“, die Anfügung „am Ende um Satz 2 ergänzt“ und das *benannte*
+Satzzeichen („das Satzzeichen „Punkt“ wird aufgehoben und folgendes angefügt“). Dazu *zwei* nicht
+geschlossene Zitate in einem Abschnitt. Voller Belegfall; Vor- *und* Nachfassung stammen aus
+demselben offenen Portal (`transparenz.bremen.de`, Schaltfläche „Frühere Fassungen“).
+
|Hamburg
|`Hamburg/HmbGVBl-2026-17_GutachterausschussVO-AendVO.pdf` — HmbGVBl. Teil I Nr. 17 vom
26.05.2026, S. 147 (Verordnung zur Änderung der Verordnung über den Gutachterausschuss für
@@ -190,6 +202,20 @@ bleiben nur Abweichungen, in denen die amtliche Nachfassung selbst vom Befehlswo
überzähliges Anführungszeichen aus dem Änderungsgesetz; § 93 LMG NRW: zusätzlich die Wörter
„Film (“ gestrichen) — ÄndGgner wendet dort den Wortlaut an. Damit ist das Heft GV. NRW. 7/2026
vollständig belegt.
+* *Bremen* ist umgesetzt (`EndToEndTest.berufsfachschulVOBremen`): 41 Befehle gelesen, 37
+ angewandt; 26 von 29 Normen gleichen der amtlichen Nachfassung, eine fehlt. Der Fall hat sechs
+ allgemeine Funde gebracht: Die *Aufzählungs-Zitatgrenze* darf nicht verlangen, dass der Rest des
+ Abschnitts ausbalanciert zurückbleibt — ein Abschnitt kann mehrere offene Zitate tragen, und
+ jedes ist an seiner eigenen Grenze zu schließen; sie prüft nunmehr, dass kein schließendes
+ Anführungszeichen ohne öffnendes zurückbleibt. Eine *unvollendet endende Neufassung*
+ (Doppelpunkt, Komma) meint den Vordersatz allein und lässt die Untergliederung stehen. Das
+ Zitat des *ersten* Satzes trägt die Absatzbezeichnung mit, die dem Absatz gehört und nicht dem
+ Satz. Ein *Platzhalter* „(weggefallen)“ hält nur Platz innerhalb desselben Blockes — die
+ Buchstaben einer anderen Nummer gehen ihn nichts an. Eine angefügte Einheit, die ihre *Nummer*
+ nennt, tritt an den genannten Platz und nicht ans Ende. Und ein Umbruch mitten im Satz ist
+ Satzspiegel: Endet die vorige Zeile auf ein Binde- oder Verhältniswort, so wird
+ zusammengezogen. Dazu ein aufgedeckter stiller Mangel: „*hinter* dem Wort“ war zwar im Muster
+ zugelassen, wurde aber nirgends geprüft — die Wörter traten vor den Anker statt dahinter.
* *Hamburg* ist umgesetzt (`EndToEndTest.gutachterausschussVOHamburg`): 21 Befehle gelesen,
17 angewandt; zehn von vierzehn Normen gleichen der amtlichen Nachfassung. Der Fall hat sechs
allgemeine Funde gebracht: die Dezimalgliederung der Befehle; die §-Teilung eines Heftes, das
@@ -309,7 +335,7 @@ Klartext-Zweig des Loaders normalisiert zur Sicherheit mit.
Baden-Württemberg jede Fassung datierbar ausgeben, fehlt dort. Ohne Vorfassung ist kein
Akzeptanzfall möglich, sondern nur die Prüfung bis zur Befehlserkennung. Ein Ausweg wäre, die
Vorfassung aus den *Einzelnormen* mit ihren Stichtagen zusammenzusetzen.
-* Bremen, Mecklenburg-Vorpommern, Saarland, Sachsen-Anhalt: noch nicht erfasst.
+* Mecklenburg-Vorpommern, Saarland, Sachsen-Anhalt: noch nicht erfasst.
== Wo weitermachen
@@ -320,8 +346,8 @@ gegen die amtliche Fassung, und `--neufassung` gibt die errechnete Fassung als k
Klartext aus. Ein weiteres Land kostet damit Stammfassung, Heft und Nachfassung — keinen eigenen
Prüfcode mehr. Nach absteigendem Nutzen:
-. *Weitere Länder erfassen* — Bremen, Mecklenburg-Vorpommern, Saarland, Sachsen-Anhalt. Die
- Beschaffungswege sind für alle vier geprüft (26.08.2026):
+. *Weitere Länder erfassen* — Mecklenburg-Vorpommern, Saarland, Sachsen-Anhalt (Bremen ist seit
+ Welle 25 erfasst). Die Beschaffungswege sind für alle geprüft (26./27.08.2026):
+
--
Mecklenburg-Vorpommern:: Das Gesetzblatt liegt *frei und skriptlesbar* unter
@@ -336,8 +362,15 @@ Hamburg: eine Vorschrift, die *genau einmal* geändert worden ist — dann ist d
Ursprungsfassung aus dem Gesetzblatt. Der geprüfte Fall (Gesetz zur Änderung der Landesbauordnung
M-V und des Architekten- und Ingenieurgesetzes, GVOBl. Nr. 16 vom 11.06.2026) taugt dafür nicht:
Beide Stammgesetze sind vielfach geändert.
-Bremen:: `transparenz.bremen.de` antwortet einer Skriptabfrage mit gewöhnlichem HTML (Status 200,
-44 kB) — das zweite offene Portal nach BRAVORS. Der Weg ist damit frei; er ist nur noch zu gehen.
+Bremen:: *Gegangen* (Welle 25). `transparenz.bremen.de` antwortet einer Skriptabfrage mit
+gewöhnlichem HTML und führt — als drittes offenes Portal nach BRAVORS und recht.nrw.de, und als
+erstes außerhalb Brandenburgs — jede *frühere* Gesamtausgabe einzeln adressierbar: Vorschrift über
+`…/metainformationen/<Slug>-<Id>?asl=…&template=20_gp_ifg_meta_detail_d`, von dort „Frühere
+Fassungen“ (`…&template=20_gp_ifg_meta_fassungen_d`) und „Änderungshistorie“
+(`…&template=20_gp_ifg_meta_historie_d`). Die Hefte des Gesetzblatts liegen unter
+`gesetzblatt.bremen.de/fastmedia/218/<JJJJ_MM_TT>_GBl_Nr_<NNNN>_signed.pdf`, die Heftliste
+(`gesetzblatt.bremen.de/?skip=<N>&max=100`) nennt zu jedem den geänderten Gegenstand. Siehe
+`Bremen/SOURCES`.
Saarland und Sachsen-Anhalt:: unverändert ohne Vorfassungen (siehe „Noch offen“); dort bleibt es
bei der Prüfung bis zur Befehlserkennung, es sei denn, die Einzelnormen mit ihren Stichtagen
tragen.
@@ -420,5 +453,6 @@ aller 52 Normen mit der amtlichen Nachfassung; für Schleswig-Holstein die volls
Stammgesetze; für Berlin die vollständige Anwendung des Artikels 2, fünf von sechs
Befehlen des Artikels 1 und die drei benannten Abweichungen von der Nachfassung; für
Baden-Württemberg einunddreißig von siebenunddreißig Befehlen und die zwei benannten
-Abweichungen. Wer eine dieser Zahlen
+Abweichungen; für Bremen einundvierzig gelesene und siebenunddreißig angewandte Befehle, die
+fehlende Norm und die zwei benannten Abweichungen. Wer eine dieser Zahlen
ändern muss, sollte den Grund im Test vermerken.