vehicles 0.4.0 → 0.6.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,672 @@
1
+ # plates/de.yml — Germany (PRD-PLATES gate L0 pilot).
2
+ #
3
+ # EVERY format, colour and class claim here comes from the consolidated
4
+ # Fahrzeug-Zulassungsverordnung (FZV) of 20 July 2023, BGBl. 2023 I Nr. 199,
5
+ # Textnachweis ab 1.9.2023, replacing FZV 2011 (V v. 3.2.2011 I 139), last
6
+ # amended by Art. 5 G v. 12.5.2026 (BGBl. 2026 I Nr. 142) — the Vollzitat as
7
+ # printed on gesetze-im-internet's own PDF front matter.
8
+ #
9
+ # THE THREE STRUCTURAL FACTS THAT SHAPE THIS FILE
10
+ #
11
+ # 1. THE DISTRICT CODES ARE NOT IN THE FZV. § 9 Abs. 3 FZV, verbatim: "Die
12
+ # Unterscheidungszeichen der Verwaltungsbezirke werden auf Antrag der Länder
13
+ # vom Bundesministerium für Verkehr festgelegt oder aufgehoben. ... Die
14
+ # Festlegung und Aufhebung der Unterscheidungszeichen ist vom
15
+ # Bundesministerium für Verkehr unverzüglich im Bundesanzeiger zu
16
+ # veröffentlichen." So the ~400-code district list is a BUNDESANZEIGER
17
+ # publication. It is therefore NOT authored here as 700 rows of guesswork:
18
+ # region_encoding points at a future _decode file and this file cites the
19
+ # MECHANISM. Anlage 2 FZV — which IS in the regulation — is inlined instead,
20
+ # because it is small, closed and primary.
21
+ # § 9 Abs. 3 also states the two rules a decode table must carry: a Land may
22
+ # apply for MORE THAN ONE code per district, and "Ein Kennzeichen, dessen
23
+ # Unterscheidungszeichen aufgehoben ist, darf bis zur Außerbetriebsetzung
24
+ # des betroffenen Fahrzeuges weitergeführt werden" — withdrawn codes stay on
25
+ # the road, so decode rows need period discipline, never deletion.
26
+ #
27
+ # 2. ANLAGE 1 IS THE SERIAL GRAMMAR, AND IT IS COMPLETE. Five shapes, verbatim,
28
+ # plus the letter rule: "Mit Ausnahme der Umlaute Ä, Ö und Ü können alle
29
+ # übrigen Buchstaben des Alphabets ... zugeteilt werden."
30
+ # a) A 1 – A 999 bis Z 1 – Z 999
31
+ # b) AA 1 – AA 99 bis ZZ 1 – ZZ 99
32
+ # c) AA 100 – AA 999 bis ZZ 100 – ZZ 999
33
+ # d) A 1000 – A 9999 bis Z 1000 – Z 9999
34
+ # e) AA 1000 – AA 9999 bis ZZ 1000 – ZZ 9999
35
+ # Union: 1–2 letters + 1–4 digits, with NO LEADING ZEROS (every block starts
36
+ # at 1, 100 or 1000). Combined with Anlage 4 Abschnitt 1 Nr. 4 — "Mehr als
37
+ # acht Stellen (Buchstaben des Unterscheidungszeichens sowie Buchstaben und
38
+ # Ziffern der Erkennungsnummer) auf einem Kennzeichen sind unzulässig" — the
39
+ # total is capped at eight positions, which the standard series' regex
40
+ # enforces with a negative lookahead (the only illegal combination the
41
+ # quantifiers alone would admit is 3 letters + 2 letters + 4 digits = 9).
42
+ #
43
+ # 3. PERIOD CLAIMS ARE INSTRUMENT-DATED, AND SAY SO. The German
44
+ # Unterscheidungszeichen + Erkennungsnummer system, and the Euro-Feld
45
+ # design, both predate the FZV 2023 by decades. NO PRIMARY for either origin
46
+ # date was secured in this pass (see the L0 report's gap list), so every
47
+ # entry carries `period_evidence: instrument-in-force` and a note saying in
48
+ # terms that the year is the date of the instrument that STATES the rule, not
49
+ # the date the series began. The two exceptions are dated from their own
50
+ # enabling statute: the E-Kennzeichen (Elektromobilitätsgesetz of
51
+ # 5 June 2015) and the moped insurance-plate colour cycle (anchored on the
52
+ # Verkehrsjahr the FZV names).
53
+ #
54
+ # REGEX POLICY: as in plates/nl.yml, `format.regex` is the lint-round-trippable
55
+ # regex and `format.regex_strict` (proposed schema addition) carries the
56
+ # tighter, sourced form — here, the no-leading-zeros rule from Anlage 1, which
57
+ # cannot go in `regex` because the lint generates "0" for a pattern "9".
58
+ jurisdiction: de
59
+ authority:
60
+ name: Fahrzeug-Zulassungsverordnung (FZV) — Bundesministerium für Digitales und Verkehr
61
+ url: "https://www.gesetze-im-internet.de/fzv_2023/"
62
+ binding: vehicle
63
+ instrument:
64
+ citation: "Fahrzeug-Zulassungsverordnung vom 20. Juli 2023 (BGBl. 2023 I Nr. 199, S. 2), zuletzt geändert durch Artikel 5 des Gesetzes vom 12. Mai 2026 (BGBl. 2026 I Nr. 142)"
65
+ # NOTE: quoted deliberately. scripts/lint_plates.rb calls
66
+ # YAML.safe_load_file(..., permitted_classes: []), so a BARE YAML date
67
+ # (2023-07-20) raises Psych::DisallowedClass and takes the whole lint run
68
+ # down with a backtrace rather than a LINT FAIL line. Every date-shaped
69
+ # value in the plates dataset must be a quoted string or an integer.
70
+ ausfertigungsdatum: "2023-07-20"
71
+ textnachweis_ab: "2023-09-01"
72
+ replaces: "FZV 2011 (V 9232-14 v. 3.2.2011 I 139)"
73
+ source: "https://www.gesetze-im-internet.de/fzv_2023/FZV.pdf # front matter: Ausfertigungsdatum, Vollzitat, Stand, 'Ersetzt V 9232-14 v. 3.2.2011 I 139 (FZV 2011)', 'Textnachweis ab: 1.9.2023'"
74
+
75
+ # ---------------------------------------------------------------------------
76
+ # Jurisdiction-wide facts, cited once.
77
+ # ---------------------------------------------------------------------------
78
+ common:
79
+ colours:
80
+ standard: "§ 12 Abs. 1 FZV, verbatim: 'Das Unterscheidungszeichen und die Erkennungsnummern sind mit schwarzer Schrift auf weißem schwarz gerandetem Grund auf ein Kennzeichenschild aufzubringen.' — black script on a white, black-bordered ground. This is the COLOUR SPEC; Anlage 4's drawings carry no separate RGB/RAL values for general plates."
81
+ source: "https://www.gesetze-im-internet.de/fzv_2023/__12.html # § 12 Abs. 1 (colours), Abs. 2 (reflective, DIN 74069 Oct 2022 Abschnitte 1-8, DIN test mark + register number), Abs. 5 (front and rear required; rear only for trailers, motorcycles and class L5e)"
82
+ dimensions:
83
+ single_line: { w: 520, h: 110, unit: mm, note: "Größtmaß" }
84
+ two_line: { w: 340, h: 200, unit: mm, note: "Größtmaß; 280 mm on two- and three-wheeled motor vehicles" }
85
+ motorcycle: { w_min: 180, w_max: 220, h: 200, unit: mm }
86
+ reduced_two_line: { w: 255, h: 130, unit: mm, note: "Leichtkrafträder and § 12 Abs. 6 Nr. 1 vehicles only" }
87
+ source: "https://www.gesetze-im-internet.de/fzv_2023/anlage_4.html # Anlage 4 Abschnitt 1 Nr. 1 a)-d), Fundstelle BGBl. 2023 I Nr. 199, S. 71-91"
88
+ font:
89
+ name: FE-Schrift (fälschungserschwerende Schrift)
90
+ statutory_basis: "Anlage 4 Abschnitt 1 Nr. 2.1: 'Die Beschriftung muss den Schriftmustern \"Schrift für Kfz-Kennzeichen\" entsprechen.' The Schriftmuster are obtainable from the Bundesanstalt für Straßen- und Verkehrswesen, Postfach 10 01 50, 51401 Bergisch Gladbach."
91
+ sizes: { mittelschrift: 75, engschrift: 75, verkleinerte_mittelschrift: 49, unit: mm, note: "verkleinerte Mittelschrift only for reduced two-line and motorcycle plates" }
92
+ alternate: "DIN 1451-2:1986-02 (Verkehrsschrift) for Bundeswehr plates and Versicherungskennzeichen"
93
+ licence: >-
94
+ NO LICENSABLE FONT IS MANDATED. The legal object is a statutory
95
+ Schriftmuster (a drawing), exactly as the EU dossier found for the UK and
96
+ Spain. Per PRD-PLATES §6 the render layer derives glyphs from the
97
+ statutory drawing, never from a third-party FE-Schrift TTF whose own
98
+ licence is unstated. Germany is additionally the affirmatively favourable
99
+ case (PD-VzKat / §5(1) UrhG: designs published inside statutory
100
+ instruments are public domain).
101
+ source: "https://www.gesetze-im-internet.de/fzv_2023/anlage_4.html # Anlage 4 Abschnitt 1 Nr. 2.1-2.3.2"
102
+ euro_band:
103
+ side: left
104
+ content: eu-stars+D
105
+ geometry: "Anlage 4 Abschnitt 1 Nr. 3: 'Der Durchmesser des Sternenkranzes entspricht dem Sechsfachen des Durchmessers des einzelnen Sterns.' A light edge of at most 2.0 mm is permitted between the Euro-Feld and the black border. 'Die Ausführung des Erkennungsbuchstabens \"D\" erfolgt nach der Verordnung (EG) Nr. 2411/98 vom 3. November 1998.'"
106
+ note: >-
107
+ This is the ONE hard piece of Euroband geometry secured anywhere in the L0
108
+ pass: a ratio (star-circle diameter = 6x single-star diameter), given as
109
+ text in German law. Reg. 2411/98's own annex is a bitmap and Spain's
110
+ Cuadro 5 is a drawing, so DE Anlage 4 Nr. 3 is the citable source for the
111
+ star wreath's proportions.
112
+ source: "https://www.gesetze-im-internet.de/fzv_2023/anlage_4.html # Anlage 4 Abschnitt 1 Nr. 3"
113
+ anlage1_grammar:
114
+ shapes:
115
+ - "a) A 1 – A 999 bis Z 1 – Z 999"
116
+ - "b) AA 1 – AA 99 bis ZZ 1 – ZZ 99"
117
+ - "c) AA 100 – AA 999 bis ZZ 100 – ZZ 999"
118
+ - "d) A 1000 – A 9999 bis Z 1000 – Z 9999"
119
+ - "e) AA 1000 – AA 9999 bis ZZ 1000 – ZZ 9999"
120
+ letters_excluded: ["Ä", "Ö", "Ü"]
121
+ no_leading_zeros: true
122
+ max_positions: 8
123
+ source: "https://www.gesetze-im-internet.de/fzv_2023/anlage_1.html # Anlage 1 (zu § 9 Absatz 1 Satz 4), Fundstelle BGBl. 2023 I Nr. 199, S. 67 — the five shapes and the umlaut exclusion, verbatim"
124
+
125
+ # Anlage 2 FZV — the SMALL, CLOSED, primary code table (contrast the district
126
+ # list, which is not in the FZV at all). Inlined per PRD-PLATES §2.4's
127
+ # "inline table (small) or a reference (large)" rule.
128
+ region_encoding_tables:
129
+ anlage2_federal_and_diplomatic:
130
+ source: "https://www.gesetze-im-internet.de/fzv_2023/anlage_2.html # Anlage 2 (zu § 9 Absatz 1 Satz 6), Fundstelle BGBl. 2023 I Nr. 199, S. 68-69"
131
+ bund:
132
+ BD: "Dienstfahrzeuge des Bundestages, Bundesrates, Bundespräsidialamtes, der Bundesregierung, Bundesministerien, Bundesfinanzverwaltung, des Bundesverfassungsgerichts und Bundeskriminalamtes"
133
+ BG: "Bundespolizei — noch gültig, wird nicht mehr zugeteilt (still valid, no longer assigned)"
134
+ BP: "Dienstfahrzeuge der Bundespolizei"
135
+ BW: "Bundes-Wasserstraßen- und Schifffahrtsverwaltung"
136
+ THW: "Bundesanstalt Technisches Hilfswerk"
137
+ Y: "Dienstfahrzeuge der Bundeswehr (Zentrale Militärkraftfahrtstelle, Mönchengladbach/Rheindahlen)"
138
+ X: "internationale militärische Hauptquartiere nach dem Nordatlantikvertrag mit Standort in Deutschland"
139
+ laender:
140
+ B: "Berlin — Senat und Abgeordnetenhaus"
141
+ BBL: "Brandenburg — Landesregierung, Landtag und Polizei"
142
+ BWL: "Baden-Württemberg — Landesregierung, Landtag und Polizei"
143
+ BYL: "Bayern — Landesregierung und Landtag"
144
+ HB: "Freie Hansestadt Bremen — Senat und Bürgerschaft"
145
+ HEL: "Hessen — Landesregierung und Landtag"
146
+ HH: "Freie und Hansestadt Hamburg — Senat und Bürgerschaft"
147
+ LSA: "Sachsen-Anhalt — Landesregierung, Landtag und Polizei"
148
+ LSN: "Sachsen — Landesregierung und Landtag"
149
+ MVL: "Mecklenburg-Vorpommern — Landesregierung (einschließlich Landespolizei) und Landtag"
150
+ NL: "Niedersachsen — Landesregierung und Landtag"
151
+ NRW: "Nordrhein-Westfalen — Landesregierung, Landtag und Polizei"
152
+ RPL: "Rheinland-Pfalz — Landesregierung, Landtag und Polizei"
153
+ SAL: "Saarland — Landesregierung, Landtag und Polizei"
154
+ SH: "Schleswig-Holstein — Landesregierung, Landtag und Polizei"
155
+ THL: "Thüringen — Landesregierung und Landtag"
156
+ diplomatic:
157
+ "0": "Diplomatische Vertretungen oder internationale Organisationen, abhängig vom Status der bevorrechtigten Person (Zulassungsbehörde Berlin/Bonn)"
158
+ B: "same, Berlin"
159
+ BN: "same, Bonn"
160
+ consular: "Berufskonsularische Vertretungen carry the UNTERSCHEIDUNGSZEICHEN OF THE DISTRICT WHERE THE CONSULATE SITS — i.e. an ordinary district code, which is why consular vehicles are not separable by prefix"
161
+ bundestag_president: { "1-1": "Dienstkraftwagen des Präsidenten des Deutschen Bundestages (Zulassungsbehörde Berlin)" }
162
+ note: >-
163
+ COLLISION WORTH FLAGGING: "B" is simultaneously a district code (Berlin),
164
+ a Land code (Berlin Senat/Abgeordnetenhaus) and a diplomatic code. "NL" is
165
+ the Niedersachsen Land code and also the Dutch international
166
+ distinguishing sign. Neither is resolvable from the prefix alone.
167
+
168
+ series:
169
+
170
+ # =========================================================================
171
+ # THE STANDARD SERIES.
172
+ # =========================================================================
173
+ - id: de-standard
174
+ class: standard
175
+ categories: [car, van, truck, bus, motorcycle, trailer]
176
+ period: { start: 2023 }
177
+ period_evidence: instrument-in-force
178
+ format:
179
+ pattern: "LL-LL 9999"
180
+ regex: '\A(?![A-Z]{3}-[A-Z]{2} ?\d{4}\z)[A-Z]{1,3}-[A-Z]{1,2} ?\d{1,4}\z'
181
+ regex_strict: '\A(?![A-Z]{3}-[A-Z]{2} ?\d{4}\z)[A-Z]{1,3}-[A-Z]{1,2} ?(?:[1-9]|[1-9]\d|[1-9]\d{2}|[1-9]\d{3})\z'
182
+ charset:
183
+ letters_excluded: ["Ä", "Ö", "Ü"]
184
+ notes: >-
185
+ Anlage 1 Nr. 1: every letter of the alphabet except the umlauts Ä, Ö and Ü
186
+ may be assigned in the Erkennungsnummer, singly or as a pair. The FZV
187
+ imposes no further letter exclusion on the Erkennungsnummer, but § 9 Abs. 1
188
+ Satz 3 forbids combinations that "gegen die guten Sitten verstoßen" — a
189
+ discretionary rule, not an enumerable exclusion list, and the reason no
190
+ profanity blacklist is authored here.
191
+ progression: >-
192
+ Anlage 1 Nr. 2 allocates the Erkennungsnummer in five blocks: a) 1 letter +
193
+ 1-999, b) 2 letters + 1-99, c) 2 letters + 100-999, d) 1 letter + 1000-9999,
194
+ e) 2 letters + 1000-9999. Every block starts at 1, 100 or 1000, so NO LEADING
195
+ ZEROS are ever issued — regex_strict enforces this; `regex` cannot, because
196
+ the lint's pattern generator emits "0" for a "9" placeholder.
197
+ max_positions: 8
198
+ max_positions_note: >-
199
+ Anlage 4 Abschnitt 1 Nr. 4: at most eight positions counting the
200
+ Unterscheidungszeichen's letters plus the Erkennungsnummer's letters and
201
+ digits. The negative lookahead in both regexes excludes the single
202
+ over-length shape the quantifiers would otherwise admit (3 + 2 + 4 = 9).
203
+ separator_note: >-
204
+ The gap between Unterscheidungszeichen and Erkennungsnummer is physically
205
+ occupied by the two Plaketten (Stempelplakette + HU badge), not by a printed
206
+ separator. The hyphen and space in the pattern are the conventional textual
207
+ rendering; both regexes accept the space as optional.
208
+ design:
209
+ plate: { w: 520, h: 110, unit: mm }
210
+ plate_variants:
211
+ - { w: 340, h: 200, unit: mm, note: "zweizeilig; 280 mm wide on two- and three-wheeled motor vehicles" }
212
+ - { w_min: 180, w_max: 220, h: 200, unit: mm, note: "Kraftradkennzeichen" }
213
+ - { w: 255, h: 130, unit: mm, note: "verkleinertes zweizeiliges Kennzeichen — Leichtkrafträder and § 12 Abs. 6 Nr. 1 vehicles only, or by exception where a compliant rear plate cannot be fitted" }
214
+ background: { color: "#FFFFFF", finish: retroreflective, hex_basis: spec, spec_note: "§ 12 Abs. 1 FZV: weißer Grund; retroreflection per DIN 74069 Oct 2022 (§ 12 Abs. 2)" }
215
+ foreground: "#000000"
216
+ border: { color: "#000000", note: "Anlage 4 permits black, GREEN or RED borders depending on plate type" }
217
+ band: { side: left, color: "#003399", content: eu-stars+D, hex_basis: observed, note: "the FZV states the star-wreath ratio and cross-references Reg. 2411/98 for the 'D', but gives no RGB/RAL for the blue field" }
218
+ emblem: { present: true, rendered: placeholder, note: "the Stempelplakette carries the FARBIGES WAPPEN DES LANDES (§ 12 Abs. 3) — a coat of arms per Land. PRD-PLATES §3 placeholder rule applies: 16 Land arms, none licence-cleared." }
219
+ seal: { name: Stempelplakette, diameter_mm: null, content: "coloured Land arms, Land name, registration authority name, unique Druckstücknummer, and a CONCEALED security code that can only be revealed irreversibly; self-destroying on removal", source_note: "§ 12 Abs. 3 FZV + Anlage 5" }
220
+ rear_differs: false
221
+ display: "front and rear on motor vehicles; rear only on trailers, motorcycles and class L5e vehicles; front only on single-axle tractors (§ 12 Abs. 5 FZV)"
222
+ region_encoding: "plates/_decode/de-districts.yml"
223
+ region_encoding_mechanism: >-
224
+ The Unterscheidungszeichen is 1-3 letters identifying the Verwaltungsbezirk of
225
+ registration (§ 9 Abs. 1 Nr. 1). The list is set by the BMDV on application by
226
+ the Länder and published in the BUNDESANZEIGER (§ 9 Abs. 3) — NOT in the FZV
227
+ and NOT by the KBA. A district may hold more than one code, applied for when
228
+ "ohne dieses ein Verbrauch der verfügbaren Kennzeichenkombinationen unmittelbar
229
+ bevorsteht". A withdrawn code may be carried until the vehicle is
230
+ deregistered, so decode rows close by period and are never deleted. The split
231
+ point between prefix and Erkennungsnummer is UNAMBIGUOUS because Anlage 1 fixes
232
+ the Erkennungsnummer to 1-2 letters + 1-4 digits.
233
+ variants:
234
+ - class: standard
235
+ note: >-
236
+ WECHSELKENNZEICHEN (interchangeable plate, § 9 Abs. 2 FZV + Anlage 4
237
+ Abschnitt 2a). Two vehicles of the same class (M1, L or O1) held by one
238
+ keeper share a common plate part plus a per-vehicle part; the common part
239
+ carries a "W" (20 mm high, 25 mm wide) above the Stempelplakette, and the
240
+ per-vehicle part is the LAST DIGIT of the Erkennungsnummer. Same eight-
241
+ position cap across both parts, excluding the "W". Cannot be combined with
242
+ Saison-, rote, Kurzzeit- or Ausfuhrkennzeichen. Recorded as a variant, not
243
+ a series, because the serial grammar is Anlage 1's — but note that a parse
244
+ API sees a SPLIT STRING, which the single-`pattern` schema cannot express.
245
+ sources:
246
+ - "https://www.gesetze-im-internet.de/fzv_2023/__9.html # § 9 Abs. 2: eligibility (classes M1/L/O1, same keeper, same plate size), the common/vehicle-specific split, the one-at-a-time rule"
247
+ - "https://www.gesetze-im-internet.de/fzv_2023/anlage_4.html # Anlage 4 Abschnitt 2a: the 'W' marking 20 x 25 mm, self-destroying security foil on the vehicle-specific part"
248
+ sources:
249
+ - "https://www.gesetze-im-internet.de/fzv_2023/__9.html # § 9 Abs. 1: Kennzeichen = Unterscheidungszeichen (1-3 letters for the Verwaltungsbezirk) + vehicle-specific Erkennungsnummer allocated per Anlage 1; Abs. 3: BMDV/Bundesanzeiger"
250
+ - "https://www.gesetze-im-internet.de/fzv_2023/anlage_1.html # Anlage 1: the five Erkennungsnummer shapes and the umlaut exclusion, verbatim"
251
+ - "https://www.gesetze-im-internet.de/fzv_2023/__12.html # § 12 Abs. 1: black on white, black-bordered; Abs. 2: reflective + DIN 74069; Abs. 5: front/rear rules"
252
+ - "https://www.gesetze-im-internet.de/fzv_2023/anlage_4.html # Anlage 4 Abschnitt 1: dimensions, FE-Schrift, Euro-Feld, the eight-position cap; Abschnitt 2: the general plates"
253
+ notes: >-
254
+ THE GERMAN STANDARD SERIES — the strongest region signal in the L0 pilot and
255
+ the only one of the four pilot jurisdictions whose plate names its place of
256
+ registration. PERIOD CAVEAT, stated plainly: 2023 is the date of the FZV that
257
+ STATES this format, not the date the system began. The
258
+ Unterscheidungszeichen + Erkennungsnummer system and the Euro-Feld design both
259
+ long predate it (FZV 2011 before, StVZO before that); no primary for either
260
+ origin date was secured, and inventing one was declined. No age is encoded on a
261
+ German plate at all — unlike the UK, a German plate string carries region but
262
+ never date.
263
+
264
+ # =========================================================================
265
+ # HISTORIC — H suffix.
266
+ # =========================================================================
267
+ - id: de-historic-h
268
+ class: historic
269
+ categories: [car, van, truck, bus, motorcycle, trailer]
270
+ period: { start: 2023 }
271
+ period_evidence: instrument-in-force
272
+ format:
273
+ pattern: "LL-LL 999H"
274
+ regex: '\A[A-Z]{1,3}-[A-Z]{1,2} ?\d{1,4}H\z'
275
+ regex_strict: '\A(?![A-Z]{3}-[A-Z]{2} ?\d{3,4}H\z)[A-Z]{1,3}-[A-Z]{1,2} ?(?:[1-9]|[1-9]\d|[1-9]\d{2}|[1-9]\d{3})H\z'
276
+ suffix: H
277
+ max_positions: 7
278
+ max_positions_note: >-
279
+ Anlage 4 Abschnitt 4 Nr. 4 caps a SINGLE-LINE Oldtimerkennzeichen at seven
280
+ positions EXCLUDING the H (and the Erkennungsnummer at five positions on a
281
+ 340 mm two-line plate, four on a 280 mm two-line or motorcycle plate) — one
282
+ position tighter than the standard series, because the H itself consumes room.
283
+ regex_strict's lookahead removes the shapes that exceed seven.
284
+ charset: { notes: "Anlage 1 grammar unchanged; § 10 Abs. 1 adds the H" }
285
+ design:
286
+ plate: { w: 520, h: 110, unit: mm }
287
+ background: { color: "#FFFFFF", finish: retroreflective, hex_basis: spec }
288
+ foreground: "#000000"
289
+ band: { side: left, color: "#003399", content: eu-stars+D }
290
+ note: "'Der Kennbuchstabe \"H\" ist der Erkennungsnummer ohne Leerzeichen in gleicher Schriftart anzufügen' — no space, same typeface (Anlage 4 Abschnitt 4 Nr. 4)"
291
+ region_encoding: "plates/_decode/de-districts.yml"
292
+ sources:
293
+ - "https://www.gesetze-im-internet.de/fzv_2023/__10.html # § 10 Abs. 1: on application, a vehicle with a § 23 StVZO Gutachten is ASSIGNED an Oldtimerkennzeichen; it consists of Unterscheidungszeichen + Erkennungsnummer per § 9 Abs. 1 plus 'den Kennbuchstaben \"H\" als amtlichen Zusatz hinter der Erkennungsnummer'"
294
+ - "https://www.gesetze-im-internet.de/fzv_2023/anlage_4.html # Anlage 4 Abschnitt 4: the H suffix's typographic rule and the seven/five/four-position caps"
295
+ notes: >-
296
+ H-KENNZEICHEN. Note § 10 Abs. 1's discretion, which a claims model should
297
+ record: the authority "kann im Einzelfall" count periods before first placing
298
+ on the market during which the vehicle operated off public roads towards the
299
+ minimum age in § 2 Satz 1 Nr. 22 FZV. The 30-year threshold itself lives in
300
+ that definition and in § 23 StVZO, neither of which was fetched in this pass —
301
+ the threshold is therefore a recorded gap, and the widely-repeated "30 years"
302
+ is NOT asserted here as sourced. An H plate may also be a Saisonkennzeichen
303
+ (Anlage 4 Abschnitt 4 Nr. 4 last sentence) or a Wechselkennzeichen.
304
+
305
+ # =========================================================================
306
+ # ELECTRIC — E suffix. The one German series with a properly dated start.
307
+ # =========================================================================
308
+ - id: de-electric-e
309
+ class: electric
310
+ categories: [car, van, truck, bus, motorcycle]
311
+ period: { start: 2015 }
312
+ period_evidence: enabling-statute
313
+ format:
314
+ pattern: "LL-LL 999E"
315
+ regex: '\A[A-Z]{1,3}-[A-Z]{1,2} ?\d{1,4}E\z'
316
+ regex_strict: '\A(?![A-Z]{3}-[A-Z]{2} ?\d{3,4}E\z)[A-Z]{1,3}-[A-Z]{1,2} ?(?:[1-9]|[1-9]\d|[1-9]\d{2}|[1-9]\d{3})E\z'
317
+ suffix: E
318
+ max_positions: 7
319
+ max_positions_note: "Anlage 4 Abschnitt 5a Nr. 1 executes E-Kennzeichen 'entsprechend Abschnitt 4' (the Oldtimer rules), so the seven-position single-line cap carries over; Nr. 6 gives the tighter two-line caps (six positions on a single-line Saison variant, five on a 340 mm two-line, four on 280 mm/motorcycle/reduced)."
320
+ design:
321
+ plate: { w: 520, h: 110, unit: mm }
322
+ background: { color: "#FFFFFF", finish: retroreflective, hex_basis: spec }
323
+ foreground: "#000000"
324
+ band: { side: left, color: "#003399", content: eu-stars+D }
325
+ note: "'Der Kennbuchstabe \"E\" ist der Erkennungsnummer ohne Leerzeichen in gleicher Schriftart anzufügen' (Anlage 4 Abschnitt 5a Nr. 6)"
326
+ foreign_vehicle_badge:
327
+ shape: circular
328
+ diameter_mm: 80
329
+ colour: "RAL 5017"
330
+ note: >-
331
+ For an electric vehicle admitted to traffic under ANOTHER state's rules, the
332
+ marking is a BADGE per Anlage 3 affixed visibly at the rear, not a plate
333
+ suffix; the issuing office writes the vehicle's registration into the
334
+ badge's window in lightfast script. Anlage 3 giving a hard RAL value is
335
+ unusual — most EU plate law specifies drawings, not colour codes.
336
+ source: "https://www.gesetze-im-internet.de/fzv_2023/anlage_3.html # Anlage 3 (zu § 11 Absatz 4): Plakettenmuster, 80 mm diameter, RAL 5017"
337
+ region_encoding: "plates/_decode/de-districts.yml"
338
+ sources:
339
+ - "https://www.gesetze-im-internet.de/emog/EmoG.pdf # Elektromobilitätsgesetz, Ausfertigungsdatum 05.06.2015 (BGBl. I S. 898) — the enabling statute § 11 FZV keys off; note § 8 Abs. 2: the Act EXPIRES at the end of 31.12.2026"
340
+ - "https://www.gesetze-im-internet.de/fzv_2023/__11.html # § 11 Abs. 1-2: an E-Kennzeichen is the § 9 Abs. 1 plate (optionally also a green or seasonal one) with 'den Kennbuchstaben \"E\" als amtlichen Zusatz hinter der Erkennungsnummer'; Abs. 4: the Anlage 3 badge route for foreign vehicles; Abs. 5: foreign E-markings are recognised as equivalent"
341
+ - "https://www.gesetze-im-internet.de/fzv_2023/anlage_4.html # Anlage 4 Abschnitt 5a: E-Kennzeichen executed per Abschnitt 4, plus the Saison variants and position caps"
342
+ notes: >-
343
+ E-KENNZEICHEN. period.start 2015 is a REAL start, not an instrument date: the
344
+ Elektromobilitätsgesetz of 5 June 2015 created the eligibility § 11 FZV
345
+ implements, so 2015 is the earliest possible issuance year. TIME BOMB WORTH
346
+ RECORDING NOW: EmoG § 8 Abs. 2 provides that the Act ceases to be in force at
347
+ the end of 31 December 2026 — inside the current audit horizon. Unless it is
348
+ extended, this series' `period.end` becomes 2026 and the quarterly audit should
349
+ re-check it. Also note § 79 Abs. 9 FZV carries a non-application footnote
350
+ against § 11 which was not resolved in this pass (recorded gap).
351
+
352
+ # =========================================================================
353
+ # SEASONAL.
354
+ # =========================================================================
355
+ - id: de-seasonal
356
+ class: seasonal
357
+ categories: [car, van, truck, bus, motorcycle, trailer]
358
+ period: { start: 2023 }
359
+ period_evidence: instrument-in-force
360
+ format:
361
+ pattern: "LL-LL 999"
362
+ regex: '\A[A-Z]{1,3}-[A-Z]{1,2} ?\d{1,4}\z'
363
+ regex_strict: '\A(?![A-Z]{3}-[A-Z]{2} ?\d{3,4}\z)[A-Z]{1,3}-[A-Z]{1,2} ?(?:[1-9]|[1-9]\d|[1-9]\d{2}|[1-9]\d{3})\z'
364
+ max_positions: 7
365
+ max_positions_note: "Anlage 4 Abschnitt 5 Nr. 4: seven positions on a single-line plate, five in the Erkennungsnummer on two-line/motorcycle/reduced plates"
366
+ fields_note: >-
367
+ THE OPERATING PERIOD IS A FIELD, NOT PART OF THE SERIAL. Anlage 4 Abschnitt 5
368
+ Nr. 4: in the Betriebszeitraum field, "die Zahl über dem Bindestrich" is the
369
+ start month and "die Zahl unter dem Bindestrich" the end month, set in
370
+ DIN 1451-2:1986-02. A single `pattern` string cannot carry a stacked
371
+ two-number field — this is the same schema pressure PRD-PLATES §2.2 records
372
+ for Japan, arriving in Germany.
373
+ design:
374
+ plate: { w: 520, h: 110, unit: mm }
375
+ background: { color: "#FFFFFF", finish: retroreflective, hex_basis: spec }
376
+ foreground: "#000000"
377
+ band: { side: left, color: "#003399", content: eu-stars+D }
378
+ extra_field: { position: right, content: "start month over end month, separated by a hyphen", typeface: "DIN 1451-2:1986-02" }
379
+ validity:
380
+ min_months: 2
381
+ max_months: 11
382
+ note: >-
383
+ "Der Betriebszeitraum ist auf volle Monate zu bemessen. Der Betriebszeitraum
384
+ muss mindestens zwei Monate und darf höchstens elf Monate umfassen"
385
+ (§ 10 Abs. 3). Outside the period the vehicle may neither be operated NOR
386
+ PARKED on public roads. Trips to deregister, and return trips after the seal
387
+ is removed, count as unstamped plates under § 12 Abs. 4.
388
+ region_encoding: "plates/_decode/de-districts.yml"
389
+ sources:
390
+ - "https://www.gesetze-im-internet.de/fzv_2023/__10.html # § 10 Abs. 3: Saisonkennzeichen on application; Betriebszeitraum as an amtlicher Zusatz behind the Erkennungsnummer; full months, 2-11 months; green plates may also be seasonal; the operate-and-park prohibition"
391
+ - "https://www.gesetze-im-internet.de/fzv_2023/anlage_4.html # Anlage 4 Abschnitt 5: the four seasonal plate forms and the month-field rule"
392
+ notes: >-
393
+ SAISONKENNZEICHEN. Its own series rather than a variant because the DESIGN
394
+ differs (an added operating-period field) while the serial grammar does not —
395
+ the PRD-PLATES §2.3 test resolves cleanly. It composes with other classes:
396
+ green plates (§ 10 Abs. 2), Oldtimerkennzeichen and E-Kennzeichen can all be
397
+ issued AS seasonal plates, which means class is genuinely multi-valued here and
398
+ the single-`class` schema cannot express the combination.
399
+
400
+ # =========================================================================
401
+ # GREEN — TAX-EXEMPT. Green lettering on white, and the class vocabulary has
402
+ # no home for it.
403
+ # =========================================================================
404
+ - id: de-green-taxexempt
405
+ class: agricultural
406
+ categories: [tractor, machine, trailer, truck]
407
+ period: { start: 2023 }
408
+ period_evidence: instrument-in-force
409
+ format:
410
+ pattern: "LL-LL 9999"
411
+ regex: '\A(?![A-Z]{3}-[A-Z]{2} ?\d{4}\z)[A-Z]{1,3}-[A-Z]{1,2} ?\d{1,4}\z'
412
+ regex_strict: '\A(?![A-Z]{3}-[A-Z]{2} ?\d{4}\z)[A-Z]{1,3}-[A-Z]{1,2} ?(?:[1-9]|[1-9]\d|[1-9]\d{2}|[1-9]\d{3})\z'
413
+ design:
414
+ plate: { w: 520, h: 110, unit: mm }
415
+ background: { color: "#FFFFFF", finish: retroreflective, hex_basis: spec }
416
+ foreground: "#008000"
417
+ foreground_note: "§ 10 Abs. 2 FZV, verbatim: 'ein Kennzeichen mit grüner Beschriftung auf weißem Grund (grünes Kennzeichen)'. The statute names the colour GREEN without an RAL or RGB value, so the hex is observed within a named colour."
418
+ border: { color: "#008000", note: "Anlage 4 Abschnitt 1 Nr. 2.1 contemplates black, GREEN or red borders; the green plate takes the green one" }
419
+ band: { side: left, color: "#003399", content: eu-stars+D }
420
+ region_encoding: "plates/_decode/de-districts.yml"
421
+ sources:
422
+ - "https://www.gesetze-im-internet.de/fzv_2023/__10.html # § 10 Abs. 2: green lettering on white for vehicles whose keeper is exempt from motor-vehicle tax, with the seven-item exclusion list, plus the trailer special rule under § 10 KraftStG"
423
+ notes: >-
424
+ GRÜNES KENNZEICHEN. CLASS CAVEAT, and it is a real one: the legal criterion is
425
+ not agriculture at all — it is that "der Halter von der Kraftfahrzeugsteuer
426
+ befreit ist". _meta/classes.yml has no tax-exempt class, so `agricultural` is
427
+ recorded as the closest fit and the dominant population, but the statute's own
428
+ exclusion list shows how much wider the category is: authority vehicles,
429
+ diplomatic and consular staff vehicles, buses and 8-9-seat cars mainly in
430
+ scheduled service and their trailers, Leichtkrafträder and Kleinkrafträder,
431
+ vehicles of severely disabled persons under § 3a KraftStG, particularly
432
+ low-emission vehicles, and any vehicle on a Wechselkennzeichen are all EXCLUDED
433
+ from the green plate. Flagged as a vocabulary gap in the L0 report.
434
+
435
+ # =========================================================================
436
+ # DEALER — rote Kennzeichen, digits-only beginning 06.
437
+ # =========================================================================
438
+ - id: de-dealer-red
439
+ class: dealer
440
+ categories: [car, van, truck, bus, motorcycle, trailer]
441
+ period: { start: 2023 }
442
+ period_evidence: instrument-in-force
443
+ format:
444
+ pattern: "LL-06999"
445
+ regex: '\A[A-Z]{1,3}-06\d{1,4}\z'
446
+ charset: { notes: "the Erkennungsnummer is DIGITS ONLY and begins with 06 — no letters at all, so Anlage 1's letter blocks do not apply" }
447
+ max_positions_note: "the eight-position cap of Anlage 4 Abschnitt 1 Nr. 4 still applies, so a three-letter district code limits the digit tail; the regex quantifies width and the cap is recorded here rather than encoded, because the interaction is not stated in a single provision"
448
+ design:
449
+ plate: { w: 520, h: 110, unit: mm }
450
+ background: { color: "#FFFFFF", finish: retroreflective, hex_basis: spec }
451
+ foreground: "#FF0000"
452
+ foreground_note: "§ 41 Abs. 1 Nr. 2 FZV, verbatim: 'ein Kennzeichen mit roter Beschriftung auf weißem rot gerandetem Grund (rotes Kennzeichen)'. Colour named, not numbered."
453
+ border: { color: "#FF0000" }
454
+ band: { side: left, color: "#003399", content: eu-stars+D }
455
+ note: "Anlage 4 Abschnitt 7: executed as the general plates but in red script with a red border; the § 29 StVZO roadworthiness badge is NOT applied"
456
+ binding: business
457
+ sources:
458
+ - "https://www.gesetze-im-internet.de/fzv_2023/__41.html # § 41: Prüfungs-, Probe- und Überführungsfahrten; Abs. 1 the red-on-white colour rule; Abs. 2 assignment to trustworthy manufacturers, parts makers, workshops, dealers and trailer makers (plus THW, Bundespolizei, BKA, Länder police, Bundeswehr, customs) for REPEATED use on DIFFERENT vehicles, and 'einer nur aus Ziffern bestehenden und mit \"06\" beginnenden Erkennungsnummer'; Abs. 3 the per-trip Fahrzeugscheinheft log, kept one year"
459
+ - "https://www.gesetze-im-internet.de/fzv_2023/anlage_4.html # Anlage 4 Abschnitt 7: red script and red border; Anlage 13 is the Fahrzeugscheinheft"
460
+ notes: >-
461
+ ROTE KENNZEICHEN — the German dealer/trade plate, and the cleanest "06"
462
+ identification in the dataset. BINDING NOTE: like Swiss plates but for a
463
+ different reason, this plate does NOT bind to a vehicle — it binds to a
464
+ BUSINESS and moves between vehicles, which is why `binding: business` is set on
465
+ the series and why a vehicle-keyed consumer must not join on it. § 41 Abs. 3
466
+ requires a written per-trip record (plate, date, start and end, driver and
467
+ address, vehicle class, make, VIN and route), retained for a year — the
468
+ compensating audit trail for an untethered plate.
469
+
470
+ - id: de-oldtimer-red
471
+ class: dealer
472
+ categories: [car, van, truck, bus, motorcycle]
473
+ period: { start: 2023 }
474
+ period_evidence: instrument-in-force
475
+ format:
476
+ pattern: "LL-07999"
477
+ regex: '\A[A-Z]{1,3}-07\d{1,4}\z'
478
+ charset: { notes: "digits only, beginning 07" }
479
+ design:
480
+ plate: { w: 520, h: 110, unit: mm }
481
+ background: { color: "#FFFFFF", finish: retroreflective, hex_basis: spec }
482
+ foreground: "#FF0000"
483
+ border: { color: "#FF0000" }
484
+ band: { side: left, color: "#003399", content: eu-stars+D }
485
+ sources:
486
+ - "https://www.gesetze-im-internet.de/fzv_2023/__43.html # § 43: trips to and from Oldtimer events need neither Betriebserlaubnis nor Zulassung if the vehicle carries a rotes Oldtimerkennzeichen; Abs. 2 applies § 41 Abs. 2-6 and requires 'einer nur aus Ziffern bestehenden und mit den Ziffern \"07\" beginnenden Erkennungsnummer', with the Anlage 15 Fahrzeugscheinheft"
487
+ notes: >-
488
+ ROTES OLDTIMERKENNZEICHEN — the 07 series. Distinguished from the 06 dealer
489
+ plate by two digits and by one crucial restriction: § 43 Abs. 2 provides that
490
+ this plate "nur an dem Fahrzeug verwendet werden darf, für das es ausgegeben
491
+ wurde", so unlike the 06 plate it is NOT freely transferable between vehicles.
492
+ CLASS CAVEAT: recorded as `dealer` because it shares § 41's machinery, but it
493
+ is functionally a historic-vehicle event plate; a class vocabulary with a
494
+ `historic` and a `dealer` value cannot express "both".
495
+
496
+ # =========================================================================
497
+ # SHORT-TERM AND EXPORT — the two date-bearing German plates.
498
+ # =========================================================================
499
+ - id: de-shortterm
500
+ class: temporary
501
+ categories: [car, van, truck, bus, motorcycle, trailer]
502
+ period: { start: 2023 }
503
+ period_evidence: instrument-in-force
504
+ format:
505
+ pattern: "LL-03999"
506
+ regex: '\A[A-Z]{1,3}-0[34]\d{1,4}\z'
507
+ charset: { notes: "digits only, beginning '03' OR '04' — the pattern shows 03 as a representative literal and the regex carries both" }
508
+ fields_note: "the plate additionally bears an EXPIRY DATE as a stacked three-number field (day over month over year), which a single pattern string cannot express"
509
+ design:
510
+ plate: { w: 520, h: 110, unit: mm }
511
+ background: { color: "#FFFFFF", finish: retroreflective, hex_basis: spec }
512
+ foreground: "#000000"
513
+ band: { side: left, color: "#003399", content: eu-stars+D }
514
+ extra_field:
515
+ position: right
516
+ content: "day over month over year of expiry"
517
+ background: { color: "#FFFF00" }
518
+ foreground: "#000000"
519
+ note: "Anlage 4 Abschnitt 6 Nr. 4: 'Die Farbe dieses Feldes ist gelb mit schwarzer Beschriftung'; digits in DIN 1451-2:1986-02"
520
+ seal: { diameter_mm: 35, background: "blue per DIN 6171 (blau – Euro-Feld)", note: "Anlage 4 Abschnitt 6 Nr. 4: a 35 mm Stempelplakette with the authority's Dienststempel on a BLUE ground, positioned between prefix and Erkennungsnummer (single-line) or top-left beside the prefix (two-line); the § 29 StVZO badge is not applied" }
521
+ validity: { days: 5, note: "§ 42 Abs. 4: the expiry date is set 'bis zum Ablauf des fünften auf die Zuteilung folgenden Tages'; after it the vehicle may not be operated on public roads" }
522
+ sources:
523
+ - "https://www.gesetze-im-internet.de/fzv_2023/__42.html # § 42 Abs. 1: conditions (type-approved or individually approved, valid HU/SP, insurance); Abs. 4: 'einer nur aus Ziffern bestehenden und mit \"03\" oder \"04\" beginnenden Erkennungsnummer' plus the five-day expiry date; Abs. 3: need not be firmly affixed"
524
+ - "https://www.gesetze-im-internet.de/fzv_2023/anlage_4.html # Anlage 4 Abschnitt 6: the three Kurzzeitkennzeichen forms, the yellow/black date field, the 35 mm blue seal"
525
+ notes: >-
526
+ KURZZEITKENNZEICHEN — five days, a yellow expiry field, and a blue seal
527
+ instead of the usual Land-arms Stempelplakette. Unlike the 06 dealer plate it
528
+ is tied to ONE vehicle (§ 42 Abs. 3 Nr. 2) and, unlike an ordinary plate, it
529
+ need not be firmly attached.
530
+
531
+ - id: de-export
532
+ class: export
533
+ categories: [car, van, truck, bus, motorcycle, trailer]
534
+ period: { start: 2023 }
535
+ period_evidence: instrument-in-force
536
+ format:
537
+ pattern: "LL-9999L"
538
+ regex: '\A[A-Z]{1,3}-\d{1,4}[A-Z]\z'
539
+ regex_strict: '\A[A-Z]{1,3}-(?:[1-9]|[1-9]\d|[1-9]\d{2}|[1-9]\d{3})[A-Z]\z'
540
+ charset:
541
+ notes: >-
542
+ § 45 Abs. 2 FZV, verbatim: "Die Erkennungsnummer hat zu bestehen aus einer
543
+ ein- bis vierstelligen Zahl und einem nachfolgenden Buchstaben." Digits
544
+ FIRST, letter LAST — the inverse of every other German series, and the
545
+ single most useful structural tell for an export plate.
546
+ fields_note: "plus a stacked three-number expiry field (day over month over year)"
547
+ design:
548
+ plate: { w: 520, h: 110, unit: mm }
549
+ background: { color: "#FFFFFF", finish: retroreflective, hex_basis: spec }
550
+ foreground: "#000000"
551
+ band: { side: none }
552
+ band_note: >-
553
+ NO EURO-FIELD. Anlage 4 Abschnitt 8 Nr. 3 expressly disapplies the Euro-Feld
554
+ provision (Abschnitt 1 Nr. 3), the verkleinerte Mittelschrift and the § 29
555
+ StVZO badge for Ausfuhrkennzeichen. The only German road plate without the EU
556
+ band — which makes sense: the vehicle is leaving the Union's registration.
557
+ extra_field:
558
+ position: right
559
+ content: "day over month over year on which the registration's validity ends in the FZV's territory"
560
+ background: { color: "#FF0000", finish: non-retroreflective }
561
+ foreground: "#000000"
562
+ note: "Anlage 4 Abschnitt 8 Nr. 3: 'Der rote Untergrund darf nicht retroreflektierend sein' — the one field in German plate law required NOT to retroreflect"
563
+ seal: { diameter_mm: 35, background: "RAL 2002 red", note: "Anlage 4 Abschnitt 8 Nr. 3: Stempelplakette with the authority's Dienstsiegel on a red ground, RAL 2002" }
564
+ validity: { max_months: 12, note: "§ 45 Abs. 1 Nr. 2: the registration is limited to the duration of the proven third-party insurance, 'längstens auf ein Jahr'" }
565
+ sources:
566
+ - "https://www.gesetze-im-internet.de/fzv_2023/__45.html # § 45: Fahrten zur dauerhaften Verbringung eines Fahrzeuges in das Ausland; Abs. 1 the insurance/HU conditions and the one-year cap; Abs. 2 'einer ein- bis vierstelligen Zahl und einem nachfolgenden Buchstaben' plus the expiry-date field"
567
+ - "https://www.gesetze-im-internet.de/fzv_2023/anlage_4.html # Anlage 4 Abschnitt 8: no Euro-Feld, the non-retroreflective red date field, the RAL 2002 seal"
568
+ notes: >-
569
+ AUSFUHRKENNZEICHEN. Three things make it unique in Germany: the digits-then-
570
+ letter Erkennungsnummer, the absence of the Euro-band, and a field the law
571
+ requires NOT to be retroreflective. § 45 Abs. 1 also carries a nice
572
+ period-logic constraint for a claims model: the plate may only be issued if
573
+ the next roadworthiness inspection date falls AFTER the registration's expiry
574
+ date, otherwise the inspection must be done first.
575
+
576
+ # =========================================================================
577
+ # ANLAGE 2 SERIES — federal, Land, diplomatic, military. § 9 Abs. 1 Satz 7:
578
+ # "Die Erkennungsnummern dieser Fahrzeuge dürfen nur aus höchstens
579
+ # sechsstelligen Zahlen bestehen" — digits only, at most six.
580
+ # =========================================================================
581
+ - id: de-federal-government
582
+ class: government
583
+ categories: [car, van, truck, bus, motorcycle]
584
+ period: { start: 2023 }
585
+ period_evidence: instrument-in-force
586
+ format:
587
+ pattern: "BD-999999"
588
+ regex: '\A(?:BD|BG|BP|BW|THW|BBL|BWL|BYL|HEL|LSA|LSN|MVL|NRW|RPL|SAL|THL|HB|HH|NL|B)-\d{1,6}\z'
589
+ charset: { notes: "§ 9 Abs. 1 Satz 7: the Erkennungsnummern of Anlage 2 vehicles 'dürfen nur aus höchstens sechsstelligen Zahlen bestehen' — digits only, maximum six" }
590
+ design:
591
+ plate: { w: 520, h: 110, unit: mm }
592
+ background: { color: "#FFFFFF", finish: retroreflective, hex_basis: spec }
593
+ foreground: "#000000"
594
+ band: { side: left, color: "#003399", content: eu-stars+D }
595
+ region_encoding: inline
596
+ region_encoding_note: "decode via region_encoding_tables.anlage2_federal_and_diplomatic (bund + laender) at the top of this file — a closed, primary, 23-row table, unlike the district list"
597
+ sources:
598
+ - "https://www.gesetze-im-internet.de/fzv_2023/anlage_2.html # Anlage 2 Nr. 1 (Bund: BD, BG, BP, BW, THW, Y, X with their registering authorities) and Nr. 2 (the 16 Land codes and which organs they cover)"
599
+ - "https://www.gesetze-im-internet.de/fzv_2023/__9.html # § 9 Abs. 1 Satz 6-7: which bodies may receive Anlage 2 plates, and the digits-only, max-six-digit Erkennungsnummer rule"
600
+ notes: >-
601
+ FEDERAL AND LAND OFFICIAL SERIES. Two facts a decode table must carry, both
602
+ verbatim from Anlage 2: BG (Bundespolizei) is "noch gültig, wird nicht mehr
603
+ zugeteilt" — still valid, no longer assigned, exactly the ended-but-on-the-road
604
+ case PRD-PLATES's `ended: true` semantics exist for at the series level and
605
+ that decode rows need at the row level. And the CONSULAR case has no code of
606
+ its own: career consular posts carry "das Unterscheidungszeichen des
607
+ Verwaltungsbezirkes am Sitz des Konsulats", i.e. an ordinary district prefix,
608
+ so German consular vehicles are NOT identifiable from the plate string. Also
609
+ here: 1-1 for the Bundestag President's official car (Anlage 2 Nr. 4), the only
610
+ German plate whose prefix is a digit.
611
+
612
+ - id: de-diplomatic
613
+ class: diplomatic
614
+ categories: [car, van, motorcycle]
615
+ period: { start: 2023 }
616
+ period_evidence: instrument-in-force
617
+ format:
618
+ pattern: "0-999999"
619
+ regex: '\A(?:0|B|BN)-\d{1,6}\z'
620
+ charset: { notes: "digits only, max six (§ 9 Abs. 1 Satz 7); the prefix is 0, B or BN depending on the body and the privileged person's status" }
621
+ progression: "Anlage 2 Nr. 3 states only that the prefix depends on the body and the status of the privileged person; the mission-number allocation inside the Erkennungsnummer is NOT in the FZV — see notes"
622
+ design:
623
+ plate: { w: 520, h: 110, unit: mm }
624
+ background: { color: "#FFFFFF", finish: retroreflective, hex_basis: spec }
625
+ foreground: "#000000"
626
+ band: { side: left, color: "#003399", content: eu-stars+D }
627
+ region_encoding: inline
628
+ region_encoding_note: "prefix decode in region_encoding_tables.anlage2_federal_and_diplomatic.diplomatic; the mission-number sub-decode is NOT authored (PRD-PLATES puts diplomatic decode tables at L4)"
629
+ sources:
630
+ - "https://www.gesetze-im-internet.de/fzv_2023/anlage_2.html # Anlage 2 Nr. 3: '0, B oder BN — Diplomatische Vertretungen oder internationale Organisationen und in Abhängigkeit vom Status der bevorrechtigten Person', registered at Berlin or Bonn"
631
+ - "https://www.gesetze-im-internet.de/fzv_2023/__9.html # § 9 Abs. 1 Satz 6-7"
632
+ notes: >-
633
+ GERMAN DIPLOMATIC SERIES. Unlike Spain — where CD/OI/CC/TA each get their own
634
+ background colour — Germany keeps the ordinary black-on-white design and
635
+ signals status only through the prefix, so a German diplomatic plate is
636
+ visually a normal plate. The mission-identifying number group inside the
637
+ Erkennungsnummer is a Foreign Office allocation and is not published in the
638
+ FZV; it is a recorded gap, deliberately not guessed.
639
+
640
+ - id: de-military-bundeswehr
641
+ class: military
642
+ categories: [car, van, truck, bus, motorcycle, trailer]
643
+ period: { start: 2023 }
644
+ period_evidence: instrument-in-force
645
+ format:
646
+ pattern: "Y-999999"
647
+ regex: '\A(?:Y|X)-\d{1,6}\z'
648
+ charset: { notes: "digits only, max six; Y = Bundeswehr, X = NATO international military headquarters based in Germany" }
649
+ group_note: "Anlage 4 Abschnitt 3 Nr. 5: on single-line 'andere Kraftfahrzeuge und Anhänger' plates the LAST THREE DIGITS are separated from the preceding digits by a group gap three times the normal spacing — a real grouping rule inside a digits-only serial"
650
+ design:
651
+ plate: { w: 520, h: 110, unit: mm }
652
+ background: { color: "#FFFFFF", finish: painted, hex_basis: spec, spec_note: "Anlage 4 Abschnitt 3 Nr. 5: 'Die Farbtöne des Untergrundes, des Randes und der Beschriftung sind dem Farbregister RAL 840 HR zu entnehmen, und zwar für schwarz RAL 9005 und weiß RAL 9001.' A rare hard RAL pair in EU plate law." }
653
+ foreground: "#000000"
654
+ foreground_spec: "RAL 9005"
655
+ background_spec: "RAL 9001"
656
+ band: { side: none }
657
+ band_note: "no Euro-Feld on Bundeswehr plates; § 12 Abs. 2 also exempts them from the DIN 74069 reflectivity requirement and the DIN test mark, as it does plates on NATO headquarters vehicles"
658
+ font: { name: "DIN 1451-2:1986-02 (Verkehrsschrift)", note: "Anlage 4 Abschnitt 1 Nr. 2.3: Bundeswehr plates and Versicherungskennzeichen use DIN 1451-2, NOT the FE-Schrift; bold Engschrift where the length does not suffice" }
659
+ federal_colours: { black: "RAL 9005", red: "RAL 3002", gold: "RAL 1006", note: "Anlage 4 Abschnitt 3 Nr. 5 gives the Bundesfarben where they are used" }
660
+ digit_one_rule: "Anlage 4 Abschnitt 3 Nr. 5: where the digit '1' is used, or a line holds fewer digits than the model, the gaps between that line's digits enlarge uniformly — a layout rule the render layer must honour"
661
+ region_encoding: none
662
+ sources:
663
+ - "https://www.gesetze-im-internet.de/fzv_2023/anlage_2.html # Anlage 2 Nr. 1: 'Y Dienstfahrzeuge der Bundeswehr (Zentrale Militärkraftfahrtstelle – ZMK, Hardter Straße 9, 41179 Mönchengladbach/Rheindahlen)' and 'X Dienstfahrzeuge der auf Grund des Nordatlantikvertrages errichteten internationalen militärischen Hauptquartiere'"
664
+ - "https://www.gesetze-im-internet.de/fzv_2023/anlage_4.html # Anlage 4 Abschnitt 3: Bundeswehr plate forms (Leichtkrafträder/Kleinkrafträder, other Krafträder, other vehicles single- and two-line) plus RAL 9005/9001, the Bundesfarben, the digit-1 spacing rule and the last-three-digits group gap"
665
+ - "https://www.gesetze-im-internet.de/fzv_2023/__12.html # § 12 Abs. 2 last sentence: Bundeswehr and NATO-HQ plates are exempt from DIN 74069 and the DIN test mark"
666
+ notes: >-
667
+ BUNDESWEHR (Y) AND NATO HEADQUARTERS (X). Its own series and not a variant of
668
+ the federal one: the FONT differs (DIN 1451-2 instead of FE-Schrift), the
669
+ Euro-band is absent, the reflectivity standard is disapplied and the colours
670
+ are given as RAL codes rather than named. Y is famously a single letter serving
671
+ the entire armed forces, which is why it looks like a district code and is not
672
+ one.