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,842 @@
1
+ # plates/lu.yml — Luxembourg (PRD-PLATES gate L1, EU/EEA wave 2).
2
+ #
3
+ # ONE INSTRUMENT, READ END TO END, CARRIES THIS ENTIRE FILE. Every format,
4
+ # every colour, every dimension, every special series, every historic design
5
+ # window and the sequence table in plates/_decode/lu-series-order.yml comes
6
+ # from the REGLEMENT GRAND-DUCAL DU 17 JUIN 2003 relatif a l'identification des
7
+ # vehicules routiers, a leurs plaques d'immatriculation et aux modalites
8
+ # d'attribution de leurs numeros d'immatriculation — Memorial A n. 87 of
9
+ # 25 June 2003, pages 1622-1632 — as amended by the reglement grand-ducal du
10
+ # 18 octobre 2006 (Memorial A n. 190 of 6 November 2006, chapitre III,
11
+ # articles 15-19). Both were fetched in full from Legilux on 2026-08-02 and
12
+ # both are text-extractable, drawings included, which is why almost nothing in
13
+ # this file is observed and almost nothing is secondary.
14
+ #
15
+ # THE START DATE IS THE INSTRUMENT'S OWN COMMENCEMENT CLAUSE, AND HERE THAT IS
16
+ # CORRECT. The instrument-date rule says an instrument's window is not a series
17
+ # period — but it says so because the two usually differ, not because they
18
+ # always do. Luxembourg is the case where they coincide and the text proves it:
19
+ # art. 20 ends "qui entre en vigueur le 1er juillet 2003", and the same date
20
+ # is then used as the operative dividing line four more times inside the
21
+ # instrument: art. 12 chapeau (which plate designs a vehicle may keep), art. 16
22
+ # §1 (which NUMBERS may stay in use), §4 (which PLATES may stay in use) and §5
23
+ # (red plates, to be exchanged by 31-12-2003). A date the instrument itself
24
+ # uses as the dividing line for the whole subject matter is a series boundary,
25
+ # not merely a publication fact.
26
+ #
27
+ # THE ACCURACY HERE IS LOAD-BEARING. `lu_snca` is a live register inside this
28
+ # project, so a wrong Luxembourg format is not a trivia error, it is a
29
+ # resolver error. Two things follow, and both are deliberate:
30
+ # * every regex has a sourced `regex_strict` twin wherever the instrument
31
+ # enumerates an alphabet or a numeric range, which it does far more often
32
+ # than most European instruments; and
33
+ # * the current-series letter order is shipped as a decode table
34
+ # (plates/_decode/lu-series-order.yml) whose transcription is checked arithmetically
35
+ # against the instrument's own exclusion rules — 566 pairs, and 566 is
36
+ # what 26x26 minus the I/O pairs minus the ten named pairs must equal.
37
+ #
38
+ # THE FOUR PECULIARITIES THAT SHAPE THE FILE
39
+ #
40
+ # 1. YELLOW IS THE ORDINARY COLOUR. Art. 11: "Le fond des plaques
41
+ # d'immatriculation est de couleur jaune retroreflechissante et les
42
+ # caracteres alphanumeriques y apposes sont de couleur noire non
43
+ # retroreflechissante." Not a rear-plate convention as in the UK and not a
44
+ # class marker as in NL — every ordinary Luxembourg plate, front and rear,
45
+ # is yellow, and has been since 1974.
46
+ #
47
+ # 2. THE SPECIAL SERIES ARE NUMBER RANGES, NOT DESIGNS. Art. 7 carves the
48
+ # number space into reserved blocks — 1-19 for the Grand-Ducal Court, 20-50
49
+ # for the government garage, P1-P99 for the Chamber of Deputies, AA and ZZ
50
+ # and CD prefixes for the state, limited-use vehicles and the diplomatic
51
+ # corps. They are authored as separate series because their GRAMMAR differs,
52
+ # even though most of them are printed on exactly the same yellow plate.
53
+ #
54
+ # 3. PERSONALISED NUMBERS ARE A REAL, REGULATED, OWNER-BOUND CLASS, and they
55
+ # are the one place Luxembourg's plate-to-vehicle binding breaks. Art. 8
56
+ # gives them a statutory waiting list, a transfer right between the holder's
57
+ # own vehicles, a 36-month reservation after the vehicle goes off the road,
58
+ # and inheritance to a first-degree relative on death. Art. 9 §2 then works
59
+ # out five distinct outcomes depending on who renounces what. This is not a
60
+ # vanity add-on bolted to the side of the system; it is written into its
61
+ # core.
62
+ #
63
+ # 4. THE HISTORIC DESIGNS ARE DATED TO THE DAY BY ART. 12, which is unusual and
64
+ # valuable: 340x110 black with white characters for vehicles first
65
+ # registered before 01-01-1974; 340x110 yellow retroreflective with black
66
+ # characters from 01-01-1974 to 31-12-1987; 520x110 yellow with the European
67
+ # emblem from 01-01-1988 to 30-06-2003. Three windows, one article, no
68
+ # folklore.
69
+ jurisdiction: lu
70
+ authority:
71
+ name: "Ministere de la Mobilite et des Travaux publics — reglement grand-ducal modifie du 17 juin 2003 relatif a l'identification des vehicules routiers, a leurs plaques d'immatriculation et aux modalites d'attribution de leurs numeros d'immatriculation"
72
+ url: "https://data.legilux.public.lu/eli/etat/leg/rgd/2003/06/17/n2/jo/fr/pdf"
73
+ binding: vehicle
74
+ binding_note: >-
75
+ DEFAULT VEHICLE, WITH A STATUTORY OWNER-BOUND EXCEPTION — and a consumer must
76
+ model both. Art. 9 §1: a number granted at first registration stays attached
77
+ to that vehicle until it is definitively withdrawn from circulation in
78
+ Luxembourg, and for at least five years after the relevant trigger, after
79
+ which it may be re-issued. But a PERSONALISED number (art. 8) belongs to the
80
+ holder, transfers between that holder's vehicles, survives the vehicle by 36
81
+ months, and passes to a first-degree relative on death. Art. 9 §2 b) also lets
82
+ the holder of an ORDINARY current-series number convert it into a personalised
83
+ one on transfer, at which point that number changes binding mid-life. So the
84
+ same six-character string can be vehicle-bound or owner-bound depending on
85
+ history, and nothing on the plate says which.
86
+ authority_note: >-
87
+ OPERATOR vs REGULATOR, worth stating because this repo ingests `lu_snca`. The
88
+ 2003 instrument names the SNCT — Societe Nationale de Controle Technique — as
89
+ the body that makes red plates and export plates available to holders (art.
90
+ 14), while the NUMBER is attributed by the minister responsible for transport
91
+ (art. 1). The vehicle-registration operator is today the Societe Nationale de
92
+ Circulation Automobile (SNCA), successor to that role; the instrument text
93
+ read here predates the renaming and says SNCT throughout. Recorded so that a
94
+ reader matching this file against the `lu_snca` register does not think the
95
+ two are different systems.
96
+
97
+ charset_defaults:
98
+ excluded_letters: [I, O]
99
+ excluded_pairs: [AA, CD, HJ, KK, KZ, PD, SA, SS, WC, ZZ]
100
+ excluded_note: >-
101
+ Annexe, paragraphe 2, verbatim: the current series does not use "les series
102
+ qui impliquent une des combinaisons de lettres AA, CD, HJ, KK, KZ, PD, SA,
103
+ SS, WC et ZZ" nor "les series qui impliquent les lettres I ou O". Three of
104
+ the ten pairs are explained elsewhere in the same instrument — AA, CD and ZZ
105
+ are reserved as special series by art. 7 — and the remaining seven (HJ, KK,
106
+ KZ, PD, SA, SS, WC) are given no reason at all. Recorded as unexplained
107
+ rather than rationalised. I and O go for the usual 1/l and 0/O legibility
108
+ reason, which the instrument also does not state.
109
+ source: "https://data.legilux.public.lu/eli/etat/leg/rgd/2003/06/17/n2/jo/fr/pdf # Annexe, paragraphes 1-2, p. 1632"
110
+
111
+ display_rules:
112
+ two_plates: "every registered vehicle carries a rear plate; a FRONT plate as well, except motorcycles, tricycles, mopeds, light quadricycles, trailers and towed vehicles (art. 2, first paragraph)"
113
+ same_number: "front and rear must carry the same number (art. 2)"
114
+ mounting: "as vertical as possible, legible in all circumstances; the rear plate in the location prescribed by Directive 70/222/EEC (four-wheelers) or 93/94/EC (two- and three-wheelers), failing which below 120 cm from the ground; the front plate below 120 cm (art. 15)"
115
+ no_perforation: "the rear plate must be fixed by means that do NOT perforate it — with a listed set of exceptions (trailers, semi-trailers, trucks, industrial and agricultural tractors, self-propelled machines) where screws or rivets are allowed; where perforation is unavoidable, the visible fixing parts must match either the plate ground or the perforated characters (art. 15)"
116
+ unregistered_movement: "an insured but not-yet-registered vehicle MAY carry plates on the shortest route to or from a roadworthiness test or, after a failed test, to a repair shop or the owner's home — the only lawful use of plates on an unregistered vehicle (art. 2, third paragraph)"
117
+ removal_duty: "the holder MUST remove the plates when the vehicle goes off the road for export or scrapping, when it is to be re-registered under another number, or when the number is transferred as a personalised number to another vehicle — and must DESTROY them unless they are immediately reused on another vehicle registered in the same name (art. 15, last two paragraphs)"
118
+ source: "https://data.legilux.public.lu/eli/etat/leg/rgd/2003/06/17/n2/jo/fr/pdf # arts. 2 and 15, pp. 1622-1623 and 1629"
119
+
120
+ series:
121
+
122
+ # =========================================================================
123
+ # THE CURRENT SERIES.
124
+ # =========================================================================
125
+ - id: lu-standard-2003
126
+ class: standard
127
+ categories: [car, van, truck, bus, motorcycle, tricycle, quadricycle, trailer]
128
+ period: { start: 2003 }
129
+ period_evidence: instrument-in-force
130
+ matching: strict
131
+ format:
132
+ pattern: "LL 9999"
133
+ regex: '\A[A-Z]{2}[- ]\d{4}\z'
134
+ regex_strict: '\A(?!AA|CD|HJ|KK|KZ|PD|SA|SS|WC|ZZ)[A-HJ-NP-Z]{2}[- ][4-9]\d{3}\z'
135
+ charset:
136
+ notes: >-
137
+ `regex_strict` is the instrument's own grammar, all of it, from the
138
+ Annexe: six alphanumeric positions, "quatre chiffres precedes de deux
139
+ lettres" (para. 1); no I and no O and none of the ten named pairs
140
+ (para. 2); and the numeric element of the CURRENT series confined to
141
+ 4000-9999 by the 2006 amendment, because 0001-0099 is reserved to
142
+ mopeds and light quadricycles and 0100-3999 to personalised numbers.
143
+ That last constraint is the one most likely to be missed — a
144
+ Luxembourg plate reading "AB 1234" is NOT a current-series number, it
145
+ is a personalised one, and the difference is legally and practically
146
+ real.
147
+ progression: >-
148
+ THE PREFIX IS THE ONLY DECODABLE DIMENSION OF A LUXEMBOURG PLATE, and it
149
+ decodes time, not place. The Annexe fixes the order of the 566 usable
150
+ letter pairs in a printed 15-column grid read COLUMN-MAJOR (see
151
+ plates/_decode/lu-series-order.yml), and pairs the walk with an advancing thousands
152
+ digit: "BA 4000 - BA 4999, CA 5000 - CA 5999, DA 6000 - DA 6999, etc."
153
+ So each prefix takes one thousand-block per pass, the table is walked
154
+ again at the next thousand, and 566 x 6000 = 3,396,000 numbers exist in
155
+ the current series. Ordering two plates by issue is therefore sound;
156
+ DATING one is not, because the instrument publishes the order and never
157
+ the calendar.
158
+ separator_note: >-
159
+ The instrument prescribes six alphanumeric POSITIONS and never a
160
+ separator glyph — art. 11 and the Annexe are silent, and art. 13
161
+ delegates "la disposition des caracteres alphanumeriques sur les plaques
162
+ d'immatriculation ainsi que leur forme, leur taille et leur emboutissage"
163
+ to a cahier des charges approved by the minister, which is NOT published
164
+ in the Memorial and was not reached. That delegation is the reason the
165
+ separator position is spelled as the sanctioned separator-only class
166
+ `[- ]` (PRD-PLATES §2.8) rather than as a literal: the gap is real, the
167
+ glyph is unlegislated.
168
+ design:
169
+ plate: { w: 520, h: 110, unit: mm, thickness: [1, 1.5] }
170
+ plate_variants:
171
+ - { w: 340, h: 200, unit: mm, thickness: [1, 1.5], note: "the square alternative, at the holder's choice of mounting" }
172
+ - { w: 270, h: 80, unit: mm, thickness: [1, 1.5], note: "motocycles" }
173
+ - { w: 200, h: 140, unit: mm, thickness: [1, 1.5], note: "motocycles, tall alternative" }
174
+ background: { color: "#F9B700", finish: retroreflective, hex_basis: observed }
175
+ foreground: "#000000"
176
+ foreground_note: "characters are NON-retroreflective black — the instrument specifies the negative explicitly, which a render layer should honour"
177
+ band:
178
+ side: left
179
+ color: "#003399"
180
+ hex_basis: observed
181
+ content: eu-stars+L
182
+ note: >-
183
+ "un aplat de couleur bleue retroreflechissante contenant, dans sa
184
+ partie superieure, les douze etoiles de couleur jaune
185
+ retroreflechissante rappelant le drapeau europeen et, dans sa partie
186
+ inferieure, le signe distinctif national constitue par la lettre latine
187
+ L en couleur blanche retroreflechissante", with the geometry taken by
188
+ reference from the annex to Regulation (EC) 2411/98. NOTE THE COLOUR
189
+ COLLISION this creates and no other EU state has: the stars are yellow
190
+ and so is the plate, so on a Luxembourg plate the euroband's yellow is
191
+ the SAME family as the ground it sits beside.
192
+ emblem: { present: false }
193
+ rear_differs: false
194
+ fallback_size_rule: >-
195
+ Where the prescribed dimensions cannot be fitted, the 2003 text sent the
196
+ fitter to "les criteres techniques de l'emplacement de la plaque"; the
197
+ 2006 amendment (art. 17) replaced that with a concrete rule — the
198
+ MOTORCYCLE dimensions may be used instead. A rare case of an amendment
199
+ making a specification less discretionary rather than more.
200
+ region_encoding: "plates/_decode/lu-series-order.yml"
201
+ region_encoding_file: lu-series-order.yml
202
+ region_encoding_note: >-
203
+ NOT geography. Luxembourg encodes none, anywhere, in any series — a
204
+ sourced negative, since arts. 6-8 compose every number from reserved
205
+ ranges and a sequential table with no locational element. The referenced
206
+ table decodes ISSUE ORDER.
207
+ sources:
208
+ - "https://data.legilux.public.lu/eli/etat/leg/rgd/2003/06/17/n2/jo/fr/pdf # RGD 17-06-2003 (Memorial A n. 87, 25-06-2003): art. 6 (first available number in the current series), art. 11 (dimensions, yellow retroreflective ground, non-retroreflective black characters, the blue EU field with 12 yellow stars and the white L), art. 20 (in force 01-07-2003), Annexe paras. 1-3 (composition, exclusions, order grid). Accessed 2026-08-02"
209
+ - "https://data.legilux.public.lu/eli/etat/leg/rgd/2006/10/18/n1/jo/fr/pdf # RGD 18-10-2006 (Memorial A n. 190, 06-11-2006): art. 17 (the motorcycle-dimension fallback), art. 19 (the 0001-0099 / 0100-3999 / 4000-9999 split), art. 37 (in force 18-12-2006). Accessed 2026-08-02"
210
+ notes: >-
211
+ THE CURRENT LUXEMBOURG SERIES — two letters, four digits, yellow. Started
212
+ by the instrument's own commencement clause on 1 July 2003, which is a
213
+ genuine series boundary here rather than a mere publication date (see the
214
+ file header). Old numbers were not recalled: art. 16 §1 lets pre-2003
215
+ numbers stay in use and only forces conformity on a change of owner or on
216
+ re-registration after the registration card lapses — with a carve-out for
217
+ historic vehicles holding a four- or five-character number, which the 2006
218
+ amendment widened again so that a re-registration after card expiry never
219
+ forces a historic vehicle to renumber. That is why four-digit and
220
+ five-digit Luxembourg plates are still legally on the road in 2026 and
221
+ why lu-legacy-* below are not dead entries.
222
+
223
+ - id: lu-personalized-2003
224
+ class: personalized
225
+ categories: [car, van, truck, bus, motorcycle, tricycle, quadricycle, trailer]
226
+ period: { start: 2003 }
227
+ period_evidence: instrument-in-force
228
+ matching: recall-only
229
+ format:
230
+ pattern: "9999"
231
+ regex: '\A(?:[A-Z]{2}[- ]\d{1,4}|\d{4,5})\z'
232
+ pattern_note: >-
233
+ A UNION OF FOUR SHAPES, hence `recall-only`. Art. 8 §1 lets an applicant
234
+ request a personalised number drawn from the current series, from the
235
+ four-digit series 1000-9999, or from the five-digit series
236
+ 10000-99999; the 2006 amendment adds the 0100-3999 numeric element
237
+ inside each letter series. So a personalised Luxembourg number may look
238
+ exactly like an ordinary one, may look like a bare four- or five-digit
239
+ number, and cannot be told apart from an ordinary current-series plate
240
+ by inspection alone — except in the one direction that IS decidable: a
241
+ two-letter plate whose digits fall below 4000 is personalised, because
242
+ the current series starts at 4000. A match here is a shape hit only.
243
+ progression: >-
244
+ Not sequential — chosen. The four-digit series is scarce enough to have
245
+ a statutory queue: "les demandes pour l'octroi d'un tel numero sont
246
+ inscrites, dans l'ordre sequentiel de leur entree, dans une liste
247
+ d'attente", one per person for life, allocated as numbers free up.
248
+ design:
249
+ background: { color: "#F9B700", finish: retroreflective, hex_basis: observed }
250
+ foreground: "#000000"
251
+ band: { side: left, color: "#003399", hex_basis: observed, content: eu-stars+L }
252
+ note: "no design of its own — a personalised number is printed on the ordinary plate. It is a SERIES here rather than a sub-entry because its number grammar and its binding both differ (PRD-PLATES §2.3)."
253
+ region_encoding: none
254
+ sources:
255
+ - "https://data.legilux.public.lu/eli/etat/leg/rgd/2003/06/17/n2/jo/fr/pdf # RGD 17-06-2003 art. 8 (the three series a personalised number may come from, the waiting list, transfer between the holder's vehicles, the 36-month reservation, inheritance at first degree, and the fees of 50 EUR on first grant / 24 EUR on transfer) and art. 9 §2 (the five renunciation outcomes). Accessed 2026-08-02"
256
+ - "https://data.legilux.public.lu/eli/etat/leg/rgd/2006/10/18/n1/jo/fr/pdf # RGD 18-10-2006 art. 19: 0100-3999 within each letter series becomes available as personalised numbers. Accessed 2026-08-02"
257
+ notes: >-
258
+ NUMEROS D'IMMATRICULATION PERSONNALISES. The fees recorded above are the
259
+ 2003 figures and are the one field in this file known to be STALE: the
260
+ charge is widely reported at 200 EUR today, and no amending instrument
261
+ changing it was located on Legilux in this pass. Recorded as a dated gap
262
+ rather than updated from a secondary, because a fee is exactly the kind of
263
+ fact that is cheap to get wrong and expensive to be wrong about. Note also
264
+ the transfer mechanism in art. 16 §1 that a parse API should know: a
265
+ pre-2003 two-letters-three-digits number carried forward as a personalised
266
+ number gets AN EXTRA DIGIT INSERTED before its three ("ces trois chiffres
267
+ sont precedes par un chiffre supplementaire"), so some modern-looking
268
+ six-character Luxembourg plates are legacy numbers padded to fit.
269
+
270
+ # =========================================================================
271
+ # MOPEDS AND LIGHT QUADRICYCLES — the two-digit plate.
272
+ # =========================================================================
273
+ - id: lu-moped-2003
274
+ class: moped
275
+ categories: [moped, quadricycle]
276
+ period: { start: 2003 }
277
+ period_evidence: instrument-in-force
278
+ matching: strict
279
+ format:
280
+ pattern: "LL 99"
281
+ regex: '\A[A-Z]{2}[- ]\d{2}\z'
282
+ regex_strict: '\A(?!AA|CD|HJ|KK|KZ|PD|SA|SS|WC|ZZ)[A-HJ-NP-Z]{2}[- ]\d{2}\z'
283
+ pattern_note: >-
284
+ FOUR DIGITS ARE ALLOCATED AND TWO ARE PRINTED. The Annexe, last
285
+ paragraph: the numeric element for mopeds and light quadricycles runs
286
+ 0010-0099 (0001-0099 after the 2006 amendment), "les deux premiers
287
+ chiffres de ce numero n'etant toutefois pas repris sur la plaque
288
+ d'immatriculation". So the register holds a six-character number and the
289
+ plate shows four characters. A consumer joining a printed Luxembourg
290
+ moped plate against a register field must left-pad the digits to four,
291
+ or the join silently fails — this is the single highest-value fact in
292
+ this file for `lu_snca` work.
293
+ design:
294
+ plate: { w: 130, h: 90, unit: mm, thickness: 1.5 }
295
+ plate_variants:
296
+ - { w: 90, h: 130, unit: mm, thickness: 1.5, note: "portrait alternative" }
297
+ background: { color: "#F9B700", finish: retroreflective, hex_basis: observed }
298
+ foreground: "#000000"
299
+ band:
300
+ side: top
301
+ color: "#003399"
302
+ hex_basis: observed
303
+ content: eu-stars+L
304
+ note: >-
305
+ THE ONE BAND THAT MOVES. Art. 11, final paragraph: by derogation the
306
+ moped and light-quadricycle plate may carry the blue field along its
307
+ TOP edge instead of its left, "le signe distinctif national etant dans
308
+ ce cas appose a droite des douze etoiles" — so the L sits beside the
309
+ stars rather than beneath them. Recorded as `side: top` because that
310
+ is the layout the small plate actually uses.
311
+ design_history: >-
312
+ Mopeds and light quadricycles registered before 01-07-2003 may keep a
313
+ quite different plate (art. 12 §4): yellow retroreflective, 85 x 150 mm
314
+ or 150 x 85 mm, with the national sign rendered as a yellow
315
+ retroreflective L, 14 mm high with a 2 mm stroke, on a black
316
+ non-retroreflective oval of 30 x 20 mm, and the black capitals CMA to
317
+ its right. No European band at all.
318
+ region_encoding: none
319
+ sources:
320
+ - "https://data.legilux.public.lu/eli/etat/leg/rgd/2003/06/17/n2/jo/fr/pdf # RGD 17-06-2003 Annexe final paragraph (the 0010-0099 range and the unprinted leading digits), art. 11 (130x90 / 90x130, thickness 1.5 mm, the top-edge band derogation), art. 12 §4 (the pre-2003 CMA plate), art. 17 (for mopeds and light quadricycles the 'plaque d'identite' of the 1955 arrete grand-ducal serves as the registration plate). Accessed 2026-08-02"
321
+ - "https://data.legilux.public.lu/eli/etat/leg/rgd/2006/10/18/n1/jo/fr/pdf # RGD 18-10-2006 art. 19: the moped range becomes 0001-0099. Accessed 2026-08-02"
322
+ notes: >-
323
+ CYCLOMOTEURS ET QUADRICYCLES LEGERS. A separate series and not a size
324
+ variant, because the PRINTED grammar is genuinely different — four
325
+ characters, not six. Art. 17 also records a legal subtlety worth keeping:
326
+ for these vehicles the identity plate under the arrete grand-ducal of
327
+ 23 November 1955 "tient lieu de plaque d'immatriculation", their
328
+ registration record stands in for an immatriculation and their identity
329
+ card for a registration card. They are, strictly, registered by a
330
+ different mechanism that the plate rules are mapped onto.
331
+
332
+ # =========================================================================
333
+ # THE ART. 7 RESERVED RANGES.
334
+ # =========================================================================
335
+ - id: lu-court-2003
336
+ class: government
337
+ categories: [car, van]
338
+ period: { start: 2003 }
339
+ period_evidence: instrument-in-force
340
+ matching: strict
341
+ format:
342
+ pattern: "99"
343
+ regex: '\A(?:CD[- ])?\d{1,2}\z'
344
+ regex_strict: '\A(?:CD[- ])?(?:[1-9]|1\d)\z'
345
+ pattern_note: "art. 7 a): the numbers 1 to 19, and the same numbers prefixed CD"
346
+ design:
347
+ background: { color: "#F9B700", finish: retroreflective, hex_basis: observed }
348
+ foreground: "#000000"
349
+ band: { side: left, color: "#003399", hex_basis: observed, content: eu-stars+L }
350
+ region_encoding: none
351
+ sources:
352
+ - "https://data.legilux.public.lu/eli/etat/leg/rgd/2003/06/17/n2/jo/fr/pdf # RGD 17-06-2003 art. 7 a): 'Les vehicules de la Cour grand-ducale sont immatricules sous les numeros compris entre 1 et 19, ainsi que sous les numeros compris entre 1 et 19, precedes des lettres CD.' Accessed 2026-08-02"
353
+ notes: >-
354
+ THE GRAND-DUCAL COURT holds the nineteen lowest numbers in the country, in
355
+ both a plain and a CD-prefixed form — the CD form because the Court's
356
+ vehicles also travel under diplomatic arrangements. CLASS CAVEAT:
357
+ `government` is the closest member of the controlled vocabulary; the head
358
+ of state's household is neither a civil-government fleet nor a diplomatic
359
+ mission. Art. 10 §1 additionally allows the minister to grant these
360
+ vehicles a SECONDARY number "choisi en dehors de l'evolution normale" of
361
+ the current series — an unmarked ordinary-looking plate — which is a real
362
+ hazard for any consumer inferring officialdom from a low number.
363
+
364
+ - id: lu-government-2003
365
+ class: government
366
+ categories: [car, van, bus]
367
+ period: { start: 2003 }
368
+ period_evidence: instrument-in-force
369
+ matching: strict
370
+ format:
371
+ pattern: "99"
372
+ regex: '\A(?:CD[- ])?\d{2}\z'
373
+ regex_strict: '\A(?:CD[- ])?(?:[2-4]\d|50)\z'
374
+ pattern_note: "art. 7 b): the numbers 20 to 50, plain and CD-prefixed"
375
+ design:
376
+ background: { color: "#F9B700", finish: retroreflective, hex_basis: observed }
377
+ foreground: "#000000"
378
+ band: { side: left, color: "#003399", hex_basis: observed, content: eu-stars+L }
379
+ region_encoding: none
380
+ sources:
381
+ - "https://data.legilux.public.lu/eli/etat/leg/rgd/2003/06/17/n2/jo/fr/pdf # RGD 17-06-2003 art. 7 b): the government garage takes 20 to 50, and 20 to 50 preceded by CD. Accessed 2026-08-02"
382
+ notes: >-
383
+ LE GARAGE DU GOUVERNEMENT — thirty-one numbers, immediately above the
384
+ Court's nineteen, so the first fifty Luxembourg numbers are entirely
385
+ accounted for by the state. Same art. 10 §1 secondary-number caveat as
386
+ lu-court-2003. Distinct from lu-state-2003 (the AA series), which covers
387
+ the administrations rather than the ministerial fleet.
388
+
389
+ - id: lu-parliament-2003
390
+ class: government
391
+ categories: [car, van]
392
+ period: { start: 2003 }
393
+ period_evidence: instrument-in-force
394
+ matching: strict
395
+ format:
396
+ pattern: "P 99"
397
+ regex: '\AP[- ]\d{1,2}\z'
398
+ regex_strict: '\AP[- ](?:[1-9]|[1-9]\d)\z'
399
+ pattern_note: "art. 7 d): the numbers 1 to 99 preceded by the Latin letter P"
400
+ design:
401
+ background: { color: "#F9B700", finish: retroreflective, hex_basis: observed }
402
+ foreground: "#000000"
403
+ band: { side: left, color: "#003399", hex_basis: observed, content: eu-stars+L }
404
+ additional_front_plate:
405
+ shape: oval
406
+ w: 300
407
+ h: 180
408
+ unit: mm
409
+ background: "#FFFFFF"
410
+ foreground: "#CE1126"
411
+ hex_basis: observed
412
+ note: >-
413
+ A SECOND, NON-REGISTRATION PLATE, and one of the few non-rectangular
414
+ plates in this dataset. Art. 3 §2: members of the Chamber of Deputies
415
+ may fit, to the FRONT of a passenger or commercial vehicle registered
416
+ in their own name, an oval plate 300 mm wide by 180 mm high bearing a
417
+ red Latin P on white, the letter 100 mm high with a 16 mm stroke. It
418
+ is a status marker, not a registration — it carries no number, and it
419
+ sits on a vehicle whose ordinary plates are unchanged. Distinct from
420
+ the P-prefixed NUMBER in art. 7 d), which is the Chamber's own fleet.
421
+ region_encoding: none
422
+ sources:
423
+ - "https://data.legilux.public.lu/eli/etat/leg/rgd/2003/06/17/n2/jo/fr/pdf # RGD 17-06-2003 art. 7 d) (the P1-P99 fleet numbers) and art. 3 §2 (the oval red-P front plate for members, with its exact geometry). Accessed 2026-08-02"
424
+ notes: >-
425
+ LA CHAMBRE DES DEPUTES. Two quite different things share the letter P and
426
+ the schema keeps them apart: a reserved NUMBER RANGE for the Chamber's own
427
+ vehicles (this series' format) and a personal OVAL BADGE that individual
428
+ deputies may fit to their own cars (this series' design sub-entry). CLASS
429
+ CAVEAT: `government` for a legislature.
430
+
431
+ - id: lu-state-2003
432
+ class: government
433
+ categories: [car, van, truck, bus, motorcycle, trailer]
434
+ period: { start: 2003 }
435
+ period_evidence: instrument-in-force
436
+ matching: strict
437
+ format:
438
+ pattern: "AA 9999"
439
+ regex: '\AAA[- ]\d{4}\z'
440
+ regex_strict: '\AAA[- ][1-9]\d{3}\z'
441
+ pattern_note: "art. 7 e): the numbers 1000 to 9999 preceded by the Latin letters AA — which is exactly why AA is one of the ten pairs struck out of the current series"
442
+ design:
443
+ background: { color: "#F9B700", finish: retroreflective, hex_basis: observed }
444
+ foreground: "#000000"
445
+ band: { side: left, color: "#003399", hex_basis: observed, content: eu-stars+L }
446
+ region_encoding: none
447
+ sources:
448
+ - "https://data.legilux.public.lu/eli/etat/leg/rgd/2003/06/17/n2/jo/fr/pdf # RGD 17-06-2003 art. 7 e): 'Les vehicules de l'Etat et de ses administrations sont immatricules sous les numeros compris entre 1000 et 9999, precedes des lettres latines AA.' Accessed 2026-08-02"
449
+ notes: >-
450
+ L'ETAT ET SES ADMINISTRATIONS. Visually identical to an ordinary plate —
451
+ same yellow, same six characters, same band — and distinguishable only by
452
+ the reserved AA prefix. Note that POLICE, CUSTOMS and the Ministry of
453
+ State's special services are NOT given a series of their own: art. 10 §1
454
+ names them only as bodies that may hold an additional current-series
455
+ number "choisi en dehors de l'evolution normale". So Luxembourg has no
456
+ police plate series, and this file records none — a sourced negative, not
457
+ a gap.
458
+
459
+ - id: lu-limited-use-2003
460
+ class: agricultural
461
+ categories: [tractor, machine, trailer, truck]
462
+ period: { start: 2003 }
463
+ period_evidence: instrument-in-force
464
+ matching: strict
465
+ format:
466
+ pattern: "ZZ 9999"
467
+ regex: '\AZZ[- ]\d{4}\z'
468
+ regex_strict: '\AZZ[- ][1-9]\d{3}\z'
469
+ pattern_note: "art. 7 f): 1000 to 9999 preceded by ZZ, for vehicles falling under the tax regime for categories of vehicle of necessarily limited use"
470
+ design:
471
+ background: { color: "#F9B700", finish: retroreflective, hex_basis: observed }
472
+ foreground: "#000000"
473
+ band: { side: left, color: "#003399", hex_basis: observed, content: eu-stars+L }
474
+ region_encoding: none
475
+ sources:
476
+ - "https://data.legilux.public.lu/eli/etat/leg/rgd/2003/06/17/n2/jo/fr/pdf # RGD 17-06-2003 art. 7 f): the ZZ series for 'les vehicules tombant sous l'application de la reglementation fixant la taxe sur les vehicules automoteurs de certaines categories de vehicules a usage necessairement limite'. Accessed 2026-08-02"
477
+ notes: >-
478
+ THE ZZ SERIES — a TAX category wearing a plate. CLASS CAVEAT, and a
479
+ genuine one: the instrument defines this series by reference to a vehicle
480
+ TAX regulation, not by vehicle type, so its population is whatever that
481
+ regulation covers — in practice agricultural and works vehicles of
482
+ necessarily limited use. `agricultural` is the nearest member of the
483
+ controlled vocabulary and it is narrower than the statutory category. The
484
+ tax regulation itself was not fetched, so the exact population is a
485
+ recorded gap. This is the third file in the dataset to want a
486
+ works/limited-use class that does not exist (see es-special-vehicles-1999
487
+ and pt-machinery-2006).
488
+
489
+ # =========================================================================
490
+ # DIPLOMATIC.
491
+ # =========================================================================
492
+ - id: lu-diplomatic-2003
493
+ class: diplomatic
494
+ categories: [car, van, motorcycle]
495
+ period: { start: 2003 }
496
+ period_evidence: instrument-in-force
497
+ matching: strict
498
+ format:
499
+ pattern: "CD 99-99"
500
+ regex: '\ACD[- ]\d{2}-\d{2}\z'
501
+ pattern_note: >-
502
+ The instrument composes this one to the character. Art. 7 c): the number
503
+ is 1000-9999 preceded by CD, and "Le predit numero a quatre chiffres est
504
+ divise par un tiret en deux groupes a deux chiffres, le premier groupe
505
+ designant l'organisme diplomatique ou l'organisme international officiel
506
+ en question, le deuxieme groupe formant un numero courant." The hyphen
507
+ INSIDE the digits is statutory and is a group boundary; the gap after CD
508
+ is not legislated, hence the class.
509
+ progression: "group 1 identifies the mission or international organisation and is invariable for it; group 2 is a serial within that body"
510
+ design:
511
+ background: { color: "#F9B700", finish: retroreflective, hex_basis: observed }
512
+ foreground: "#000000"
513
+ band: { side: left, color: "#003399", hex_basis: observed, content: eu-stars+L }
514
+ note: "no distinctive colour — unlike Spain's red CD plate, the Luxembourg diplomatic plate is an ordinary yellow plate with a reserved prefix"
515
+ region_encoding: "mission prefix — the two-digit organisation codes are not published in the instrument; no decode table authored"
516
+ sources:
517
+ - "https://data.legilux.public.lu/eli/etat/leg/rgd/2003/06/17/n2/jo/fr/pdf # RGD 17-06-2003 art. 7 c): the CD series, the two-group split and what each group means, plus the exhaustive list of who qualifies. Art. 19 §3 abrogates the reglement ministeriel du 11 septembre 1995 that previously determined the eligible categories. Accessed 2026-08-02"
518
+ notes: >-
519
+ CORPS DIPLOMATIQUE. The eligibility list in art. 7 c) is unusually
520
+ concrete and worth preserving as a fact about Luxembourg rather than about
521
+ plates: beyond accredited diplomats and officials of international bodies
522
+ with diplomatic or analogous status, it names by office the President,
523
+ Vice-Presidents, political-group chairs and Secretary-General of the
524
+ EUROPEAN PARLIAMENT; the judges, advocates-general and registrar of the
525
+ COURT OF JUSTICE; the President, members and Secretary-General of the
526
+ COURT OF AUDITORS; the members and registrar of the COURT OF FIRST
527
+ INSTANCE; the President and Vice-Presidents of the EIB; the head and
528
+ deputy head of the EFTA Bureau; and the President and members of the
529
+ finance committee of the European Investment Fund. That is the European
530
+ institutional geography of Luxembourg City, written into a plate
531
+ regulation. THE DECODE TABLE IS A GAP: the instrument states the
532
+ MECHANISM (first group = the body) and publishes no codes, and no
533
+ Ministry of Foreign Affairs list was reached. PRD-PLATES puts diplomatic
534
+ decode tables at gate L4; this entry carries the mechanism so a table can
535
+ be hung off it later without an id change.
536
+
537
+ # =========================================================================
538
+ # RED PLATES — the dealer/trade plate, and the only non-yellow ground.
539
+ # =========================================================================
540
+ - id: lu-dealer-red-2003
541
+ class: dealer
542
+ categories: [car, van, truck, bus, motorcycle, tricycle, quadricycle, moped, trailer]
543
+ period: { start: 2003 }
544
+ period_evidence: instrument-in-force
545
+ matching: strict
546
+ format:
547
+ pattern: "9999 99"
548
+ regex: '\A\d{4}[- ]\d{2}\z'
549
+ regex_strict: '\A[1-9]\d{3}[- ]\d{2}\z'
550
+ pattern_note: >-
551
+ Art. 7 g): "un numero a quatre chiffres, compris entre 1000 et 9999,
552
+ suivi des deux derniers chiffres du millesime de l'annee a la fin de
553
+ laquelle expire la validite des plaques". The trailing pair is an EXPIRY
554
+ YEAR, not part of the serial — a red plate reading "4821 27" expires at
555
+ the end of 2027. It is the only Luxembourg plate that dates itself, and
556
+ the date it carries is a deadline, not a birthday.
557
+ progression: "the four-digit block is a serial; the trailing year advances with each issue cycle"
558
+ design:
559
+ plate: { w: 340, h: 110, unit: mm, thickness: [1, 1.5] }
560
+ background: { color: "#CE1126", finish: non-retroreflective, hex_basis: observed }
561
+ foreground: "#FFFFFF"
562
+ foreground_note: "art. 11: red NON-retroreflective ground with white NON-retroreflective digits — the instrument specifies the absence of retroreflectivity on both, uniquely in this file"
563
+ band: { side: left, color: "#003399", hex_basis: observed, content: eu-stars+L, note: "red plates carry the European field too — art. 11, 'Chaque plaque d'immatriculation ET CHAQUE PLAQUE ROUGE doit arborer, a son extremite gauche, un aplat de couleur bleue'" }
564
+ region_encoding: none
565
+ sources:
566
+ - "https://data.legilux.public.lu/eli/etat/leg/rgd/2003/06/17/n2/jo/fr/pdf # RGD 17-06-2003 art. 4 (who may hold red plates, the five permitted uses, the front/rear pairing rule, the Benelux equivalence, the surrender duties), art. 7 g) (the number), art. 11 (340x110, red non-retroreflective ground, white digits, the EU field), art. 14 (supplied by the SNCT against a fee, 70% refundable within three months of expiry), art. 16 §5 (pre-2003 red plates to be exchanged by 31-12-2003). Accessed 2026-08-02"
567
+ - "https://data.legilux.public.lu/eli/etat/leg/rgd/2006/10/18/n1/jo/fr/pdf # RGD 18-10-2006: the fee for a pair of special or red plates set at 150 EUR. Accessed 2026-08-02"
568
+ notes: >-
569
+ PLAQUES ROUGES — Luxembourg's trade plate, held by roadworthiness-test
570
+ bodies and by businesses authorised to trade in or repair road vehicles.
571
+ Validity is fixed by statute and generous: "le dernier jour de la deuxieme
572
+ annee suivant l'annee de leur delivrance", so a plate issued at any point
573
+ in 2025 runs to 31 December 2027. THE BENELUX FACT, which no other file in
574
+ this dataset carries: art. 4 §4 assimilates Belgian "plaques marchandes"
575
+ and Dutch commercial plates to Luxembourg red plates, provided the rules
576
+ of Benelux Committee of Ministers decision M(92)13 of 2 December 1992 are
577
+ respected — so a Belgian trade plate is lawfully a Luxembourg trade plate,
578
+ and the corresponding Belgian or Dutch circulation documents replace the
579
+ Luxembourg registration card (art. 18, amending art. 92 of the 1955
580
+ arrete). A cross-border validation rule, in a plate regulation, sourced.
581
+
582
+ # =========================================================================
583
+ # EXPORT.
584
+ # =========================================================================
585
+ - id: lu-export-2003
586
+ class: export
587
+ categories: [car, van, truck, bus, motorcycle, trailer]
588
+ period: { start: 2003 }
589
+ period_evidence: instrument-in-force
590
+ matching: strict
591
+ format:
592
+ pattern: "9999 9999"
593
+ regex: '\A\d{4}[- ]\d{4}\z'
594
+ regex_strict: '\A(?:0[1-9]|1[0-2])\d{2}[- ][1-9]\d{3}\z'
595
+ pattern_note: >-
596
+ TWO ROWS, LINEARISED. Art. 7 h): the number is 1000-9999 "precede des
597
+ deux chiffres du mois et des deux derniers chiffres du millesime de
598
+ l'annee a la fin desquels expire la validite de l'immatriculation, les
599
+ deux groupes de chiffres ainsi constitues etant superposes et separes
600
+ par un trait horizontal". The plate is therefore stacked — MMYY above a
601
+ horizontal rule, the serial below — with the three letters EXP also
602
+ stacked. `pattern` writes the two rows left to right with a separator,
603
+ because the schema has no two-row primitive; `regex_strict` enforces the
604
+ month as a real month, which is what makes this shape recognisable at
605
+ all.
606
+ layout: "MM YY over a horizontal rule, serial beneath, with EXP set vertically alongside"
607
+ design:
608
+ plate: { w: 340, h: 110, unit: mm }
609
+ background: { color: "#F9B700", finish: retroreflective, hex_basis: observed }
610
+ foreground: "#000000"
611
+ band: { side: left, color: "#003399", hex_basis: observed, content: eu-stars+L }
612
+ note: "art. 11, fourth paragraph, singles this plate out for a size of its own: 'les plaques d'immatriculation dont question sous h) de l'article 7 doivent avoir une largeur de 340 mm et une hauteur de 110 mm' — the only dimension in the instrument attached to a SERIES rather than to a vehicle class"
613
+ region_encoding: none
614
+ sources:
615
+ - "https://data.legilux.public.lu/eli/etat/leg/rgd/2003/06/17/n2/jo/fr/pdf # RGD 17-06-2003 art. 7 h) (the number, the stacked layout, the EXP letters, and the three-month export condition), art. 11 (the 340x110 size), art. 14 (supplied by the SNCT). Accessed 2026-08-02"
616
+ notes: >-
617
+ EXPORT PLATES. The qualifying condition is tighter than most European
618
+ export regimes and is worth recording: the vehicle must be "destine a etre
619
+ exporte dans un delai inferieur a trois mois a partir de leur date
620
+ d'immatriculation" — three months from registration, not from application.
621
+ Unlike nl-export this series does NOT reuse the vehicle's existing
622
+ registration, so it is `strict` rather than `recall-only`: it has a
623
+ grammar of its own and the grammar is enacted.
624
+
625
+ # =========================================================================
626
+ # ARMY.
627
+ # =========================================================================
628
+ - id: lu-army-2003
629
+ class: military
630
+ categories: [car, van, truck, bus, motorcycle, trailer]
631
+ period: { start: 2003 }
632
+ period_evidence: statutory-authority-undated
633
+ matching: recall-only
634
+ format:
635
+ pattern: "9999"
636
+ regex: '\A\d{1,6}\z'
637
+ pattern_note: >-
638
+ NO GRAMMAR IS ENACTED AND NONE IS INVENTED — hence `recall-only` and a
639
+ deliberately shapeless regex. Art. 3 §1 does two things and only two:
640
+ it fixes the COLOURS ("un numero dont les lettres et les chiffres sont
641
+ peintes en couleur blanche sur fond noir") and it names the issuing
642
+ authority ("Les numeros d'immatriculation des vehicules de l'Armee sont
643
+ attribues par le Commandant de l'Armee"). Digit count, letters, ranges:
644
+ absent from the instrument. The pattern shows four digits only because
645
+ the schema requires a pattern.
646
+ design:
647
+ background: { color: "#000000", finish: painted, hex_basis: observed }
648
+ foreground: "#FFFFFF"
649
+ band: { side: none }
650
+ note: >-
651
+ Art. 3 §1 also permits these vehicles to carry EITHER the national
652
+ distinguishing sign as specified in art. 12 §6 (the black L on a white
653
+ oval, 175 x 115 mm) OR "un autre signe distinctif special" which the
654
+ instrument does not describe. `finish: painted` follows the instrument's
655
+ own verb — the colours are "peintes" — and no retroreflectivity is
656
+ required, in contrast to every civilian series here.
657
+ region_encoding: none
658
+ sources:
659
+ - "https://data.legilux.public.lu/eli/etat/leg/rgd/2003/06/17/n2/jo/fr/pdf # RGD 17-06-2003 art. 3 §1: army vehicles NOT subject to registration carry white-on-black plates, numbered by the Army Commander, optionally with the national or a special distinguishing sign. Accessed 2026-08-02"
660
+ notes: >-
661
+ L'ARMEE LUXEMBOURGEOISE. The provision governs vehicles that are NOT
662
+ subject to civil registration at all, which is why it sits in the
663
+ instrument's chapter on plate characteristics rather than in its chapter
664
+ on number attribution — the Army is outside the register, and this
665
+ regulation reaches it only to say what its plates must look like.
666
+ `period_evidence: statutory-authority-undated`: the 2003 instrument is
667
+ the authority for the colour rule and the start recorded here is that
668
+ instrument's commencement, but white-on-black army plates plainly predate
669
+ it and no earlier instrument was reached. Grammar is a recorded gap, and
670
+ the place to look is the Army Commander's own service orders, which are
671
+ not published in the Memorial.
672
+
673
+ # =========================================================================
674
+ # THE PRE-2003 WORLD. Three design windows, dated to the day by art. 12,
675
+ # carrying one shared and undated number grammar.
676
+ # =========================================================================
677
+ - id: lu-legacy-euro-1988
678
+ class: standard
679
+ categories: [car, van, truck, bus, motorcycle, trailer]
680
+ period: { start: 1988, end: 2003 }
681
+ period_evidence: statutory-date
682
+ matching: recall-only
683
+ format:
684
+ pattern: "LL 999"
685
+ regex: '\A(?:\d{2,3}|\d{2}[- ][A-Z]{2}|[A-Z]{2}[- ]\d{2}|[A-Z][- ]\d{4}|[A-Z]{2}[- ]\d{3})\z'
686
+ pattern_note: >-
687
+ THE NUMBER GRAMMAR IS SHARED ACROSS ALL THREE PRE-2003 WINDOWS AND IS
688
+ DATED BY NONE OF THEM. Art. 16 §1 enumerates the pre-2003 compositions
689
+ that may stay in use: "deux ou de trois chiffres", "deux chiffres et de
690
+ deux lettres", "une lettre et de quatre chiffres", "deux lettres et de
691
+ trois chiffres". That is a list of four shapes with no order and no
692
+ dates, so the regex is their union and the series is `recall-only`. The
693
+ two-digits-and-two-letters shape is spelled in BOTH orders here because
694
+ the instrument gives a composition, not an arrangement — an honest
695
+ widening rather than a guessed order.
696
+ design:
697
+ plate: { w: 520, h: 110, unit: mm, note: "rear, where the mounting location is 520 mm wide per Directive 70/222/EEC" }
698
+ plate_variants:
699
+ - { w: 340, h: 110, unit: mm, note: "rear where the location is only 340 mm wide, and the FRONT plate in every case — art. 12 §3 sends both back to the §2 specification" }
700
+ - { w: 240, h: 200, unit: mm, note: "motocycles, WITHOUT the European emblem and with the national L sign below the number on black" }
701
+ background: { color: "#F9B700", finish: retroreflective, hex_basis: observed }
702
+ foreground: "#000000"
703
+ band:
704
+ side: left
705
+ color: "#003399"
706
+ hex_basis: observed
707
+ content: eu-stars
708
+ note: >-
709
+ THE EMBLEM WITHOUT THE LETTER, and the distinction is the whole point
710
+ of this window. Art. 12 §3 gives "l'embleme des Communautes
711
+ Europeennes de couleur bleu-azur NON retroreflechissante avec au
712
+ centre un cercle de douze etoiles de couleur jaune retroreflechissante
713
+ a cinq rais dont les pointes ne se touchent pas, la hauteur de
714
+ l'embleme etant de 80 mm et la largeur de 120 mm" — twelve stars, an
715
+ 80 x 120 mm field, a NON-retroreflective blue, and NO national letter
716
+ inside it. The L had to be carried separately, on the oval sign, and
717
+ art. 12 §6 says so in terms: "Le signe distinctif national ne doit pas
718
+ etre incorpore dans la plaque d'immatriculation." Incorporating the
719
+ country letter into the band is precisely what the 2003 instrument
720
+ changed, and it is why a 1990s Luxembourg plate and a 2003 one are
721
+ told apart at a glance.
722
+ national_sign:
723
+ shape: oval
724
+ w: 175
725
+ h: 115
726
+ unit: mm
727
+ background: "#FFFFFF"
728
+ foreground: "#000000"
729
+ note: "art. 12 §6: a separate rear oval, black L 80 mm high with a 10 mm stroke on white, 175 x 115 mm — or the same painted or applied directly to a substantially vertical rear surface. Mandatory for every vehicle plated under art. 12 §§1-3."
730
+ construction: { material: aluminium, min_thickness: 1.5, character_relief: 1.5, unit: mm, note: "art. 12 §5 — embossed characters at least 1.5 mm proud, not required for mopeds and light quadricycles" }
731
+ region_encoding: none
732
+ sources:
733
+ - "https://data.legilux.public.lu/eli/etat/leg/rgd/2003/06/17/n2/jo/fr/pdf # RGD 17-06-2003 art. 12 §3 (vehicles first registered from 01-01-1988 and before 01-07-2003: the 520x110 yellow plate with the EC emblem, its exact geometry, the 340 mm fallback and the motorcycle plate), §5 (aluminium and relief), §6 (the separate oval L and the prohibition on incorporating it), art. 16 §1 (the four surviving number compositions) and §4 (pre-2003 plates may stay in use). Accessed 2026-08-02"
734
+ notes: >-
735
+ THE 1988-2003 DESIGN WINDOW. Both boundaries are calendar dates enacted in
736
+ one article of one instrument, which is why `statutory-date` is earned
737
+ here rather than asserted. The window is a PERMISSION, not a mandate — art.
738
+ 12 opens "Par derogation aux dispositions de l'article 11, les dispositions
739
+ suivantes s'appliquent aux plaques d'immatriculation des vehicules
740
+ immatricules avant le 1er juillet 2003", and §3 says such vehicles "peuvent
741
+ etre munis" of this plate. So these designs are what a pre-2003 vehicle MAY
742
+ still lawfully carry today, and the period is an eligibility window keyed
743
+ to FIRST REGISTRATION rather than a manufacturing window. Conformity is
744
+ forced only on a change of owner or on re-registration after the
745
+ registration card lapses (art. 16 §4), with historic vehicles exempted.
746
+
747
+ - id: lu-legacy-yellow-1974
748
+ class: standard
749
+ categories: [car, van, truck, bus, motorcycle, trailer]
750
+ period: { start: 1974, end: 1988 }
751
+ period_evidence: statutory-date
752
+ matching: recall-only
753
+ format:
754
+ pattern: "LL 999"
755
+ regex: '\A(?:\d{2,3}|\d{2}[- ][A-Z]{2}|[A-Z]{2}[- ]\d{2}|[A-Z][- ]\d{4}|[A-Z]{2}[- ]\d{3})\z'
756
+ pattern_note: "the same undated union as lu-legacy-euro-1988 — see that entry's note; art. 16 §1 lists the compositions without dating them"
757
+ design:
758
+ plate: { w: 340, h: 110, unit: mm }
759
+ plate_variants:
760
+ - { w: 240, h: 200, unit: mm, note: "motocycles, with the national L sign below the number on a black field" }
761
+ background: { color: "#F9B700", finish: retroreflective, hex_basis: observed }
762
+ foreground: "#000000"
763
+ band: { side: none }
764
+ national_sign:
765
+ shape: oval
766
+ w: 175
767
+ h: 115
768
+ unit: mm
769
+ background: "#FFFFFF"
770
+ foreground: "#000000"
771
+ note: "art. 12 §6 applies to this window too — the separate rear oval, black L on white"
772
+ construction: { material: aluminium, min_thickness: 1.5, character_relief: 1.5, unit: mm }
773
+ region_encoding: none
774
+ sources:
775
+ - "https://data.legilux.public.lu/eli/etat/leg/rgd/2003/06/17/n2/jo/fr/pdf # RGD 17-06-2003 art. 12 §2: vehicles first registered from 01-01-1974 and before 01-01-1988 may carry front and rear plates of 340 x 110 mm 'avec un fond de couleur jaune retroreflechissante sur lequel sont apposes des caracteres alphanumeriques en couleur noire non retroreflechissante'. Accessed 2026-08-02"
776
+ notes: >-
777
+ THE 1974-1988 DESIGN WINDOW — this is where Luxembourg's yellow comes
778
+ from, and the date is exact. No European element of any kind: the EC
779
+ emblem arrives with the next window and the euroband with the letter
780
+ arrives in 2003. So a Luxembourg plate that is yellow, 340 x 110, and
781
+ carries nothing at its left-hand end is a 1974-1987 first registration,
782
+ which makes this the most datable design in the country.
783
+
784
+ - id: lu-legacy-black
785
+ class: standard
786
+ categories: [car, van, truck, bus, motorcycle, trailer]
787
+ period: { start: 1955, end: 1974 }
788
+ period_evidence: instrument-in-force-upper-bound
789
+ matching: recall-only
790
+ format:
791
+ pattern: "LL 999"
792
+ regex: '\A(?:\d{2,3}|\d{2}[- ][A-Z]{2}|[A-Z]{2}[- ]\d{2}|[A-Z][- ]\d{4}|[A-Z]{2}[- ]\d{3})\z'
793
+ pattern_note: "the same undated union as lu-legacy-euro-1988 — see that entry's note"
794
+ design:
795
+ plate: { w: 340, h: 110, unit: mm }
796
+ plate_variants:
797
+ - { w: 240, h: 200, unit: mm, note: "motocycles, with the national L sign below the number" }
798
+ background: { color: "#000000", finish: painted, hex_basis: observed }
799
+ foreground: "#FFFFFF"
800
+ band: { side: none }
801
+ national_sign:
802
+ shape: oval
803
+ w: 175
804
+ h: 115
805
+ unit: mm
806
+ background: "#FFFFFF"
807
+ foreground: "#000000"
808
+ note: >-
809
+ Required at the rear like the later windows — BUT with the one
810
+ exemption in the instrument that lets the country letter onto the
811
+ plate itself: art. 12 §6's prohibition on incorporating the national
812
+ sign "ne s'applique toutefois ni aux motocycles ni aux vehicules qui
813
+ ont ete immatricules au Luxembourg au nom du proprietaire ou detenteur
814
+ actuel avant le premier janvier 1974". A pre-1974 plate still held by
815
+ the same owner may therefore carry its L, and that exemption is
816
+ personal to the holder — it dies with the sale.
817
+ construction: { material: aluminium, min_thickness: 1.5, character_relief: 1.5, unit: mm }
818
+ region_encoding: none
819
+ sources:
820
+ - "https://data.legilux.public.lu/eli/etat/leg/rgd/2003/06/17/n2/jo/fr/pdf # RGD 17-06-2003 art. 12 §1: vehicles first registered before 01-01-1974 may carry 340 x 110 mm plates 'avec un fond de couleur noire non retroreflechissante, sur lequel les caracteres alphanumeriques sont reproduits en couleur blanche'; art. 12 §6 exemption. Art. 1 and the preamble cite the loi du 14 fevrier 1955 and the arrete grand-ducal du 23 novembre 1955 as the registration regime this all sits under. Accessed 2026-08-02"
821
+ notes: >-
822
+ THE BLACK ERA — white on black, and the one entry in this file whose START
823
+ is not a plate fact. `instrument-in-force-upper-bound` is exact about
824
+ that: the END, 1 January 1974, is enacted in art. 12 §1 and is solid; the
825
+ START, 1955, is the year of the REGISTRATION REGIME this instrument
826
+ descends from — the loi du 14 fevrier 1955 concernant la reglementation de
827
+ la circulation sur toutes les voies publiques and the arrete grand-ducal
828
+ du 23 novembre 1955 portant reglement de la circulation, both cited by
829
+ name in the 2003 instrument's preamble and art. 1. It is a regime date
830
+ standing in for an unknown design date, exactly as es-provincial-numeric
831
+ uses 1900 for a format that begins in 1907, and it is flagged here for the
832
+ same reason: a consumer wanting the design-instrument window should read
833
+ "before 1974" and treat the lower bound as unestablished. THE MISSING
834
+ LINK, pinned for the next pass: art. 19 §2 of the 2003 instrument
835
+ abrogates by name "le reglement grand-ducal modifie du 21 decembre 1991
836
+ sur le mode d'attribution des numeros d'immatriculation et d'identite des
837
+ vehicules", which is the immediate predecessor allocation rule and the
838
+ most likely home of the four legacy compositions. Legilux serves the
839
+ Memorial issue for 21-12-1991 (A n. 86 of 27-12-1991) and that issue does
840
+ NOT contain it — probed, ten ELI ordinals, all returning the same
841
+ tax-and-VAT issue — so the instrument is published under a Memorial this
842
+ pass could not locate. Recorded gap, with the search that failed.