vehicles 0.4.1 → 0.8.0

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.
Files changed (189) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop_todo.yml +164 -0
  3. data/CHANGELOG.md +321 -0
  4. data/README.md +88 -15
  5. data/data/PROVENANCE-vehicles.md +12 -0
  6. data/data/plates/PROVENANCE.md +10 -0
  7. data/data/plates/_decode/at-districts.yml +287 -0
  8. data/data/plates/_decode/ch-cantons.yml +110 -0
  9. data/data/plates/_decode/cn-issuing-offices.yml +463 -0
  10. data/data/plates/_decode/cn-provinces.yml +614 -0
  11. data/data/plates/_decode/cz-kraj.yml +159 -0
  12. data/data/plates/_decode/dk-serial-blocks.yml +327 -0
  13. data/data/plates/_decode/es-provinces.yml +116 -0
  14. data/data/plates/_decode/fr-departements.yml +191 -0
  15. data/data/plates/_decode/gb-age-identifiers.yml +170 -0
  16. data/data/plates/_decode/gb-memory-tags.yml +202 -0
  17. data/data/plates/_decode/gr-prefectures.yml +1408 -0
  18. data/data/plates/_decode/hr-cities.yml +315 -0
  19. data/data/plates/_decode/ie-counties.yml +227 -0
  20. data/data/plates/_decode/in-state-codes.yml +169 -0
  21. data/data/plates/_decode/is-districts-1938.yml +116 -0
  22. data/data/plates/_decode/it-provinces.yml +348 -0
  23. data/data/plates/_decode/jp-office-marks.yml +960 -0
  24. data/data/plates/_decode/jp-use-marks.yml +205 -0
  25. data/data/plates/_decode/kr-authority-marks.yml +146 -0
  26. data/data/plates/_decode/kr-use-syllables.yml +194 -0
  27. data/data/plates/_decode/lu-series-order.yml +638 -0
  28. data/data/plates/_decode/mx-entity-series.yml +380 -0
  29. data/data/plates/_decode/my-index-marks.yml +271 -0
  30. data/data/plates/_decode/no-counties-1913.yml +148 -0
  31. data/data/plates/_decode/no-districts.yml +901 -0
  32. data/data/plates/_decode/pl-powiats.yml +567 -0
  33. data/data/plates/_decode/pt-trailer-services.yml +96 -0
  34. data/data/plates/_decode/ro-counties.yml +213 -0
  35. data/data/plates/_decode/se-diplomatic.yml +220 -0
  36. data/data/plates/_decode/si-regions.yml +123 -0
  37. data/data/plates/_decode/sk-districts.yml +314 -0
  38. data/data/plates/_decode/th-registration-elements.yml +208 -0
  39. data/data/plates/_decode/ua-regions.yml +393 -0
  40. data/data/plates/_decode/za-licence-marks.yml +215 -0
  41. data/data/plates/_meta/classes.yml +26 -0
  42. data/data/plates/_meta/separators.yml +102 -0
  43. data/data/plates/ad.yml +961 -0
  44. data/data/plates/ar.yml +762 -0
  45. data/data/plates/at.yml +1424 -0
  46. data/data/plates/au-act.yml +472 -0
  47. data/data/plates/au-nsw.yml +282 -0
  48. data/data/plates/au-nt.yml +431 -0
  49. data/data/plates/au-qld.yml +272 -0
  50. data/data/plates/au-sa.yml +248 -0
  51. data/data/plates/au-tas.yml +302 -0
  52. data/data/plates/au-vic.yml +215 -0
  53. data/data/plates/au-wa.yml +309 -0
  54. data/data/plates/be.yml +1840 -0
  55. data/data/plates/br.yml +1152 -0
  56. data/data/plates/ca-ab.yml +430 -0
  57. data/data/plates/ca-bc.yml +697 -0
  58. data/data/plates/ca-mb.yml +499 -0
  59. data/data/plates/ca-nb.yml +537 -0
  60. data/data/plates/ca-nl.yml +743 -0
  61. data/data/plates/ca-ns.yml +808 -0
  62. data/data/plates/ca-nt.yml +610 -0
  63. data/data/plates/ca-nu.yml +280 -0
  64. data/data/plates/ca-on.yml +881 -0
  65. data/data/plates/ca-pe.yml +592 -0
  66. data/data/plates/ca-qc.yml +1036 -0
  67. data/data/plates/ca-sk.yml +256 -0
  68. data/data/plates/ca-yt.yml +656 -0
  69. data/data/plates/ch.yml +1273 -0
  70. data/data/plates/cn.yml +1431 -0
  71. data/data/plates/cy.yml +688 -0
  72. data/data/plates/cz.yml +1179 -0
  73. data/data/plates/de.yml +1107 -0
  74. data/data/plates/dk.yml +1647 -0
  75. data/data/plates/ee.yml +1275 -0
  76. data/data/plates/es.yml +888 -0
  77. data/data/plates/fi.yml +1271 -0
  78. data/data/plates/fr.yml +1265 -0
  79. data/data/plates/gb.yml +1188 -0
  80. data/data/plates/gr.yml +721 -0
  81. data/data/plates/hr.yml +860 -0
  82. data/data/plates/hu.yml +959 -0
  83. data/data/plates/ie.yml +775 -0
  84. data/data/plates/in.yml +1172 -0
  85. data/data/plates/is.yml +667 -0
  86. data/data/plates/it.yml +1317 -0
  87. data/data/plates/jp.yml +3650 -0
  88. data/data/plates/kr.yml +1375 -0
  89. data/data/plates/li.yml +1010 -0
  90. data/data/plates/lt.yml +879 -0
  91. data/data/plates/lu.yml +842 -0
  92. data/data/plates/lv.yml +924 -0
  93. data/data/plates/mc.yml +1024 -0
  94. data/data/plates/mt.yml +854 -0
  95. data/data/plates/mx.yml +1372 -0
  96. data/data/plates/my.yml +685 -0
  97. data/data/plates/nl.yml +1016 -0
  98. data/data/plates/no.yml +1018 -0
  99. data/data/plates/nz.yml +1699 -0
  100. data/data/plates/pl.yml +1296 -0
  101. data/data/plates/pt.yml +847 -0
  102. data/data/plates/ro.yml +785 -0
  103. data/data/plates/se.yml +1091 -0
  104. data/data/plates/si.yml +1105 -0
  105. data/data/plates/sk.yml +1439 -0
  106. data/data/plates/sm.yml +1119 -0
  107. data/data/plates/th.yml +1150 -0
  108. data/data/plates/ua.yml +1672 -0
  109. data/data/plates/us-ak.yml +763 -0
  110. data/data/plates/us-al.yml +457 -0
  111. data/data/plates/us-ar.yml +427 -0
  112. data/data/plates/us-as.yml +454 -0
  113. data/data/plates/us-az.yml +430 -0
  114. data/data/plates/us-ca.yml +892 -0
  115. data/data/plates/us-co.yml +452 -0
  116. data/data/plates/us-ct.yml +427 -0
  117. data/data/plates/us-dc.yml +614 -0
  118. data/data/plates/us-de.yml +551 -0
  119. data/data/plates/us-fl.yml +741 -0
  120. data/data/plates/us-ga.yml +644 -0
  121. data/data/plates/us-gu.yml +658 -0
  122. data/data/plates/us-hi.yml +585 -0
  123. data/data/plates/us-ia.yml +438 -0
  124. data/data/plates/us-id.yml +531 -0
  125. data/data/plates/us-il.yml +516 -0
  126. data/data/plates/us-in.yml +324 -0
  127. data/data/plates/us-ks.yml +351 -0
  128. data/data/plates/us-ky.yml +770 -0
  129. data/data/plates/us-la.yml +568 -0
  130. data/data/plates/us-ma.yml +379 -0
  131. data/data/plates/us-md.yml +536 -0
  132. data/data/plates/us-me.yml +445 -0
  133. data/data/plates/us-mi.yml +408 -0
  134. data/data/plates/us-mn.yml +411 -0
  135. data/data/plates/us-mo.yml +356 -0
  136. data/data/plates/us-mp.yml +402 -0
  137. data/data/plates/us-ms.yml +432 -0
  138. data/data/plates/us-mt.yml +619 -0
  139. data/data/plates/us-nc.yml +602 -0
  140. data/data/plates/us-nd.yml +419 -0
  141. data/data/plates/us-ne.yml +483 -0
  142. data/data/plates/us-nh.yml +394 -0
  143. data/data/plates/us-nj.yml +547 -0
  144. data/data/plates/us-nm.yml +574 -0
  145. data/data/plates/us-nv.yml +655 -0
  146. data/data/plates/us-ny.yml +592 -0
  147. data/data/plates/us-oh.yml +404 -0
  148. data/data/plates/us-ok.yml +513 -0
  149. data/data/plates/us-or.yml +392 -0
  150. data/data/plates/us-pa.yml +506 -0
  151. data/data/plates/us-pr.yml +507 -0
  152. data/data/plates/us-ri.yml +445 -0
  153. data/data/plates/us-sc.yml +605 -0
  154. data/data/plates/us-sd.yml +428 -0
  155. data/data/plates/us-tn.yml +471 -0
  156. data/data/plates/us-tx.yml +535 -0
  157. data/data/plates/us-ut.yml +384 -0
  158. data/data/plates/us-va.yml +567 -0
  159. data/data/plates/us-vi.yml +489 -0
  160. data/data/plates/us-vt.yml +458 -0
  161. data/data/plates/us-wa.yml +484 -0
  162. data/data/plates/us-wi.yml +509 -0
  163. data/data/plates/us-wv.yml +446 -0
  164. data/data/plates/us-wy.yml +523 -0
  165. data/data/plates/va.yml +604 -0
  166. data/data/plates/za.yml +1141 -0
  167. data/data/vehicles.json +160653 -105090
  168. data/lib/vehicles/configuration.rb +18 -2
  169. data/lib/vehicles/dataset.rb +73 -18
  170. data/lib/vehicles/fuzzy.rb +115 -0
  171. data/lib/vehicles/http.rb +48 -0
  172. data/lib/vehicles/make.rb +36 -6
  173. data/lib/vehicles/mcp_server.rb +5 -5
  174. data/lib/vehicles/model.rb +42 -6
  175. data/lib/vehicles/plates/jurisdiction.rb +32 -0
  176. data/lib/vehicles/plates/series.rb +291 -0
  177. data/lib/vehicles/plates/template_fill.rb +188 -0
  178. data/lib/vehicles/plates/templates.rb +162 -0
  179. data/lib/vehicles/plates.rb +122 -0
  180. data/lib/vehicles/providers/hosted_provider.rb +49 -58
  181. data/lib/vehicles/providers/local_provider.rb +4 -3
  182. data/lib/vehicles/validators/vehicle_make_validator.rb +3 -1
  183. data/lib/vehicles/validators/vehicle_model_validator.rb +1 -1
  184. data/lib/vehicles/version.rb +1 -1
  185. data/lib/vehicles.rb +53 -16
  186. data/rakelib/data_refresh.rake +109 -0
  187. data/rakelib/plates_refresh.rake +29 -0
  188. data/sig/vehicles.rbs +18 -0
  189. metadata +174 -2
@@ -0,0 +1,1107 @@
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 DATED FROM THE CREATING INSTRUMENTS (L1 redate pass,
44
+ # 2026-08-02). The L0 file carried FZV-2023 consolidation dates as series
45
+ # starts and said so; this pass replaced them with the actual era
46
+ # boundaries, each pinned to its Bundesgesetzblatt instrument (official
47
+ # scans via offenegesetze.de, all fetched 2026-08-02):
48
+ # * 1956 — Verordnung zur Änderung von Vorschriften des
49
+ # Straßenverkehrsrechts vom 14. März 1956 (BGBl. I S. 199; issue Nr. 15,
50
+ # ausgegeben 9.4.1956): creates the Unterscheidungszeichen +
51
+ # Erkennungsnummer system (§ 23 Abs. 2 StVZO), black-on-white AND the
52
+ # green tax-exempt colour (§ 60 Abs. 1), the Anlage IV official/
53
+ # diplomatic/military codes, and — Anlage II — the SAME five serial
54
+ # shapes FZV 2023 Anlage 1 still prints. In force 1.7.1956 for newly
55
+ # plated vehicles; old-system plates until 1.7.1958.
56
+ # * 1995 — 21. ÄndVstVR vom 6. Januar 1995 (BGBl. I S. 8): inserts § 60
57
+ # Abs. 1b StVZO ("Einführung des Euro-Kennzeichens", auf Antrag) +
58
+ # Anlage Va. In force 15.1.1995.
59
+ # * 1996/97 — 23. ÄndVstVR vom 12. November 1996 (BGBl. I S. 1738):
60
+ # Saisonkennzeichen (§ 23 Abs. 1b + Anlage Vb), in force 1.3.1997.
61
+ # * 1997 — 25. ÄndVstVR vom 22. Juli 1997 (BGBl. I S. 1889):
62
+ # Oldtimerkennzeichen with the H (§ 21c, § 23 Abs. 1c, Anlage Vc),
63
+ # in force 29.7.1997 (day after Verkündung 28.7.1997).
64
+ # * 1998 — 27. ÄndVstVR vom 9. März 1998 (BGBl. I S. 441):
65
+ # Kurzzeitkennzeichen (§ 28 StVZO + Anlage Vd), Art. 1 in force
66
+ # 14.3.1998 (day after Verkündung 13.3.1998), remainder 1.5.1998.
67
+ # * 2000 — 32. ÄndVstVR vom 20. Juli 2000 (BGBl. I S. 1090): Euro plate
68
+ # mandatory for plates newly fitted from 1.11.2000; pre-existing
69
+ # plates "gelten weiter"; § 60 Abs. 1b repealed.
70
+ # * 2006/07 — FZV vom 25. April 2006 (BGBl. I S. 988, Art. 1 of the
71
+ # Neuordnungs-VO), in force 1.3.2007: first FZV codification; the
72
+ # "03"/"04", "06", "07" numbering rules and the export digits-then-
73
+ # letter rule verbatim — the honest UPPER BOUND where no creating
74
+ # instrument was secured (dealer-red, oldtimer-red, export).
75
+ # * 2015 — EmoG vom 5. Juni 2015 (BGBl. I S. 898) + 50. ÄndVstVR vom
76
+ # 15. September 2015 (BGBl. I S. 1573, § 9a FZV 2011), in force
77
+ # 26.9.2015: the E-Kennzeichen. The one L0 date that was already true.
78
+ # Where only a consolidation evidences a rule, the series says so with
79
+ # `period_evidence: instrument-in-force-upper-bound` and a gap note at the
80
+ # point of use; folklore years are flagged, never asserted, and conflicts
81
+ # between an instrument and a secondary are RECORDED, not averaged.
82
+ #
83
+ # REGEX POLICY: as in plates/nl.yml, `format.regex` is the lint-round-trippable
84
+ # regex and `format.regex_strict` (proposed schema addition) carries the
85
+ # tighter, sourced form — here, the no-leading-zeros rule from Anlage 1, which
86
+ # cannot go in `regex` because the lint generates "0" for a pattern "9".
87
+ jurisdiction: de
88
+ authority:
89
+ name: Fahrzeug-Zulassungsverordnung (FZV) — Bundesministerium für Digitales und Verkehr
90
+ url: "https://www.gesetze-im-internet.de/fzv_2023/"
91
+ binding: vehicle
92
+ instrument:
93
+ 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)"
94
+ # NOTE: quoted deliberately. scripts/lint_plates.rb calls
95
+ # YAML.safe_load_file(..., permitted_classes: []), so a BARE YAML date
96
+ # (2023-07-20) raises Psych::DisallowedClass and takes the whole lint run
97
+ # down with a backtrace rather than a LINT FAIL line. Every date-shaped
98
+ # value in the plates dataset must be a quoted string or an integer.
99
+ ausfertigungsdatum: "2023-07-20"
100
+ textnachweis_ab: "2023-09-01"
101
+ replaces: "FZV 2011 (V 9232-14 v. 3.2.2011 I 139)"
102
+ 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'"
103
+
104
+ # ---------------------------------------------------------------------------
105
+ # The era instruments (L1 redate pass, 2026-08-02) — each cited ONCE here with
106
+ # its verbatim key passage; per-series sources point at the same URLs. All
107
+ # URLs are the official Bundesgesetzblatt scans republished at
108
+ # media.offenegesetze.de (stable, unpaywalled); the citation of record is the
109
+ # BGBl page. All fetched and read 2026-08-02.
110
+ # ---------------------------------------------------------------------------
111
+ era_instruments:
112
+ v1956:
113
+ citation: "Verordnung zur Änderung von Vorschriften des Straßenverkehrsrechts vom 14. März 1956, BGBl. 1956 I S. 199 (Nr. 15, ausgegeben zu Bonn am 9. April 1956)"
114
+ url: "https://media.offenegesetze.de/bgbl1/1956/bgbl1_1956_15.pdf # fetched 2026-08-02"
115
+ creates: >-
116
+ The district-prefix system. § 23 Abs. 2 StVZO (new version), verbatim:
117
+ "Das von der Zulassungsstelle zuzuteilende Kennzeichen enthält das
118
+ Unterscheidungszeichen für den Verwaltungsbezirk und die
119
+ Erkennungsnummer, unter der das Fahrzeug bei der Zulassungsstelle
120
+ eingetragen ist. Das Unterscheidungszeichen für den Verwaltungsbezirk
121
+ besteht aus einem bis drei Buchstaben nach dem Plan in Anlage I. Die
122
+ Erkennungsnummer besteht aus Buchstaben und Zahlen." § 60 Abs. 1 (new
123
+ version), verbatim: "Unterscheidungszeichen und Erkennungsnummern (§ 23
124
+ Abs. 2) sind in schwarzer Schrift auf weißem Grund anzugeben. Bei
125
+ Fahrzeugen, deren Halten von der Kraftfahrzeugsteuer befreit ist, ist
126
+ die Beschriftung grün auf weißem Grund ... Form, Größe und Ausgestaltung
127
+ von Kennzeichen müssen den Mustern und Angaben in Anlage V entsprechen."
128
+ grammar_continuity: >-
129
+ Anlage II (1956), "Reihenfolge für die Ausgabe der ... Fahrzeugerkennungs-
130
+ nummern": Gruppe I a) "A 1 - A 999 bis Z 1 - Z 999", b) "AA 1 - AA 99 bis
131
+ ZZ 1 - ZZ 99"; Gruppe II "AA 100 - AA 999 bis ZZ 100 - ZZ 999"; Gruppe
132
+ III a) "A 1000 - A 9999 bis Z 1000 - Z 9999", b) "AA 1000 - AA 9999 bis
133
+ ZZ 1000 - ZZ 9999" — the SAME five shapes as FZV 2023 Anlage 1, with
134
+ every block starting at 1, 100 or 1000 (no leading zeros), 70 years
135
+ earlier. The 1956 alphabet was narrower (20 letters; per the main
136
+ Wikipedia locator J replaced I from 7.11.1956, B/F/G added 12.8.1992,
137
+ I/O/Q added 26.5.2000 — SECONDARY, recorded not asserted).
138
+ commencement: >-
139
+ § 72a StVZO (inserted), verbatim: "§ 60 Abs. 1 und 4 sowie die Anlagen I
140
+ bis V | am 1. Juli 1956 für Fahrzeuge, denen die Zulassungsstelle ein
141
+ Kennzeichen neuen Rechts zuteilt, | am 1. Juli 1958 für die übrigen
142
+ kennzeichenpflichtigen Fahrzeuge" (same staging for § 23 Abs. 2). So the
143
+ system starts 1.7.1956 and the pre-1956 occupation-era plates end by
144
+ 1.7.1958.
145
+ v1995_euro:
146
+ citation: "Einundzwanzigste Verordnung zur Änderung straßenverkehrsrechtlicher Vorschriften (21. ÄndVstVR) vom 6. Januar 1995, BGBl. 1995 I S. 8 (Nr. 1, ausgegeben zu Bonn am 12. Januar 1995)"
147
+ url: "https://media.offenegesetze.de/bgbl1/1995/bgbl1_1995_1.pdf # fetched 2026-08-02"
148
+ creates: >-
149
+ The Euro-Kennzeichen. Inserts § 60 Abs. 1b StVZO, verbatim: "(1b)
150
+ Abweichend von Absatz 1 Satz 5 Halbsatz 1 und Absatz 1a Satz 1 dürfen
151
+ auf Antrag Kennzeichen zugeteilt werden, die mit einem blauen Euro-Feld
152
+ und mit einer Beschriftung nach Anlage Va versehen sind. Die Kennzeichen
153
+ müssen reflektierend sein und nach Maßgabe der Anlage Va dem Normblatt
154
+ DIN 74 069, Ausgabe Mai 1989, entsprechen sowie auf der Vorderseite das
155
+ DIN-Prüf- und Überwachungszeichen mit der zugehörigen Registernummer
156
+ tragen." Inserts Anlage Va, "Muster und Maße der Euro-Kennzeichen"
157
+ (published in an Anlageband to BGBl 1995 I Nr. 1 — the Anlageband
158
+ itself, which carries the Schriftmuster, was NOT fetched: recorded gap).
159
+ Closing formula, verbatim: "Diese Verordnung tritt am 15. Januar 1995
160
+ in Kraft." AUF ANTRAG — the Euro plate is optional from 15.1.1995 and
161
+ only becomes mandatory for newly fitted plates on 1.11.2000 (v2000).
162
+ v2000_mandate:
163
+ citation: "Zweiunddreißigste Verordnung zur Änderung straßenverkehrsrechtlicher Vorschriften (32. ÄndVStVR) vom 20. Juli 2000, BGBl. 2000 I S. 1090 (Nr. 34)"
164
+ url: "https://media.offenegesetze.de/bgbl1/2000/bgbl1_2000_34.pdf # fetched 2026-08-02"
165
+ creates: >-
166
+ The Euro-plate mandate and the DIN-era issuance cutoff. New transitional
167
+ provision in § 72 Abs. 2 StVZO, verbatim: "§ 60 Abs. 1 Satz 5 erster
168
+ Halbsatz (Form, Größe und Ausgestaltung einschließlich Beschriftung der
169
+ Euro-Kennzeichen) ist spätestens ab dem 1. November 2000 auf
170
+ Kraftfahrzeuge und Anhänger anzuwenden, die von diesem Tag ab erstmals
171
+ in den Verkehr kommen oder aus anderem Anlass mit einem neuen
172
+ Kennzeichen ausgerüstet werden. Kennzeichen, die vor dem 1. November
173
+ 2000 zugeteilt worden sind und in Form, Größe und Ausgestaltung § 60
174
+ Abs. 1 Satz 5 erster Halbsatz und Anlage V in der vor diesem Termin
175
+ geltenden Fassung entsprechen, gelten weiter." And: "Die
176
+ Übergangsvorschrift '§ 60 Abs. 1b (Einführung des Euro-Kennzeichens)'
177
+ wird aufgehoben." Also repeals the Deutsche-Bundespost successor-company
178
+ registration transitional — the tail end of the 1956 Anlage IV's BP/DB
179
+ world.
180
+ v1996_saison:
181
+ citation: "Dreiundzwanzigste Verordnung zur Änderung straßenverkehrsrechtlicher Vorschriften (23. ÄndVstVR) vom 12. November 1996, BGBl. 1996 I S. 1738 (Nr. 60, ausgegeben zu Bonn am 21. November 1996)"
182
+ url: "https://media.offenegesetze.de/bgbl1/1996/bgbl1_1996_60.pdf # fetched 2026-08-02"
183
+ creates: >-
184
+ The Saisonkennzeichen. Art. 1 Nr. 2 Buchstabe a inserts § 23 Abs. 1b
185
+ StVZO, verbatim: "(1b) Auf Antrag wird für ein Fahrzeug ein auf einen
186
+ nach vollen Monaten bemessenen Zeitraum (Zulassungszeitraum) befristetes
187
+ amtliches Kennzeichen nach Anlage Vb zugeteilt, das jedes Jahr in diesem
188
+ Zeitraum auch wiederholt verwendet werden darf (Saisonkennzeichen). Das
189
+ Fahrzeug darf auf öffentlichen Straßen nur während des auf diesem
190
+ Kennzeichen angegebenen Zeitraums in Betrieb gesetzt oder abgestellt
191
+ werden." Plus Anlage Vb "Muster und Maße der Saisonkennzeichen".
192
+ Art. 4, verbatim: "Artikel 1 Nr. 1, 2 Buchstabe a, Nr. 3, 6, 7
193
+ Buchstabe d, Nr. 9, 13 Buchstabe b Doppelbuchstabe bb, Nr. 14 Buchstabe
194
+ b Doppelbuchstabe bb, Nr. 15, 17 Buchstabe b, Artikel 2 und 3 treten am
195
+ 1. März 1997 in Kraft" — the Saison provisions are in that list, so
196
+ issuance begins 1.3.1997.
197
+ v1997_oldtimer:
198
+ citation: "Fünfundzwanzigste Verordnung zur Änderung straßenverkehrsrechtlicher Vorschriften (25. ÄndVstVR) vom 22. Juli 1997, BGBl. 1997 I S. 1889 (Nr. 52, ausgegeben zu Bonn am 28. Juli 1997)"
199
+ url: "https://media.offenegesetze.de/bgbl1/1997/bgbl1_1997_52.pdf # fetched 2026-08-02"
200
+ creates: >-
201
+ The Oldtimerkennzeichen (H). Inserts § 21c StVZO (Betriebserlaubnis als
202
+ Oldtimer) and § 23 Abs. 1c StVZO ("... zugeteilt (Oldtimerkennzeichen)",
203
+ per Anlage Vc). Anlage Vc "Muster und Maße der Oldtimerkennzeichen",
204
+ verbatim: "Der Kennbuchstabe 'H' nach der Zahl in der Erkennungsnummer
205
+ gibt an, daß für das Fahrzeug eine Betriebserlaubnis als Oldtimer gemäß
206
+ § 21c erteilt worden ist." and "Mehr als sieben Stellen (Buchstaben und
207
+ Ziffern ohne Kennbuchstabe 'H') auf einem Kennzeichen ..." — the
208
+ seven-position cap is 1997-original. Art. 3, verbatim: "Diese Verordnung
209
+ tritt am Tage nach der Verkündung in Kraft." — i.e. 29 July 1997.
210
+ Also (Nr. 8) inserts "der Bundesanstalt Technisches Hilfswerk," into the
211
+ Anlage IV heading — THW joins the official-plate table in 1997.
212
+ v1998_kurzzeit:
213
+ citation: "Siebenundzwanzigste Verordnung zur Änderung straßenverkehrsrechtlicher Vorschriften (27. ÄndVstVR) vom 9. März 1998, BGBl. 1998 I S. 441 (Nr. 14, ausgegeben zu Bonn am 13. März 1998)"
214
+ url: "https://media.offenegesetze.de/bgbl1/1998/bgbl1_1998_14.pdf # fetched 2026-08-02"
215
+ creates: >-
216
+ The Kurzzeitkennzeichen. Art. 1 amends § 28 StVZO ("Kurzzeitkennzeichen
217
+ zuzuteilen und besondere Fahrzeugscheine nach Muster 4, auch ohne
218
+ vorherige Bezeichnung des Fahrzeugs ..."; "(5) Kurzzeitkennzeichen sind
219
+ in schwarzer [Schrift] ... herzustellen") and adds Anlage Vd "Muster und
220
+ Maße der Kurzzeitkennzeichen". Art. 5, verbatim: "Die Artikel 1 und 3
221
+ Nr. 2b und 2g sowie Artikel 4 treten am Tage nach der Verkündung in
222
+ Kraft. Im übrigen tritt die Verordnung am 1. Mai 1998 in Kraft." — the
223
+ creating StVZO provisions are in force 14.3.1998. Art. 4 amends § 7
224
+ Abs. 2 Nr. 5 IntKfzV (export plates): the Dienstsiegel becomes "mit
225
+ einem Durchmesser von 35 mm" beside the existing "(RAL 2002)" — proof
226
+ the red-sealed export regime predates the FZV.
227
+ v2006_fzv:
228
+ citation: "Verordnung zur Neuordnung des Rechts der Zulassung von Fahrzeugen zum Straßenverkehr und zur Änderung straßenverkehrsrechtlicher Vorschriften vom 25. April 2006, BGBl. 2006 I S. 988 (Nr. 21, ausgegeben zu Bonn am 29. April 2006) — Art. 1 = FZV 2006"
229
+ url: "https://media.offenegesetze.de/bgbl1/2006/bgbl1_2006_21.pdf # fetched 2026-08-02"
230
+ creates: >-
231
+ The first FZV. Art. 12 Abs. 2, verbatim: "Im Übrigen tritt diese
232
+ Verordnung am 1. März 2007 in Kraft." Verbatim rules used as UPPER
233
+ BOUNDS in this file: Kurzzeitkennzeichen "besteht die Erkennungsnummer
234
+ nur aus Ziffern und beginnt mit '03' oder '04'. Das Kurzzeitkennzeichen
235
+ enthält außerdem ein Ablaufdatum, das längstens auf fünf Tage ab der
236
+ Zuteilung zu bemessen [ist]"; rotes Kennzeichen "... nur aus Ziffern und
237
+ beginnt mit '06'"; rotes Oldtimerkennzeichen "... nur aus Ziffern und
238
+ beginnt mit '07'"; Ausfuhrkennzeichen "aus einer ein- bis vierstelligen
239
+ Zahl und einem nachfol[genden Buchstaben]". Anlage 3 already lists THW,
240
+ X ("Dienstfahrzeuge der auf Grund des Nordatlantikvertrages errichteten
241
+ internationalen militärischen Hauptquartiere ...") and the five new-Land
242
+ codes.
243
+ v2015_e:
244
+ citation: "Fünfzigste Verordnung zur Änderung straßenverkehrsrechtlicher Vorschriften (50. ÄndVstVR) vom 15. September 2015, BGBl. 2015 I S. 1573 (Nr. 36, ausgegeben zu Bonn am 25. September 2015)"
245
+ url: "https://media.offenegesetze.de/bgbl1/2015/bgbl1_2015_36.pdf # fetched 2026-08-02"
246
+ creates: >-
247
+ The E-Kennzeichen's issuing rule. Inserts § 9a FZV 2011 ("Kennzeichnung
248
+ elektrisch betriebener Fahrzeuge" — "den Kennbuchstaben 'E' im Anschluss
249
+ an die Er[kennungsnummer]") and Anlage 3a (the badge for foreign
250
+ electric vehicles, "zu § 9a Absatz 4"). "Diese Verordnung tritt am Tag
251
+ nach der Verkündung in Kraft." — i.e. 26 September 2015, the first day
252
+ an E plate could issue. § 9a FZV 2011 is today's § 11 FZV 2023.
253
+
254
+ # ---------------------------------------------------------------------------
255
+ # Jurisdiction-wide facts, cited once.
256
+ # ---------------------------------------------------------------------------
257
+ common:
258
+ colours:
259
+ 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."
260
+ 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)"
261
+ dimensions:
262
+ single_line: { w: 520, h: 110, unit: mm, note: "Größtmaß" }
263
+ two_line: { w: 340, h: 200, unit: mm, note: "Größtmaß; 280 mm on two- and three-wheeled motor vehicles" }
264
+ motorcycle: { w_min: 180, w_max: 220, h: 200, unit: mm }
265
+ reduced_two_line: { w: 255, h: 130, unit: mm, note: "Leichtkrafträder and § 12 Abs. 6 Nr. 1 vehicles only" }
266
+ 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"
267
+ font:
268
+ name: FE-Schrift (fälschungserschwerende Schrift)
269
+ 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."
270
+ sizes: { mittelschrift: 75, engschrift: 75, verkleinerte_mittelschrift: 49, unit: mm, note: "verkleinerte Mittelschrift only for reduced two-line and motorcycle plates" }
271
+ alternate: "DIN 1451-2:1986-02 (Verkehrsschrift) for Bundeswehr plates and Versicherungskennzeichen"
272
+ licence: >-
273
+ NO LICENSABLE FONT IS MANDATED. The legal object is a statutory
274
+ Schriftmuster (a drawing), exactly as the EU dossier found for the UK and
275
+ Spain. Per PRD-PLATES §6 the render layer derives glyphs from the
276
+ statutory drawing, never from a third-party FE-Schrift TTF whose own
277
+ licence is unstated. Germany is additionally the affirmatively favourable
278
+ case (PD-VzKat / §5(1) UrhG: designs published inside statutory
279
+ instruments are public domain).
280
+ source: "https://www.gesetze-im-internet.de/fzv_2023/anlage_4.html # Anlage 4 Abschnitt 1 Nr. 2.1-2.3.2"
281
+ euro_band:
282
+ side: left
283
+ content: eu-stars+D
284
+ 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.'"
285
+ note: >-
286
+ This is the ONE hard piece of Euroband geometry secured anywhere in the L0
287
+ pass: a ratio (star-circle diameter = 6x single-star diameter), given as
288
+ text in German law. Reg. 2411/98's own annex is a bitmap and Spain's
289
+ Cuadro 5 is a drawing, so DE Anlage 4 Nr. 3 is the citable source for the
290
+ star wreath's proportions.
291
+ source: "https://www.gesetze-im-internet.de/fzv_2023/anlage_4.html # Anlage 4 Abschnitt 1 Nr. 3"
292
+ anlage1_grammar:
293
+ shapes:
294
+ - "a) A 1 – A 999 bis Z 1 – Z 999"
295
+ - "b) AA 1 – AA 99 bis ZZ 1 – ZZ 99"
296
+ - "c) AA 100 – AA 999 bis ZZ 100 – ZZ 999"
297
+ - "d) A 1000 – A 9999 bis Z 1000 – Z 9999"
298
+ - "e) AA 1000 – AA 9999 bis ZZ 1000 – ZZ 9999"
299
+ letters_excluded: ["Ä", "Ö", "Ü"]
300
+ no_leading_zeros: true
301
+ max_positions: 8
302
+ 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"
303
+
304
+ # Anlage 2 FZV — the SMALL, CLOSED, primary code table (contrast the district
305
+ # list, which is not in the FZV at all). Inlined per PRD-PLATES §2.4's
306
+ # "inline table (small) or a reference (large)" rule.
307
+ region_encoding_tables:
308
+ anlage2_federal_and_diplomatic:
309
+ 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"
310
+ bund:
311
+ BD: "Dienstfahrzeuge des Bundestages, Bundesrates, Bundespräsidialamtes, der Bundesregierung, Bundesministerien, Bundesfinanzverwaltung, des Bundesverfassungsgerichts und Bundeskriminalamtes"
312
+ BG: "Bundespolizei — noch gültig, wird nicht mehr zugeteilt (still valid, no longer assigned)"
313
+ BP: "Dienstfahrzeuge der Bundespolizei"
314
+ BW: "Bundes-Wasserstraßen- und Schifffahrtsverwaltung"
315
+ THW: "Bundesanstalt Technisches Hilfswerk"
316
+ Y: "Dienstfahrzeuge der Bundeswehr (Zentrale Militärkraftfahrtstelle, Mönchengladbach/Rheindahlen)"
317
+ X: "internationale militärische Hauptquartiere nach dem Nordatlantikvertrag mit Standort in Deutschland"
318
+ laender:
319
+ B: "Berlin — Senat und Abgeordnetenhaus"
320
+ BBL: "Brandenburg — Landesregierung, Landtag und Polizei"
321
+ BWL: "Baden-Württemberg — Landesregierung, Landtag und Polizei"
322
+ BYL: "Bayern — Landesregierung und Landtag"
323
+ HB: "Freie Hansestadt Bremen — Senat und Bürgerschaft"
324
+ HEL: "Hessen — Landesregierung und Landtag"
325
+ HH: "Freie und Hansestadt Hamburg — Senat und Bürgerschaft"
326
+ LSA: "Sachsen-Anhalt — Landesregierung, Landtag und Polizei"
327
+ LSN: "Sachsen — Landesregierung und Landtag"
328
+ MVL: "Mecklenburg-Vorpommern — Landesregierung (einschließlich Landespolizei) und Landtag"
329
+ NL: "Niedersachsen — Landesregierung und Landtag"
330
+ NRW: "Nordrhein-Westfalen — Landesregierung, Landtag und Polizei"
331
+ RPL: "Rheinland-Pfalz — Landesregierung, Landtag und Polizei"
332
+ SAL: "Saarland — Landesregierung, Landtag und Polizei"
333
+ SH: "Schleswig-Holstein — Landesregierung, Landtag und Polizei"
334
+ THL: "Thüringen — Landesregierung und Landtag"
335
+ diplomatic:
336
+ "0": "Diplomatische Vertretungen oder internationale Organisationen, abhängig vom Status der bevorrechtigten Person (Zulassungsbehörde Berlin/Bonn)"
337
+ B: "same, Berlin"
338
+ BN: "same, Bonn"
339
+ 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"
340
+ bundestag_president: { "1-1": "Dienstkraftwagen des Präsidenten des Deutschen Bundestages (Zulassungsbehörde Berlin)" }
341
+ note: >-
342
+ COLLISION WORTH FLAGGING: "B" is simultaneously a district code (Berlin),
343
+ a Land code (Berlin Senat/Abgeordnetenhaus) and a diplomatic code. "NL" is
344
+ the Niedersachsen Land code and also the Dutch international
345
+ distinguishing sign. Neither is resolvable from the prefix alone.
346
+
347
+ series:
348
+
349
+ # =========================================================================
350
+ # THE STANDARD SERIES.
351
+ # =========================================================================
352
+ - id: de-standard
353
+ class: standard
354
+ categories: [car, van, truck, bus, motorcycle, trailer]
355
+ period: { start: 1995 } # 15.1.1995 — 21. ÄndVstVR in force (era_instruments.v1995_euro)
356
+ period_evidence: enabling-instrument
357
+ matching: strict
358
+ format:
359
+ pattern: "LL-LL 9999"
360
+ regex: '\A(?![A-Z]{3}-[A-Z]{2} ?\d{4}\z)[A-Z]{1,3}-[A-Z]{1,2} ?\d{1,4}\z'
361
+ 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'
362
+ charset:
363
+ letters_excluded: ["Ä", "Ö", "Ü"]
364
+ notes: >-
365
+ Anlage 1 Nr. 1: every letter of the alphabet except the umlauts Ä, Ö and Ü
366
+ may be assigned in the Erkennungsnummer, singly or as a pair. The FZV
367
+ imposes no further letter exclusion on the Erkennungsnummer, but § 9 Abs. 1
368
+ Satz 3 forbids combinations that "gegen die guten Sitten verstoßen" — a
369
+ discretionary rule, not an enumerable exclusion list, and the reason no
370
+ profanity blacklist is authored here.
371
+ progression: >-
372
+ Anlage 1 Nr. 2 allocates the Erkennungsnummer in five blocks: a) 1 letter +
373
+ 1-999, b) 2 letters + 1-99, c) 2 letters + 100-999, d) 1 letter + 1000-9999,
374
+ e) 2 letters + 1000-9999. Every block starts at 1, 100 or 1000, so NO LEADING
375
+ ZEROS are ever issued — regex_strict enforces this; `regex` cannot, because
376
+ the lint's pattern generator emits "0" for a "9" placeholder.
377
+ max_positions: 8
378
+ max_positions_note: >-
379
+ Anlage 4 Abschnitt 1 Nr. 4: at most eight positions counting the
380
+ Unterscheidungszeichen's letters plus the Erkennungsnummer's letters and
381
+ digits. The negative lookahead in both regexes excludes the single
382
+ over-length shape the quantifiers would otherwise admit (3 + 2 + 4 = 9).
383
+ separator_note: >-
384
+ The gap between Unterscheidungszeichen and Erkennungsnummer is physically
385
+ occupied by the two Plaketten (Stempelplakette + HU badge), not by a printed
386
+ separator. The hyphen and space in the pattern are the conventional textual
387
+ rendering; both regexes accept the space as optional.
388
+ design:
389
+ plate: { w: 520, h: 110, unit: mm }
390
+ plate_variants:
391
+ - { w: 340, h: 200, unit: mm, note: "zweizeilig; 280 mm wide on two- and three-wheeled motor vehicles" }
392
+ - { w_min: 180, w_max: 220, h: 200, unit: mm, note: "Kraftradkennzeichen" }
393
+ - { 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" }
394
+ 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)" }
395
+ foreground: "#000000"
396
+ border: { color: "#000000", note: "Anlage 4 permits black, GREEN or RED borders depending on plate type" }
397
+ 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" }
398
+ 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 applied at write time; SUPERSEDED 2026-08-03: ALL 16 Land arms are licence-cleared in plates/_art/de-<land>/ (PD family, extmetadata-verified, ledgered) — depiction consumers may render the coloured arms in the seal. The remaining gap is the district→Land mapping (the future de-districts table) for serial-driven resolution." }
399
+ 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" }
400
+ rear_differs: false
401
+ 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)"
402
+ spec_history:
403
+ - { from: 1995, to: 2000, basis: "§ 60 Abs. 1b StVZO (21. ÄndVstVR, in force 15.1.1995): Euro-Feld plates AUF ANTRAG — optional, parallel with DIN-era issuance; reflective per DIN 74069 Ausgabe Mai 1989 (updated to Ausgabe Juli 1996 by the 23. ÄndVstVR)" }
404
+ - { from: 2000, basis: "32. ÄndVStVR: Euro plate mandatory for vehicles first coming into traffic from 1.11.2000 and for ANY plate newly fitted from that day; pre-1.11.2000 plates 'gelten weiter'" }
405
+ - { from: 2023, basis: "FZV 2023 (BGBl. 2023 I Nr. 199): the consolidation this file's format and design claims cite; reflective per DIN 74069 Oct 2022" }
406
+ region_encoding: "plates/_decode/de-districts.yml"
407
+ region_encoding_mechanism: >-
408
+ The Unterscheidungszeichen is 1-3 letters identifying the Verwaltungsbezirk of
409
+ registration (§ 9 Abs. 1 Nr. 1). The list is set by the BMDV on application by
410
+ the Länder and published in the BUNDESANZEIGER (§ 9 Abs. 3) — NOT in the FZV
411
+ and NOT by the KBA. A district may hold more than one code, applied for when
412
+ "ohne dieses ein Verbrauch der verfügbaren Kennzeichenkombinationen unmittelbar
413
+ bevorsteht". A withdrawn code may be carried until the vehicle is
414
+ deregistered, so decode rows close by period and are never deleted. The split
415
+ point between prefix and Erkennungsnummer is UNAMBIGUOUS because Anlage 1 fixes
416
+ the Erkennungsnummer to 1-2 letters + 1-4 digits.
417
+ variants:
418
+ - class: standard
419
+ note: >-
420
+ WECHSELKENNZEICHEN (interchangeable plate, § 9 Abs. 2 FZV + Anlage 4
421
+ Abschnitt 2a). Two vehicles of the same class (M1, L or O1) held by one
422
+ keeper share a common plate part plus a per-vehicle part; the common part
423
+ carries a "W" (20 mm high, 25 mm wide) above the Stempelplakette, and the
424
+ per-vehicle part is the LAST DIGIT of the Erkennungsnummer. Same eight-
425
+ position cap across both parts, excluding the "W". Cannot be combined with
426
+ Saison-, rote, Kurzzeit- or Ausfuhrkennzeichen. Recorded as a variant, not
427
+ a series, because the serial grammar is Anlage 1's — but note that a parse
428
+ API sees a SPLIT STRING, which the single-`pattern` schema cannot express.
429
+ sources:
430
+ - "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"
431
+ - "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"
432
+ sources:
433
+ - "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"
434
+ - "https://www.gesetze-im-internet.de/fzv_2023/anlage_1.html # Anlage 1: the five Erkennungsnummer shapes and the umlaut exclusion, verbatim"
435
+ - "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"
436
+ - "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"
437
+ - "https://media.offenegesetze.de/bgbl1/1995/bgbl1_1995_1.pdf # 21. ÄndVstVR vom 6.1.1995, BGBl. I S. 8 — § 60 Abs. 1b StVZO + Anlage Va 'Muster und Maße der Euro-Kennzeichen'; 'Diese Verordnung tritt am 15. Januar 1995 in Kraft.' PERIOD START. Fetched 2026-08-02"
438
+ - "https://media.offenegesetze.de/bgbl1/2000/bgbl1_2000_34.pdf # 32. ÄndVStVR vom 20.7.2000, BGBl. I S. 1090 — Euro plate mandatory for newly fitted plates from 1.11.2000; pre-existing plates 'gelten weiter'. Fetched 2026-08-02"
439
+ notes: >-
440
+ THE GERMAN STANDARD SERIES (Euro-Feld era) — the strongest region signal in
441
+ the pilot and the only pilot jurisdiction whose plate names its place of
442
+ registration. period.start 1995 is the CREATING instrument's own
443
+ commencement: the 21. ÄndVstVR of 6.1.1995 inserted § 60 Abs. 1b StVZO
444
+ ("auf Antrag ... blauen Euro-Feld ... nach Anlage Va") and entered force
445
+ 15.1.1995 (era_instruments.v1995_euro, quoted). Optional until 1.11.2000,
446
+ mandatory for newly fitted plates from that day (v2000_mandate, quoted) —
447
+ recorded in design.spec_history, not cut as a separate series, because
448
+ mark, serial grammar and colours did not change (the gb-standard-2001
449
+ BS-AU-145d/e precedent). FOLKLORE/SECONDARY, recorded not asserted: the
450
+ German Wikipedia locator and the enthusiast site kennzeichen-guide.de
451
+ report staged pre-instrument issuance — Berlin and Brandenburg from
452
+ January 1994, Sachsen from July 1994 — "auf Basis der abzusehenden
453
+ Bundesverordnung"; no instrument authorising 1994 issuance was located in
454
+ this pass, so 1994 is NOT this series' start and the conflict is recorded
455
+ here rather than averaged. The SERIAL GRAMMAR is far older than the
456
+ design: Anlage 1's five shapes are verbatim descendants of Anlage II of
457
+ the 1956 instrument (see de-standard-1956 and
458
+ era_instruments.v1956.grammar_continuity). No age is encoded on a German
459
+ plate at all — unlike the UK, a German plate string carries region but
460
+ never date.
461
+
462
+ # =========================================================================
463
+ # THE PRE-EURO STANDARD SERIES, 1956-2000 (DIN-Schrift era). Added by the
464
+ # L1 redate pass under the "current + one back" rule.
465
+ # =========================================================================
466
+ - id: de-standard-1956
467
+ class: standard
468
+ categories: [car, van, truck, bus, motorcycle, trailer]
469
+ period: { start: 1956, end: 2000 } # 1.7.1956 (v1956 § 72a) — 31.10.2000
470
+ # (v2000_mandate: Euro mandatory for
471
+ # plates fitted from 1.11.2000)
472
+ period_evidence: instrument-dated-both-ends
473
+ matching: strict
474
+ format:
475
+ pattern: "LL-LL 9999"
476
+ regex: '\A(?![A-Z]{3}-[A-Z]{2} ?\d{4}\z)[A-Z]{1,3}-[A-Z]{1,2} ?\d{1,4}\z'
477
+ 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'
478
+ charset:
479
+ notes: >-
480
+ 1956 grammar, Anlage II verbatim (era_instruments.v1956): the same
481
+ five blocks as today's Anlage 1, every block starting at 1, 100 or
482
+ 1000 — no leading zeros, which regex_strict carries. CAVEAT: the
483
+ 1956-era LETTER SET was narrower than A-Z (20 letters at launch; per
484
+ the Wikipedia locator J replaced I from 7.11.1956, B/F/G were added
485
+ 12.8.1992 and I/O/Q on 26.5.2000 — secondary, recorded not
486
+ asserted), so regex_strict is deliberately NOT narrowed to a
487
+ period-specific alphabet no primary was secured for.
488
+ max_positions_note: >-
489
+ No "acht Stellen" rule exists in the 1956 text; total length was
490
+ governed by which Anlage II GRUPPEN a district was allocated (the
491
+ Anlage I plan marks each district Gruppe I/II/III), which kept
492
+ combinations within the plate. The negative lookahead is retained from
493
+ de-standard as the de-facto outer bound; it is a modelling choice
494
+ here, not a quoted 1956 rule.
495
+ separator_note: >-
496
+ As on the Euro series: the gap between Unterscheidungszeichen and
497
+ Erkennungsnummer held the Stempelplakette; the hyphen and space are
498
+ the conventional textual rendering.
499
+ design:
500
+ plate: { w: 520, h: 110, unit: mm, note: "Anlage V (1956), 'c) Andere Kraftfahrzeuge und Anhänger, einzeilig': the 520 x 110 einzeilig drawing is 1956-original — the dimension predates the Euro plate by four decades" }
501
+ background: { color: "#FFFFFF", finish: painted, hex_basis: spec, spec_note: "§ 60 Abs. 1 StVZO (1956), verbatim: 'Unterscheidungszeichen und Erkennungsnummern (§ 23 Abs. 2) sind in schwarzer Schrift auf weißem Grund anzugeben.' Reflective sheeting only became required for new plates on 29.9.1989 per the Wikipedia locator — SECONDARY, recorded not asserted (no instrument secured); hence finish: painted with this note rather than an unsourced reflectivity claim." }
502
+ foreground: "#000000"
503
+ border: { color: "#000000" }
504
+ band: { side: none }
505
+ band_note: "no Euro-Feld — that is the boundary with de-standard; late DIN-era plates (1995-2000) ran in parallel with optional Euro plates"
506
+ font:
507
+ name: "DIN 1451 Mittelschrift (attribution); statutory object = the Anlage V (1956) Schriftmuster drawings"
508
+ note: >-
509
+ The 1956 instrument prescribes plate lettering by DRAWING (Anlage V),
510
+ exactly as the FZV 2023 does for FE-Schrift. "DIN-Kennzeichen" and
511
+ the DIN 1451 attribution are the universal secondary name for the
512
+ era's lettering (and FZV 2023 still names DIN 1451-2:1986-02 for
513
+ Bundeswehr plates); the 1956 gazette scan's drawings were not
514
+ measured in this pass, so the FONT NAME is recorded as attribution,
515
+ not as a quoted statutory name.
516
+ region_encoding: "plates/_decode/de-districts.yml"
517
+ region_encoding_mechanism: >-
518
+ § 23 Abs. 2 StVZO (1956), verbatim: the Kennzeichen contains "das
519
+ Unterscheidungszeichen für den Verwaltungsbezirk", "aus einem bis drei
520
+ Buchstaben nach dem Plan in Anlage I" — the district list was IN the
521
+ StVZO in 1956 (Anlage I, ~600 codes printed in BGBl. 1956 I Nr. 15) and
522
+ only later delegated to Bundesanzeiger publication (§ 9 Abs. 3 FZV
523
+ today). Decode rows for withdrawn 1956-era codes need period discipline;
524
+ the code list grew again in 1990/91 when the new Länder joined the
525
+ system.
526
+ sources:
527
+ - "https://media.offenegesetze.de/bgbl1/1956/bgbl1_1956_15.pdf # Verordnung zur Änderung von Vorschriften des Straßenverkehrsrechts vom 14.3.1956, BGBl. I S. 199 — § 23 Abs. 2 (district prefix + Erkennungsnummer, Anlage I plan), § 60 Abs. 1 (black on white), Anlage II (the five serial blocks), Anlage V (plate drawings, 520x110 einzeilig), § 72a (in force 1.7.1956 for newly plated vehicles; old plates until 1.7.1958). PERIOD START, verbatim quotes in era_instruments.v1956. Fetched 2026-08-02"
528
+ - "https://media.offenegesetze.de/bgbl1/2000/bgbl1_2000_34.pdf # 32. ÄndVStVR vom 20.7.2000, BGBl. I S. 1090 — PERIOD END: Euro form mandatory for plates newly fitted from 1.11.2000, so DIN-era issuance ends 31.10.2000; 'Kennzeichen, die vor dem 1. November 2000 zugeteilt worden sind ... gelten weiter' — ended-but-on-the-road, stated in the instrument itself. Fetched 2026-08-02"
529
+ notes: >-
530
+ THE DIN-SCHRIFT ERA, 1.7.1956 - 31.10.2000: black-on-white, no Euro
531
+ band, district prefix + Anlage II serial — the system the Euro series
532
+ inherited its grammar from, one series back per the L1 rule.
533
+ period.end 2000 is an ISSUANCE end with statutory grandfathering: plates
534
+ assigned before 1.11.2000 "gelten weiter" (v2000_mandate, verbatim), so
535
+ DIN plates remain lawful on continuously registered vehicles today —
536
+ the parallel-validity note the overlap rule requires. Overlaps
537
+ de-standard 1995-2000 because the Euro plate was optional ("auf Antrag")
538
+ in that window and both forms issued side by side. The pre-1956
539
+ occupation-era systems (white-on-black, 1948 four-zone codes) are
540
+ OUT OF SCOPE for L1 (historical depth is L4); the 1956 instrument's own
541
+ transitional gives them until 1.7.1958.
542
+
543
+ # =========================================================================
544
+ # HISTORIC — H suffix.
545
+ # =========================================================================
546
+ - id: de-historic-h
547
+ class: historic
548
+ categories: [car, van, truck, bus, motorcycle, trailer]
549
+ period: { start: 1997 } # 29.7.1997 — 25. ÄndVstVR in force (era_instruments.v1997_oldtimer)
550
+ period_evidence: enabling-instrument
551
+ matching: strict
552
+ format:
553
+ pattern: "LL-LL 999H"
554
+ regex: '\A[A-Z]{1,3}-[A-Z]{1,2} ?\d{1,4}H\z'
555
+ 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'
556
+ suffix: H
557
+ max_positions: 7
558
+ max_positions_note: >-
559
+ Anlage 4 Abschnitt 4 Nr. 4 caps a SINGLE-LINE Oldtimerkennzeichen at seven
560
+ positions EXCLUDING the H (and the Erkennungsnummer at five positions on a
561
+ 340 mm two-line plate, four on a 280 mm two-line or motorcycle plate) — one
562
+ position tighter than the standard series, because the H itself consumes room.
563
+ regex_strict's lookahead removes the shapes that exceed seven.
564
+ charset: { notes: "Anlage 1 grammar unchanged; § 10 Abs. 1 adds the H" }
565
+ design:
566
+ plate: { w: 520, h: 110, unit: mm }
567
+ background: { color: "#FFFFFF", finish: retroreflective, hex_basis: spec }
568
+ foreground: "#000000"
569
+ band: { side: left, color: "#003399", content: eu-stars+D }
570
+ note: "'Der Kennbuchstabe \"H\" ist der Erkennungsnummer ohne Leerzeichen in gleicher Schriftart anzufügen' — no space, same typeface (Anlage 4 Abschnitt 4 Nr. 4)"
571
+ region_encoding: "plates/_decode/de-districts.yml"
572
+ sources:
573
+ - "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'"
574
+ - "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"
575
+ - "https://media.offenegesetze.de/bgbl1/1997/bgbl1_1997_52.pdf # 25. ÄndVstVR vom 22.7.1997, BGBl. I S. 1889 — inserts § 21c StVZO (Betriebserlaubnis als Oldtimer), § 23 Abs. 1c ('Oldtimerkennzeichen') and Anlage Vc with the 'H' rule and the seven-position cap, verbatim in era_instruments.v1997_oldtimer; in force 29.7.1997. PERIOD START. Fetched 2026-08-02"
576
+ notes: >-
577
+ H-KENNZEICHEN, created 1997: the 25. ÄndVstVR of 22.7.1997 inserted § 21c
578
+ and § 23 Abs. 1c StVZO plus Anlage Vc, in force 29.7.1997 — and the
579
+ seven-position cap this series still carries is 1997-original ("Mehr als
580
+ sieben Stellen ... ohne Kennbuchstabe 'H'", Anlage Vc verbatim). CONFLICT
581
+ RECORDED, NOT AVERAGED: the widely repeated claim that the first
582
+ H-Kennzeichen was assigned on 1 JULY 1997 (Wikipedia, attributing a KBA
583
+ Pressebericht 2001 figure of 57,960 Oldtimerkennzeichen; the KBA PDF was
584
+ not fetched in this pass) predates the creating instrument's entry into
585
+ force by four weeks; either the KBA date is loose or issuance rested on
586
+ something not located here. Until the KBA primary is fetched and read,
587
+ 1997 stands on the instrument and the 1-July story is flagged. Note
588
+ § 10 Abs. 1 FZV's discretion, which a claims model should record: the
589
+ authority "kann im Einzelfall" count off-road periods towards the minimum
590
+ age in § 2 Satz 1 Nr. 22 FZV. The 30-year threshold itself lives in that
591
+ definition and in § 23 StVZO, neither of which was fetched — the
592
+ threshold remains a recorded gap and the widely-repeated "30 years" is
593
+ NOT asserted here as sourced. H-Saisonkennzeichen exist since 1.10.2017
594
+ (BGBl. 2017 I S. 522, 553 per the Wikipedia locator — instrument not
595
+ fetched, recorded as locator only). An H plate may also be a
596
+ Saisonkennzeichen (Anlage 4 Abschnitt 4 Nr. 4 last sentence) or a
597
+ Wechselkennzeichen.
598
+
599
+ # =========================================================================
600
+ # ELECTRIC — E suffix. The one German series with a properly dated start.
601
+ # =========================================================================
602
+ - id: de-electric-e
603
+ class: electric
604
+ categories: [car, van, truck, bus, motorcycle]
605
+ period: { start: 2015 }
606
+ period_evidence: enabling-statute
607
+ matching: strict
608
+ format:
609
+ pattern: "LL-LL 999E"
610
+ regex: '\A[A-Z]{1,3}-[A-Z]{1,2} ?\d{1,4}E\z'
611
+ 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'
612
+ suffix: E
613
+ max_positions: 7
614
+ 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)."
615
+ design:
616
+ plate: { w: 520, h: 110, unit: mm }
617
+ background: { color: "#FFFFFF", finish: retroreflective, hex_basis: spec }
618
+ foreground: "#000000"
619
+ band: { side: left, color: "#003399", content: eu-stars+D }
620
+ note: "'Der Kennbuchstabe \"E\" ist der Erkennungsnummer ohne Leerzeichen in gleicher Schriftart anzufügen' (Anlage 4 Abschnitt 5a Nr. 6)"
621
+ foreign_vehicle_badge:
622
+ shape: circular
623
+ diameter_mm: 80
624
+ colour: "RAL 5017"
625
+ note: >-
626
+ For an electric vehicle admitted to traffic under ANOTHER state's rules, the
627
+ marking is a BADGE per Anlage 3 affixed visibly at the rear, not a plate
628
+ suffix; the issuing office writes the vehicle's registration into the
629
+ badge's window in lightfast script. Anlage 3 giving a hard RAL value is
630
+ unusual — most EU plate law specifies drawings, not colour codes.
631
+ source: "https://www.gesetze-im-internet.de/fzv_2023/anlage_3.html # Anlage 3 (zu § 11 Absatz 4): Plakettenmuster, 80 mm diameter, RAL 5017"
632
+ region_encoding: "plates/_decode/de-districts.yml"
633
+ sources:
634
+ - "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"
635
+ - "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"
636
+ - "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"
637
+ - "https://media.offenegesetze.de/bgbl1/2015/bgbl1_2015_36.pdf # 50. ÄndVstVR vom 15.9.2015, BGBl. I S. 1573 — inserts § 9a FZV 2011 ('den Kennbuchstaben \"E\" im Anschluss an die Erkennungsnummer') and Anlage 3a; 'tritt am Tag nach der Verkündung in Kraft' = 26.9.2015, the first day an E plate could issue. Fetched 2026-08-02"
638
+ notes: >-
639
+ E-KENNZEICHEN. period.start 2015 SURVIVED the L1 redate pass — the one L0
640
+ period that was already true: the Elektromobilitätsgesetz of 5 June 2015
641
+ created the eligibility, and the 50. ÄndVstVR of 15.9.2015 (BGBl. I
642
+ S. 1573, era_instruments.v2015_e) inserted the issuing rule § 9a FZV 2011
643
+ (today's § 11 FZV 2023), in force 26 September 2015 — so 2015 is both the
644
+ enabling-statute year and the first-issuance year, now pinned at both
645
+ ends. TIME BOMB WORTH RECORDING: EmoG § 8 Abs. 2 provides that the Act
646
+ ceases to be in force at the end of 31 December 2026 — inside the current
647
+ audit horizon. Unless it is extended, this series' `period.end` becomes
648
+ 2026 and the quarterly audit should re-check it. Also note § 79 Abs. 9
649
+ FZV carries a non-application footnote against § 11 which was not
650
+ resolved in this pass (recorded gap).
651
+
652
+ # =========================================================================
653
+ # SEASONAL.
654
+ # =========================================================================
655
+ - id: de-seasonal
656
+ class: seasonal
657
+ categories: [car, van, truck, bus, motorcycle, trailer]
658
+ period: { start: 1997 } # 1.3.1997 — 23. ÄndVstVR Art. 4 (era_instruments.v1996_saison)
659
+ period_evidence: enabling-instrument
660
+ matching: strict
661
+ format:
662
+ pattern: "LL-LL 999"
663
+ regex: '\A[A-Z]{1,3}-[A-Z]{1,2} ?\d{1,4}\z'
664
+ 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'
665
+ max_positions: 7
666
+ 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"
667
+ fields_note: >-
668
+ THE OPERATING PERIOD IS A FIELD, NOT PART OF THE SERIAL. Anlage 4 Abschnitt 5
669
+ Nr. 4: in the Betriebszeitraum field, "die Zahl über dem Bindestrich" is the
670
+ start month and "die Zahl unter dem Bindestrich" the end month, set in
671
+ DIN 1451-2:1986-02. A single `pattern` string cannot carry a stacked
672
+ two-number field — this is the same schema pressure PRD-PLATES §2.2 records
673
+ for Japan, arriving in Germany.
674
+ design:
675
+ plate: { w: 520, h: 110, unit: mm }
676
+ background: { color: "#FFFFFF", finish: retroreflective, hex_basis: spec }
677
+ foreground: "#000000"
678
+ band: { side: left, color: "#003399", content: eu-stars+D }
679
+ extra_field: { position: right, content: "start month over end month, separated by a hyphen", typeface: "DIN 1451-2:1986-02" }
680
+ validity:
681
+ min_months: 2
682
+ max_months: 11
683
+ note: >-
684
+ "Der Betriebszeitraum ist auf volle Monate zu bemessen. Der Betriebszeitraum
685
+ muss mindestens zwei Monate und darf höchstens elf Monate umfassen"
686
+ (§ 10 Abs. 3). Outside the period the vehicle may neither be operated NOR
687
+ PARKED on public roads. Trips to deregister, and return trips after the seal
688
+ is removed, count as unstamped plates under § 12 Abs. 4.
689
+ region_encoding: "plates/_decode/de-districts.yml"
690
+ sources:
691
+ - "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"
692
+ - "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"
693
+ - "https://media.offenegesetze.de/bgbl1/1996/bgbl1_1996_60.pdf # 23. ÄndVstVR vom 12.11.1996, BGBl. I S. 1738 — Art. 1 Nr. 2a inserts § 23 Abs. 1b StVZO (the Saisonkennzeichen, verbatim in era_instruments.v1996_saison) + Anlage Vb; Art. 4 puts the Saison provisions in force 1.3.1997. PERIOD START. Fetched 2026-08-02"
694
+ notes: >-
695
+ SAISONKENNZEICHEN, created by the 23. ÄndVstVR of 12.11.1996 with the
696
+ Saison provisions in force 1 March 1997 (Art. 4, quoted in
697
+ era_instruments.v1996_saison) — even the operate-OR-park prohibition is
698
+ 1996-original ("nur während des ... Zeitraums in Betrieb gesetzt oder
699
+ abgestellt werden", § 23 Abs. 1b verbatim). The 2-to-11-month bounds are
700
+ cited here to § 10 Abs. 3 FZV 2023 only: whether the 1996 original
701
+ carried the same bounds was not verified (the OCR of the fee-and-annex
702
+ pages is partial) — recorded gap, deliberately not asserted. Its own
703
+ series rather than a variant because the DESIGN differs (an added
704
+ operating-period field) while the serial grammar does not — the
705
+ PRD-PLATES §2.3 test resolves cleanly. It composes with other classes:
706
+ green plates (§ 10 Abs. 2), Oldtimerkennzeichen and E-Kennzeichen can
707
+ all be issued AS seasonal plates, which means class is genuinely
708
+ multi-valued here and the single-`class` schema cannot express the
709
+ combination.
710
+
711
+ # =========================================================================
712
+ # GREEN — TAX-EXEMPT. Green lettering on white, and the class vocabulary has
713
+ # no home for it.
714
+ # =========================================================================
715
+ - id: de-green-taxexempt
716
+ class: agricultural
717
+ categories: [tractor, machine, trailer, truck]
718
+ period: { start: 1956 } # 1.7.1956 — § 60 Abs. 1 Satz 2 StVZO as amended 14.3.1956 (era_instruments.v1956)
719
+ period_evidence: enabling-instrument
720
+ matching: strict
721
+ format:
722
+ pattern: "LL-LL 9999"
723
+ regex: '\A(?![A-Z]{3}-[A-Z]{2} ?\d{4}\z)[A-Z]{1,3}-[A-Z]{1,2} ?\d{1,4}\z'
724
+ 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'
725
+ design:
726
+ plate: { w: 520, h: 110, unit: mm }
727
+ background: { color: "#FFFFFF", finish: retroreflective, hex_basis: spec }
728
+ foreground: "#008000"
729
+ 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."
730
+ border: { color: "#008000", note: "Anlage 4 Abschnitt 1 Nr. 2.1 contemplates black, GREEN or red borders; the green plate takes the green one" }
731
+ band: { side: left, color: "#003399", content: eu-stars+D }
732
+ region_encoding: "plates/_decode/de-districts.yml"
733
+ sources:
734
+ - "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"
735
+ - "https://media.offenegesetze.de/bgbl1/1956/bgbl1_1956_15.pdf # V. vom 14.3.1956, BGBl. I S. 199 — § 60 Abs. 1 Satz 2 StVZO, verbatim: 'Bei Fahrzeugen, deren Halten von der Kraftfahrzeugsteuer befreit ist, ist die Beschriftung grün auf weißem Grund; dies gilt nicht für Fahrzeuge von Behörden, für Fahrzeuge des Personals von diplomatischen und konsularischen Vertretungen sowie für Fahrzeuge, deren Haltern Steuererlaß gewährt worden ist.' In force 1.7.1956 (§ 72a). PERIOD START. Fetched 2026-08-02"
736
+ notes: >-
737
+ GRÜNES KENNZEICHEN, and the redate pass's biggest surprise: the green
738
+ tax-exempt colour rule is 1956-ORIGINAL, in the very sentence after
739
+ black-on-white — § 60 Abs. 1 Satz 2 StVZO as amended 14.3.1956, quoted
740
+ verbatim in the source line, in force 1.7.1956, and already with an
741
+ exclusion list of the same shape as today's § 10 Abs. 2 FZV (authority
742
+ vehicles and diplomatic/consular personnel vehicles excluded from
743
+ green). The 32. ÄndVStVR (2000) still carries a transitional headed
744
+ "§ 60 Abs. 1 Satz 2 (grüne amtliche Kennzeichen)" — continuity across
745
+ the era boundary. CLASS CAVEAT, and it is a real one: the legal
746
+ criterion is not agriculture at all — it is that "der Halter von der
747
+ Kraftfahrzeugsteuer befreit ist". _meta/classes.yml has no tax-exempt
748
+ class, so `agricultural` is recorded as the closest fit and the dominant
749
+ population, but the statute's own exclusion list shows how much wider
750
+ the category is: authority vehicles, diplomatic and consular staff
751
+ vehicles, buses and 8-9-seat cars mainly in scheduled service and their
752
+ trailers, Leichtkrafträder and Kleinkrafträder, vehicles of severely
753
+ disabled persons under § 3a KraftStG, particularly low-emission
754
+ vehicles, and any vehicle on a Wechselkennzeichen are all EXCLUDED from
755
+ the green plate. Flagged as a vocabulary gap in the L0 report. DESIGN
756
+ CAVEAT for the period claim: the green plate here carries today's
757
+ Euro-band design; its 1956-1995 execution was the DIN form (green on
758
+ white, no band). The colour RULE is continuous since 1956; the current
759
+ DESIGN is not — same split as de-standard vs de-standard-1956, recorded
760
+ here instead of cutting a low-value historical twin (L4 work).
761
+
762
+ # =========================================================================
763
+ # DEALER — rote Kennzeichen, digits-only beginning 06.
764
+ # =========================================================================
765
+ - id: de-dealer-red
766
+ class: dealer
767
+ categories: [car, van, truck, bus, motorcycle, trailer]
768
+ period: { start: 2007 } # UPPER BOUND — the "06" rule verbatim in the
769
+ # FZV 2006, in force 1.3.2007; the series is
770
+ # older and its creating instrument was not
771
+ # secured (see notes)
772
+ period_evidence: instrument-in-force-upper-bound
773
+ matching: strict
774
+ format:
775
+ pattern: "LL-06999"
776
+ regex: '\A[A-Z]{1,3}-06\d{1,4}\z'
777
+ charset: { notes: "the Erkennungsnummer is DIGITS ONLY and begins with 06 — no letters at all, so Anlage 1's letter blocks do not apply" }
778
+ 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"
779
+ design:
780
+ plate: { w: 520, h: 110, unit: mm }
781
+ background: { color: "#FFFFFF", finish: retroreflective, hex_basis: spec }
782
+ foreground: "#FF0000"
783
+ 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."
784
+ border: { color: "#FF0000" }
785
+ band: { side: left, color: "#003399", content: eu-stars+D }
786
+ 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"
787
+ binding: business
788
+ sources:
789
+ - "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"
790
+ - "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"
791
+ - "https://media.offenegesetze.de/bgbl1/2006/bgbl1_2006_21.pdf # FZV vom 25.4.2006, BGBl. I S. 988 — the '06' rule verbatim ('... nur aus Ziffern und beginnt mit \"06\"'), in force 1.3.2007 (Art. 12 Abs. 2). PERIOD UPPER BOUND. Fetched 2026-08-02"
792
+ - "https://media.offenegesetze.de/bgbl1/1998/bgbl1_1998_14.pdf # 27. ÄndVstVR vom 9.3.1998, BGBl. I S. 441 — Art. 1 amends the § 28 StVZO rote-Kennzeichen machinery ('Für die mit roten Kennzeichen versehenen ...') and, per its other articles in force 1.5.1998, ends red-plate transfer use by private persons; evidences the red-plate regime pre-FZV without stating the 06 numbering. Fetched 2026-08-02"
793
+ notes: >-
794
+ ROTE KENNZEICHEN — the German dealer/trade plate, and the cleanest "06"
795
+ identification in the dataset. PERIOD, honestly: 2007 is an UPPER BOUND —
796
+ the earliest instrument secured in this pass that states the digits-only
797
+ "06" rule is the first FZV (25.4.2006, in force 1.3.2007, verbatim in
798
+ era_instruments.v2006_fzv). The regime is decades older: § 28 StVZO
799
+ carried red plates before the FZV (the 1998 instrument amending it is
800
+ pinned above), and the enthusiast/Wikipedia lore that red plates exist
801
+ "since the 1920s" and took district-code + number form in 1956 is
802
+ FLAGGED AS UNSOURCED — the 14.3.1956 instrument was read in full and
803
+ does not touch § 28, so the 1956 story is not asserted. Locating the
804
+ instrument that first fixed the 05/06/07 number blocks (a pre-2006 StVZO
805
+ amendment or a Verkehrsblatt directive) is the recorded gap. BINDING
806
+ NOTE: like Swiss plates but for a different reason, this plate does NOT
807
+ bind to a vehicle — it binds to a BUSINESS and moves between vehicles,
808
+ which is why `binding: business` is set on the series and why a
809
+ vehicle-keyed consumer must not join on it. § 41 Abs. 3 requires a
810
+ written per-trip record (plate, date, start and end, driver and address,
811
+ vehicle class, make, VIN and route), retained for a year — the
812
+ compensating audit trail for an untethered plate. Also worth recording:
813
+ FZV 2023 § 41 Abs. 4 gives technical inspection bodies the "05" block —
814
+ an unmodelled sibling series (05 = Prüfstellen) sharing this format.
815
+
816
+ - id: de-oldtimer-red
817
+ class: dealer
818
+ categories: [car, van, truck, bus, motorcycle]
819
+ period: { start: 2007 } # UPPER BOUND — the "07" rule verbatim in the
820
+ # FZV 2006, in force 1.3.2007 (see notes)
821
+ period_evidence: instrument-in-force-upper-bound
822
+ matching: strict
823
+ format:
824
+ pattern: "LL-07999"
825
+ regex: '\A[A-Z]{1,3}-07\d{1,4}\z'
826
+ charset: { notes: "digits only, beginning 07" }
827
+ design:
828
+ plate: { w: 520, h: 110, unit: mm }
829
+ background: { color: "#FFFFFF", finish: retroreflective, hex_basis: spec }
830
+ foreground: "#FF0000"
831
+ border: { color: "#FF0000" }
832
+ band: { side: left, color: "#003399", content: eu-stars+D }
833
+ sources:
834
+ - "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"
835
+ - "https://media.offenegesetze.de/bgbl1/2006/bgbl1_2006_21.pdf # FZV vom 25.4.2006, BGBl. I S. 988 — 'Das rote Oldtimerkennzeichen besteht aus einem Unterscheidungszeichen und einer Erkennungsnummer jeweils nach § 8 Abs. 1, jedoch besteht die Erkennungsnummer nur aus Ziffern und beginnt mit \"07\"', in force 1.3.2007 (Art. 12 Abs. 2). PERIOD UPPER BOUND. Fetched 2026-08-02"
836
+ notes: >-
837
+ ROTES OLDTIMERKENNZEICHEN — the 07 series. PERIOD, honestly: 2007 is an
838
+ UPPER BOUND — the FZV 2006 states the "07" rule verbatim (source line;
839
+ in force 1.3.2007) and is the earliest instrument secured for it. The
840
+ series demonstrably predates that codification: the Wikipedia locator
841
+ records that BEFORE 1 March 2007 (the FZV's own commencement day) the 07
842
+ plate also served 20-year-old Youngtimers — a pre-FZV practice under the
843
+ § 28 StVZO red-plate machinery — but no StVZO-era instrument stating
844
+ "07" was located; that instrument is the recorded gap. Distinguished
845
+ from the 06 dealer plate by two digits and by one crucial restriction:
846
+ § 43 Abs. 2 provides that this plate "nur an dem Fahrzeug verwendet
847
+ werden darf, für das es ausgegeben wurde", so unlike the 06 plate it is
848
+ NOT freely transferable between vehicles. CLASS CAVEAT: recorded as
849
+ `dealer` because it shares § 41's machinery, but it is functionally a
850
+ historic-vehicle event plate; a class vocabulary with a `historic` and a
851
+ `dealer` value cannot express "both".
852
+
853
+ # =========================================================================
854
+ # SHORT-TERM AND EXPORT — the two date-bearing German plates.
855
+ # =========================================================================
856
+ - id: de-shortterm
857
+ class: temporary
858
+ categories: [car, van, truck, bus, motorcycle, trailer]
859
+ period: { start: 1998 } # 14.3.1998 — 27. ÄndVstVR Art. 1 in force (era_instruments.v1998_kurzzeit)
860
+ period_evidence: enabling-instrument
861
+ matching: strict
862
+ format:
863
+ pattern: "LL-03999"
864
+ regex: '\A[A-Z]{1,3}-0[34]\d{1,4}\z'
865
+ charset: { notes: "digits only, beginning '03' OR '04' — the pattern shows 03 as a representative literal and the regex carries both" }
866
+ 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"
867
+ design:
868
+ plate: { w: 520, h: 110, unit: mm }
869
+ background: { color: "#FFFFFF", finish: retroreflective, hex_basis: spec }
870
+ foreground: "#000000"
871
+ band: { side: left, color: "#003399", content: eu-stars+D }
872
+ extra_field:
873
+ position: right
874
+ content: "day over month over year of expiry"
875
+ background: { color: "#FFFF00" }
876
+ foreground: "#000000"
877
+ note: "Anlage 4 Abschnitt 6 Nr. 4: 'Die Farbe dieses Feldes ist gelb mit schwarzer Beschriftung'; digits in DIN 1451-2:1986-02"
878
+ 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" }
879
+ 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" }
880
+ sources:
881
+ - "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"
882
+ - "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"
883
+ - "https://media.offenegesetze.de/bgbl1/1998/bgbl1_1998_14.pdf # 27. ÄndVstVR vom 9.3.1998, BGBl. I S. 441 — Art. 1 creates the Kurzzeitkennzeichen in § 28 StVZO ('Kurzzeitkennzeichen sind in schwarzer [Schrift] ... herzustellen') + Anlage Vd; Art. 5: Art. 1 in force 14.3.1998, remainder 1.5.1998. PERIOD START, quotes in era_instruments.v1998_kurzzeit. Fetched 2026-08-02"
884
+ - "https://media.offenegesetze.de/bgbl1/2006/bgbl1_2006_21.pdf # FZV vom 25.4.2006, BGBl. I S. 988 — '... nur aus Ziffern und beginnt mit \"03\" oder \"04\". Das Kurzzeitkennzeichen enthält außerdem ein Ablaufdatum, das längstens auf fünf Tage ab der Zuteilung zu bemessen [ist]', in force 1.3.2007 — the earliest instrument secured that states the 03 option. Fetched 2026-08-02"
885
+ notes: >-
886
+ KURZZEITKENNZEICHEN, created by the 27. ÄndVstVR of 9.3.1998 (Art. 1, in
887
+ force 14 March 1998) as the black-script short-term plate that replaced
888
+ private use of red plates — the same instrument's remaining articles, in
889
+ force 1.5.1998, closed the red-plate route for private transfer runs.
890
+ FORMAT-HISTORY CAVEAT, recorded at the point of use: the "03 oder 04"
891
+ wording in this series' regex is evidenced from 1.3.2007 (FZV 2006,
892
+ verbatim in the source line); the 1998-2007 numbering could not be read
893
+ from the 1998 scan (the Anlage Vd pages' OCR is partial), and the
894
+ widely repeated claim that pre-2007 Kurzzeitkennzeichen began with "04"
895
+ only is SECONDARY (Wikipedia locator) — recorded, not asserted. Five
896
+ days, a yellow expiry field, and a blue seal instead of the usual
897
+ Land-arms Stempelplakette. Unlike the 06 dealer plate it is tied to ONE
898
+ vehicle (§ 42 Abs. 3 Nr. 2) and, unlike an ordinary plate, it need not
899
+ be firmly attached.
900
+
901
+ - id: de-export
902
+ class: export
903
+ categories: [car, van, truck, bus, motorcycle, trailer]
904
+ period: { start: 2007 } # UPPER BOUND — digits-then-letter rule
905
+ # verbatim in the FZV 2006, in force
906
+ # 1.3.2007; the regime is much older (see
907
+ # notes: 1998 IntKfzV seal pin, pre-1988
908
+ # design change flagged)
909
+ period_evidence: instrument-in-force-upper-bound
910
+ matching: strict
911
+ format:
912
+ pattern: "LL-9999L"
913
+ regex: '\A[A-Z]{1,3}-\d{1,4}[A-Z]\z'
914
+ regex_strict: '\A[A-Z]{1,3}-(?:[1-9]|[1-9]\d|[1-9]\d{2}|[1-9]\d{3})[A-Z]\z'
915
+ charset:
916
+ notes: >-
917
+ § 45 Abs. 2 FZV, verbatim: "Die Erkennungsnummer hat zu bestehen aus einer
918
+ ein- bis vierstelligen Zahl und einem nachfolgenden Buchstaben." Digits
919
+ FIRST, letter LAST — the inverse of every other German series, and the
920
+ single most useful structural tell for an export plate.
921
+ fields_note: "plus a stacked three-number expiry field (day over month over year)"
922
+ design:
923
+ plate: { w: 520, h: 110, unit: mm }
924
+ background: { color: "#FFFFFF", finish: retroreflective, hex_basis: spec }
925
+ foreground: "#000000"
926
+ band: { side: none }
927
+ band_note: >-
928
+ NO EURO-FIELD. Anlage 4 Abschnitt 8 Nr. 3 expressly disapplies the Euro-Feld
929
+ provision (Abschnitt 1 Nr. 3), the verkleinerte Mittelschrift and the § 29
930
+ StVZO badge for Ausfuhrkennzeichen. The only German road plate without the EU
931
+ band — which makes sense: the vehicle is leaving the Union's registration.
932
+ extra_field:
933
+ position: right
934
+ content: "day over month over year on which the registration's validity ends in the FZV's territory"
935
+ background: { color: "#FF0000", finish: non-retroreflective }
936
+ foreground: "#000000"
937
+ 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"
938
+ 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" }
939
+ 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'" }
940
+ sources:
941
+ - "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"
942
+ - "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"
943
+ - "https://media.offenegesetze.de/bgbl1/2006/bgbl1_2006_21.pdf # FZV vom 25.4.2006, BGBl. I S. 988 — the export Erkennungsnummer 'aus einer ein- bis vierstelligen Zahl und einem nachfol[genden Buchstaben]' verbatim, in force 1.3.2007. PERIOD UPPER BOUND for the format as modeled. Fetched 2026-08-02"
944
+ - "https://media.offenegesetze.de/bgbl1/1998/bgbl1_1998_14.pdf # 27. ÄndVstVR vom 9.3.1998, BGBl. I S. 441, Art. 4 — amends § 7 Abs. 2 Nr. 5 IntKfzV: the export plate's Dienstsiegel becomes 'mit einem Durchmesser von 35 mm' beside the pre-existing '(RAL 2002)' — the RAL-2002 red seal the FZV 2023 still prescribes was already law in 1998, under the Verordnung über internationalen Kraftfahrzeugverkehr, not the FZV. LINEAGE PIN, not a start. Fetched 2026-08-02"
945
+ notes: >-
946
+ AUSFUHRKENNZEICHEN. PERIOD, honestly: 2007 is an UPPER BOUND for the
947
+ series AS MODELED (digits-then-letter Erkennungsnummer): that rule's
948
+ earliest secured statement is the FZV 2006 (verbatim, in force
949
+ 1.3.2007). The export-plate REGIME is far older and pre-FZV lived in the
950
+ IntKfzV: the 1998 amendment pinned above adjusts its § 7 Dienstsiegel
951
+ and shows RAL 2002 — today's seal colour — already in force, and the
952
+ Wikipedia locator's photo caption dates a distinct older design
953
+ ("Ausfuhrkennzeichen bis 1988") — SECONDARY, recorded not asserted.
954
+ Neither the origin of the digits-then-letter serial nor the 1988(?)
955
+ design change was primary-sourced; both are the recorded gaps here.
956
+ Three things make it unique in Germany: the digits-then-letter
957
+ Erkennungsnummer, the absence of the Euro-band, and a field the law
958
+ requires NOT to be retroreflective. § 45 Abs. 1 also carries a nice
959
+ period-logic constraint for a claims model: the plate may only be issued
960
+ if the next roadworthiness inspection date falls AFTER the
961
+ registration's expiry date, otherwise the inspection must be done first.
962
+
963
+ # =========================================================================
964
+ # ANLAGE 2 SERIES — federal, Land, diplomatic, military. § 9 Abs. 1 Satz 7:
965
+ # "Die Erkennungsnummern dieser Fahrzeuge dürfen nur aus höchstens
966
+ # sechsstelligen Zahlen bestehen" — digits only, at most six.
967
+ # =========================================================================
968
+ - id: de-federal-government
969
+ class: government
970
+ categories: [car, van, truck, bus, motorcycle]
971
+ period: { start: 1956 } # 1.7.1956 — Anlage IV StVZO created by the
972
+ # V. vom 14.3.1956 (era_instruments.v1956);
973
+ # the CODE LIST has evolved, see notes
974
+ period_evidence: enabling-instrument
975
+ matching: strict
976
+ format:
977
+ pattern: "BD-999999"
978
+ 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'
979
+ 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" }
980
+ design:
981
+ plate: { w: 520, h: 110, unit: mm }
982
+ background: { color: "#FFFFFF", finish: retroreflective, hex_basis: spec }
983
+ foreground: "#000000"
984
+ band: { side: left, color: "#003399", content: eu-stars+D }
985
+ region_encoding: inline
986
+ 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"
987
+ sources:
988
+ - "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)"
989
+ - "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"
990
+ - "https://media.offenegesetze.de/bgbl1/1956/bgbl1_1956_15.pdf # V. vom 14.3.1956, BGBl. I S. 199 — Anlage IV (zu § 23 Abs. 2): 'A. Bund: BD Dienstfahrzeuge des Bundestages, des Bundesrates und der Bundesregierung; BG Dienstfahrzeuge des Bundesgrenzschutzes; BP Deutsche Bundespost; BW Bundes-Wasser- und Schiffahrtsverwaltung; DB Deutsche Bundesbahn; Y Dienstfahrzeuge der deutschen Streitkräfte' + 'B. Länder' (B, BWL, BYL, HB, HEL, HH, NL, RPL, RWL, SH), and § 23 Abs. 2: 'Die Erkennungsnummern dieser Fahrzeuge ... bestehen nur aus Zahlen; die Zahlen dürfen nicht mehr als fünf - bei Fahrzeugen der deutschen Streitkräfte sechs - Stellen haben.' In force 1.7.1956. PERIOD START. Fetched 2026-08-02"
991
+ - "https://media.offenegesetze.de/bgbl1/1997/bgbl1_1997_52.pdf # 25. ÄndVstVR vom 22.7.1997 — Nr. 8 inserts 'der Bundesanstalt Technisches Hilfswerk,' into the Anlage IV heading: THW joins the table in 1997. Fetched 2026-08-02"
992
+ - "https://media.offenegesetze.de/bgbl1/2006/bgbl1_2006_21.pdf # FZV vom 25.4.2006 — Anlage 3 already carries THW, X and the five new-Land codes (BBL etc.), in force 1.3.2007. Fetched 2026-08-02"
993
+ notes: >-
994
+ FEDERAL AND LAND OFFICIAL SERIES — 1956-original as a SYSTEM: Anlage IV
995
+ of the 14.3.1956 instrument created the official-code table and the
996
+ digits-only rule in the same breath (both verbatim in the source line).
997
+ THE CODE LIST IS THE PART THAT MOVED, and a decode table must carry it
998
+ by period: 1956 had BD/BG/BP/BW/DB/Y and TEN Land codes (RWL for
999
+ Nordrhein-Westfalen — today NRW; no BBL/LSA/LSN/MVL/THL before
1000
+ reunification); BP meant DEUTSCHE BUNDESPOST in 1956 and means
1001
+ Bundespolizei today — the same two letters changed meaning, which is a
1002
+ trap for any historical decode; DB (Deutsche Bundesbahn) left with
1003
+ privatisation (the 32. ÄndVStVR still repeals a Bundespost-successor
1004
+ transitional in 2000); THW was added in 1997 (pinned); the digit cap
1005
+ rose from five (six for the Streitkräfte) to six for all (§ 9 Abs. 1
1006
+ Satz 7 FZV 2023). The exact instruments for the post-1990 Land codes and
1007
+ the NRW/RWL switch were not located — recorded gaps for the decode
1008
+ table, not for this series' start. Two facts a decode table must carry,
1009
+ both verbatim from Anlage 2 (2023): BG (Bundespolizei) is "noch gültig,
1010
+ wird nicht mehr zugeteilt" — still valid, no longer assigned, exactly
1011
+ the ended-but-on-the-road case PRD-PLATES's `ended: true` semantics
1012
+ exist for at the series level and that decode rows need at the row
1013
+ level. And the CONSULAR case has no code of its own: career consular
1014
+ posts carry "das Unterscheidungszeichen des Verwaltungsbezirkes am Sitz
1015
+ des Konsulats", i.e. an ordinary district prefix, so German consular
1016
+ vehicles are NOT identifiable from the plate string. Also here: 1-1 for
1017
+ the Bundestag President's official car (Anlage 2 Nr. 4), the only German
1018
+ plate whose prefix is a digit.
1019
+
1020
+ - id: de-diplomatic
1021
+ class: diplomatic
1022
+ categories: [car, van, motorcycle]
1023
+ period: { start: 1956 } # 1.7.1956 — Anlage IV C StVZO: "0 Fahrzeuge
1024
+ # des Diplomatischen Corps" (era_instruments.v1956)
1025
+ period_evidence: enabling-instrument
1026
+ matching: strict
1027
+ format:
1028
+ pattern: "0-999999"
1029
+ regex: '\A(?:0|B|BN)-\d{1,6}\z'
1030
+ 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" }
1031
+ 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"
1032
+ design:
1033
+ plate: { w: 520, h: 110, unit: mm }
1034
+ background: { color: "#FFFFFF", finish: retroreflective, hex_basis: spec }
1035
+ foreground: "#000000"
1036
+ band: { side: left, color: "#003399", content: eu-stars+D }
1037
+ region_encoding: inline
1038
+ 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)"
1039
+ sources:
1040
+ - "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"
1041
+ - "https://www.gesetze-im-internet.de/fzv_2023/__9.html # § 9 Abs. 1 Satz 6-7"
1042
+ - "https://media.offenegesetze.de/bgbl1/1956/bgbl1_1956_15.pdf # V. vom 14.3.1956, BGBl. I S. 199 — Anlage IV 'C. Diplomatisches Corps: 0 Fahrzeuge des Diplomatischen Corps', with the § 23 Abs. 2 digits-only rule (max five digits then). In force 1.7.1956. PERIOD START. Fetched 2026-08-02"
1043
+ notes: >-
1044
+ GERMAN DIPLOMATIC SERIES — the zero prefix is 1956-original: Anlage IV C
1045
+ of the 14.3.1956 instrument reads, in its entirety, "0 Fahrzeuge des
1046
+ Diplomatischen Corps" (source line), making 0 the founding member of
1047
+ today's 0/B/BN trio. WHAT IS NOT 1956: the B and BN prefixes for
1048
+ diplomatic vehicles registered at Berlin and Bonn appear in Anlage 2 FZV
1049
+ 2023 (and B doubles as the Berlin Land code); no instrument dating their
1050
+ introduction was located in this pass — recorded gap, presumably tied to
1051
+ the Bonn/Berlin seat split, deliberately not guessed. The 1956 digit cap
1052
+ was five; today six (§ 9 Abs. 1 Satz 7). Unlike Spain — where
1053
+ CD/OI/CC/TA each get their own background colour — Germany keeps the
1054
+ ordinary black-on-white design and signals status only through the
1055
+ prefix, so a German diplomatic plate is visually a normal plate. The
1056
+ mission-identifying number group inside the Erkennungsnummer is a
1057
+ Foreign Office allocation and is not published in the FZV; it is a
1058
+ recorded gap, deliberately not guessed.
1059
+
1060
+ - id: de-military-bundeswehr
1061
+ class: military
1062
+ categories: [car, van, truck, bus, motorcycle, trailer]
1063
+ period: { start: 1956 } # 1.7.1956 — "Y Dienstfahrzeuge der deutschen
1064
+ # Streitkräfte", Anlage IV A (era_instruments.v1956);
1065
+ # the X (NATO HQ) prefix is LATER — gap noted
1066
+ period_evidence: enabling-instrument
1067
+ matching: strict
1068
+ format:
1069
+ pattern: "Y-999999"
1070
+ regex: '\A(?:Y|X)-\d{1,6}\z'
1071
+ charset: { notes: "digits only, max six; Y = Bundeswehr, X = NATO international military headquarters based in Germany" }
1072
+ 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"
1073
+ design:
1074
+ plate: { w: 520, h: 110, unit: mm }
1075
+ 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." }
1076
+ foreground: "#000000"
1077
+ foreground_spec: "RAL 9005"
1078
+ background_spec: "RAL 9001"
1079
+ band: { side: none }
1080
+ 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"
1081
+ 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" }
1082
+ 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" }
1083
+ 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"
1084
+ region_encoding: none
1085
+ sources:
1086
+ - "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'"
1087
+ - "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"
1088
+ - "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"
1089
+ - "https://media.offenegesetze.de/bgbl1/1956/bgbl1_1956_15.pdf # V. vom 14.3.1956, BGBl. I S. 199 — Anlage IV A: 'Y Dienstfahrzeuge der deutschen Streitkräfte (Auskunft: Bundesministerium für Verteidigung)'; § 23 Abs. 2: digits only, 'bei Fahrzeugen der deutschen Streitkräfte sechs' Stellen — the six-digit military allowance is 1956-original. In force 1.7.1956. PERIOD START (for Y). Fetched 2026-08-02"
1090
+ - "https://media.offenegesetze.de/bgbl1/2006/bgbl1_2006_21.pdf # FZV vom 25.4.2006 — Anlage 3: 'X Dienstfahrzeuge der auf Grund des Nordatlantikvertrages errichteten internationalen militärischen Hauptquartiere, die ihren regelmäßigen Standort im Inland haben' — X's earliest secured appearance; in force 1.3.2007. Fetched 2026-08-02"
1091
+ notes: >-
1092
+ BUNDESWEHR (Y) AND NATO HEADQUARTERS (X). Y IS 1956-ORIGINAL — Anlage IV
1093
+ A of the 14.3.1956 instrument, verbatim in the source line, together
1094
+ with the military six-digit allowance that today applies to all Anlage 2
1095
+ vehicles. PERIOD ASYMMETRY RECORDED AT POINT OF USE: this series' regex
1096
+ accepts Y and X, but the period claim anchors on Y; the X prefix is NOT
1097
+ in the 1956 Anlage IV, and its earliest secured appearance is the FZV
1098
+ 2006 Anlage 3 (pinned; in force 1.3.2007) — the instrument that first
1099
+ assigned X to the NATO headquarters (plausibly 1960s, after the 1955
1100
+ NATO accession) was not located and is the recorded gap. Its own series
1101
+ and not a variant of the federal one: the FONT differs (DIN 1451-2
1102
+ instead of FE-Schrift), the Euro-band is absent, the reflectivity
1103
+ standard is disapplied and the colours are given as RAL codes rather
1104
+ than named — and the DIN script on today's Y plate is the direct
1105
+ survival of the 1956-2000 standard lettering (see de-standard-1956).
1106
+ Y is famously a single letter serving the entire armed forces, which is
1107
+ why it looks like a district code and is not one.