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,1265 @@
1
+ # plates/fr.yml — France (PRD-PLATES gate L1).
2
+ #
3
+ # EVERY format, colour, period and class claim in this file is sourced to one
4
+ # of five French primaries, all fetched 2026-08-02 and pinned per claim below:
5
+ #
6
+ # (1) Arrêté du 9 février 2009 relatif aux MODALITÉS d'immatriculation des
7
+ # véhicules (NOR DEVS0824995A), consolidated to 2 August 2026 — this is
8
+ # where the NUMBER lives, in its annexe VII.
9
+ # (2) Arrêté du 9 février 2009 fixant les CARACTÉRISTIQUES et le mode de pose
10
+ # des plaques d'immatriculation des véhicules (NOR DEVS0824974A),
11
+ # consolidated to 1 January 2026 — this is where the PLATE lives:
12
+ # colours, the Euro-band, the identifiant territorial, the annexe 7
13
+ # special-plate colour table.
14
+ # (3) Arrêté du 23 mars 2009 (NOR DEVS0906197A) — the entry-into-force date.
15
+ # (4) Arrêté du 15 avril 1996 relatif aux plaques d'immatriculation
16
+ # réflectorisées — the colorimetry (chromaticity quadrilaterals).
17
+ # (5) Arrêté du 5 novembre 1984 relatif à l'immatriculation des véhicules
18
+ # (abrogated 31 December 2009) — the one-series-back FNI system.
19
+ # plus code de la route art. R. 317-8 (how many plates, on what) and
20
+ # art. R. 322-2 (the number is attributed "à titre définitif au véhicule").
21
+ #
22
+ # THE FIVE STRUCTURAL FACTS THAT SHAPE THIS FILE
23
+ #
24
+ # 1. FRANCE SPLITS THE NUMBER FROM THE PLATE ACROSS TWO INSTRUMENTS OF THE SAME
25
+ # DAY. Arrêté (1) art. 2 II: "La composition du numéro d'immatriculation
26
+ # présent sur le certificat d'immatriculation figure à l'annexe VII du
27
+ # présent arrêté." Arrêté (2) art. 1: "Le présent arrêté fixe les
28
+ # prescriptions techniques applicables aux plaques d'immatriculation visées
29
+ # à l'article R. 317-8 du code de la route et à leur contenu réglementaire."
30
+ # Every series below therefore cites TWO texts, and a claim sourced to the
31
+ # wrong one of the pair is a defect. Both are dated 9 February 2009 and both
32
+ # are commonly cited as "l'arrêté du 9 février 2009", which is exactly how
33
+ # format claims get mis-attributed.
34
+ #
35
+ # 2. THE DÉPARTEMENT ON A MODERN FRENCH PLATE IS NOT A REGION SIGNAL, AND IT IS
36
+ # NOT PART OF THE NUMBER. Annexe VII knows nothing about départements: a SIV
37
+ # number is "2 lettres, suivies de 3 chiffres, suivis de 2 lettres". The
38
+ # département lives in a right-hand blue band, the "identifiant territorial",
39
+ # and arrêté (2) art. 9 says in terms:
40
+ # "Les plaques d'immatriculation des véhicules portant le numéro définitif
41
+ # prévu à l'article R. 322-2 du code de la route doivent comporter un
42
+ # identifiant territorial constitué par le logo officiel d'une région ou
43
+ # de la collectivité européenne d'Alsace et le numéro de l'un des
44
+ # départements de cette collectivité territoriale."
45
+ # "Le choix de cet identifiant territorial est libre et peut ne pas avoir
46
+ # de lien avec le domicile du titulaire du certificat d'immatriculation."
47
+ # That second sentence is the whole French trap, in the authority's own
48
+ # words. region_encoding is `none` on every SIV series in this file and the
49
+ # band is documented as a plate GRAPHIC. The one thing the band DOES
50
+ # constrain is internal consistency — the logo's région must own the
51
+ # number's département — which is why plates/_decode/fr-departements.yml
52
+ # carries the région on every row. The FNI series is the opposite case and
53
+ # decodes properly; see fact 5.
54
+ #
55
+ # 3. THE LETTER ALPHABET IS NOT IN THE LAW. Annexe VII gives SHAPES and nothing
56
+ # else: no excluded letters, no reserved combinations, no progression order.
57
+ # The universally repeated claims that the SIV omits I, O and U, that SS is
58
+ # skipped, and that the series increments right-to-left from AA-001-AA, are
59
+ # NOT in either arrêté, are not on service-public.gouv.fr, and no French
60
+ # government publication stating them was located in this pass. They are
61
+ # recorded as FOLKLORE (commonly repeated, unsourced) in the dossier and are
62
+ # NOT asserted here. Consequence, and it is deliberate: the standard series
63
+ # carries NO alphabet-narrowing `regex_strict`. The only narrowing this file
64
+ # writes is `(?!WW-)`, and that one is sourced — annexe VII C reserves the
65
+ # two-letter group WW for provisional numbers, so a definitive number cannot
66
+ # open with it without colliding with a different series in the same annexe.
67
+ #
68
+ # 4. PERIOD CLAIMS ARE INSTRUMENT-DATED — EXCEPT THE ONE THAT ISN'T. 15 April
69
+ # 2009 is a REAL, primary-sourced start: arrêté (3) art. 1, verbatim, "Les
70
+ # dispositions du décret du 9 février 2009 susvisé et de l'arrêté du
71
+ # 9 février 2009 susvisé relatif aux modalités d'immatriculation des
72
+ # véhicules entrent en vigueur le 15 avril 2009", with art. 2 fixing the
73
+ # same date for the plate provisions. Every SIV series here starts 2009 on
74
+ # that evidence (`period_evidence: enabling-instrument`). The FNI series
75
+ # starts 1984 on `instrument-in-force` evidence only: the system is
76
+ # universally dated to 1950, no primary for 1950 was secured, and inventing
77
+ # one was declined.
78
+ #
79
+ # 5. THE 2026 PINK PLATES ARE A REAL SERIES SPLIT, NOT A COSMETIC ONE. Until
80
+ # 31 December 2025 neither arrêté prescribed ANY colour for WW provisional
81
+ # or W garage plates — verified against the 2009 original and the version in
82
+ # force on 1 June 2025, where annexe 7 has three items and none of them is
83
+ # WW or W. The arrêté du 21 novembre 2025 (NOR INTS2532392A) art. 1 inserted
84
+ # a fourth item — "Le numéro d'immatriculation est reproduit sur chaque
85
+ # plaque d'immatriculation en caractères noirs sur fond rose" — and art. 3
86
+ # fixed its entry into force at 1 January 2026. Design differs, so per
87
+ # PRD-PLATES §2.3 the WW and W garage regimes are each TWO series, split at
88
+ # 2025/2026. A pink French plate cannot predate 2026; that is one of very
89
+ # few hard date signals a French plate carries.
90
+ #
91
+ # REGEX POLICY. As in plates/de.yml and plates/nl.yml, `format.regex` is the
92
+ # lint-round-trippable form (the lint generates serials from `format.pattern`,
93
+ # L -> any A-Z and 9 -> any 0-9, and every one must match). `format.regex_strict`
94
+ # carries the tighter SOURCED form, and in this file it does exactly three
95
+ # things, each of them quoted from the arrêté in the series that carries it:
96
+ # * the WW-collision lookahead on every definitive-number series;
97
+ # * the numeric RANGES of the diplomatic and consular groups (1-199 country,
98
+ # 200-399 delegation country, 400-499 organisation, 500/600/700 fixed,
99
+ # 1-999 and 100-9999 order groups) — every one of which starts at 1, so the
100
+ # strict twins also carry the no-leading-zeros consequence the way
101
+ # plates/de.yml carries Anlage 1's;
102
+ # * the closed organisation letters U/E/S on the CD delegation series.
103
+ # It never narrows an alphabet the law leaves open: the definitive series has
104
+ # no letter restriction at all (fact 3), and the K delegation letters are
105
+ # printed with a trailing ELLIPSIS in annexe VII D.3 where the parallel CD
106
+ # provision ends with a semicolon, so that one series' strict twin narrows its
107
+ # numbers and leaves its letter class at [A-Z].
108
+ #
109
+ # SEPARATOR STRESSOR, FLAGGED FOR THE §2.6 OWNER. Annexe VII D.2 and D.3 print
110
+ # a FULL STOP inside the consular number: "Remarque : les deux derniers groupes
111
+ # de chiffres seront séparés par un point. Exemple : 105 C 1.75." U+002E is in
112
+ # the dataset's FORGIVING set but not in its EMITTED set, so this file cannot
113
+ # spell it. The two affected series (fr-consular-c, fr-consular-k) therefore
114
+ # write a SPACE at that position, with `separator_note` on each saying so and
115
+ # quoting the arrêté. This is the first sourced case in the dataset of an
116
+ # authority prescribing a separator glyph outside the emitted pair, and it is
117
+ # an amendment candidate for plates/_meta/separators.yml — see the dossier.
118
+ # A forgiving consumer is unaffected: U+002E is already strippable, so
119
+ # "105 C 1.75" and "105 C 1 75" canonicalise to the same serial.
120
+ jurisdiction: fr
121
+ authority:
122
+ name: Ministère de l'intérieur — Système d'immatriculation des véhicules (SIV)
123
+ url: "https://www.legifrance.gouv.fr/loda/id/JORFTEXT000020237165"
124
+ binding: vehicle
125
+ binding_note: >-
126
+ Code de la route art. R. 322-2 I, verbatim: "Ce certificat comporte un numéro
127
+ d'immatriculation attribué à titre définitif au véhicule par un système
128
+ informatique centralisé." The number binds to the VEHICLE and, unlike the FNI
129
+ it replaced, follows it for life across owners and across départements. The
130
+ one exception in this file is the W garage series, which binds to a BUSINESS.
131
+ instruments:
132
+ - citation: "Arrêté du 9 février 2009 relatif aux modalités d'immatriculation des véhicules"
133
+ nor: DEVS0824995A
134
+ role: "the NUMBER — composition in annexe VII; the WW and W garage regimes; the diplomatic series"
135
+ date: "2009-02-09"
136
+ consolidated: "2026-08-02"
137
+ source: "https://www.legifrance.gouv.fr/loda/id/JORFTEXT000020237165"
138
+ - citation: "Arrêté du 9 février 2009 fixant les caractéristiques et le mode de pose des plaques d'immatriculation des véhicules"
139
+ nor: DEVS0824974A
140
+ role: "the PLATE — colours, Euro-band, identifiant territorial, annexe 7 special-plate colours, dimensions (annexe 1 bis)"
141
+ date: "2009-02-09"
142
+ consolidated: "2026-01-01"
143
+ source: "https://www.legifrance.gouv.fr/loda/id/JORFTEXT000020237128"
144
+ - citation: "Arrêté du 23 mars 2009 relatif à l'entrée en vigueur de dispositions relatives aux plaques et inscriptions, à la réception et à l'homologation et à l'immatriculation des véhicules"
145
+ nor: DEVS0906197A
146
+ role: "fixes 15 April 2009 as the SIV start"
147
+ date: "2009-03-23"
148
+ source: "https://www.legifrance.gouv.fr/loda/id/JORFTEXT000020446205"
149
+ - citation: "Arrêté du 15 avril 1996 relatif aux plaques d'immatriculation réflectorisées"
150
+ role: "homologation of plates and retroreflective products; the colorimetry"
151
+ date: "1996-04-15"
152
+ consolidated: "2026-01-01"
153
+ source: "https://www.legifrance.gouv.fr/loda/id/JORFTEXT000000193190"
154
+ - citation: "Arrêté du 21 novembre 2025 modifiant les caractéristiques des plaques d'immatriculation des véhicules faisant l'objet d'une immatriculation provisoire en WW ou en W garage"
155
+ nor: INTS2532392A
156
+ role: "creates the black-on-PINK WW / W garage plate from 1 January 2026"
157
+ date: "2025-11-21"
158
+ source: "https://www.legifrance.gouv.fr/jorf/id/JORFTEXT000052971649"
159
+ - citation: "Arrêté du 5 novembre 1984 relatif à l'immatriculation des véhicules"
160
+ role: "the FNI system — abrogated 31 December 2009"
161
+ date: "1984-11-05"
162
+ abrogated: "2009-12-31"
163
+ source: "https://www.legifrance.gouv.fr/loda/id/LEGITEXT000006075077"
164
+
165
+ # ---------------------------------------------------------------------------
166
+ # Jurisdiction-wide facts, cited once and referenced per series.
167
+ # ---------------------------------------------------------------------------
168
+ common:
169
+ colours:
170
+ standard: >-
171
+ Arrêté (2) art. 7 al. 1, verbatim: "Pour les véhicules portant le numéro
172
+ définitif prévu à l'article R. 322-2 du code de la route, le numéro
173
+ d'immatriculation est reproduit sur chaque plaque d'immatriculation en
174
+ caractères noirs non rétroréfléchissants sur fond rétroréfléchissant
175
+ blanc." Note the asymmetry the statute is explicit about and most
176
+ summaries drop: the GROUND retroreflects, the CHARACTERS must not.
177
+ special: >-
178
+ Arrêté (2) art. 7 al. 3: "Pour les immatriculations listées en annexe 7 du
179
+ présent arrêté, les caractéristiques des couleurs des numéros
180
+ d'immatriculation et du fond des plaques d'immatriculation sont définies
181
+ dans cette annexe." Annexe 7 is the complete special-colour table and has
182
+ exactly four items — transit/free-zone (white on red), diplomatic
183
+ (orange or white on jasper green), collection (white on black, optional),
184
+ and, from 1 January 2026 only, WW and W garage (black on pink).
185
+ source: "https://www.legifrance.gouv.fr/loda/id/JORFTEXT000020237128 # art. 7"
186
+ colorimetry:
187
+ note: >-
188
+ The arrêté du 15 avril 1996 fixes each colour as a QUADRILATERAL of
189
+ chromaticity coordinates, not as an RGB or RAL value — so every hex in
190
+ this file is either trivially exact (#FFFFFF, #000000) or a derivation,
191
+ and each one says which it is in `hex_basis`. Values below are the daytime
192
+ coordinates as printed.
193
+ blanc: { points: [[0.350, 0.360], [0.300, 0.310], [0.285, 0.325], [0.335, 0.375]], luminance_factor_min: 0.35 }
194
+ bleu: { points: [[0.078, 0.171], [0.150, 0.220], [0.210, 0.160], [0.137, 0.038]], luminance_factor_min: 0.01 }
195
+ noir: { points: [[0.385, 0.355], [0.300, 0.270], [0.260, 0.310], [0.345, 0.395]] }
196
+ jaune: { points: [[0.545, 0.454], [0.487, 0.423], [0.427, 0.483], [0.465, 0.534]] }
197
+ rose: { points: [[0.345, 0.155], [0.500, 0.195], [0.470, 0.295], [0.365, 0.280]], added: "2026-01-01" }
198
+ not_specified: [rouge, vert-jaspe, orangé]
199
+ not_specified_note: >-
200
+ The three annexe-7 colours that matter most for the special series — the
201
+ transit RED, the diplomatic JASPER GREEN and the diplomatic ORANGE — have
202
+ NO coordinates anywhere in the 1996 arrêté's table. They are named and not
203
+ numbered, exactly as PRD-PLATES found for the German green and red plates.
204
+ Their hexes below are marked `observed` and are the weakest colour claims
205
+ in this file.
206
+ source: "https://www.legifrance.gouv.fr/loda/id/JORFTEXT000000193190 # tableau des coordonnées trichromatiques (jour); art. 1 bis added 2026-01-01 exempting pink WW/W plates from the art. 1 homologation rule while binding them to the pink coordinates"
207
+ euro_band:
208
+ side: left
209
+ content: eu-stars+F
210
+ rule: >-
211
+ Arrêté (2) art. 8, verbatim: "Les plaques d'immatriculation des véhicules
212
+ portant le numéro définitif prévu à l'article R. 322-2 du code de la route
213
+ doivent obligatoirement comporter le symbole européen complété de la lettre
214
+ 'F'." — "Le symbole européen complété de la lettre 'F' doit se situer dans
215
+ la partie utile de la plaque d'immatriculation à l'extrémité gauche de
216
+ celle-ci, sur fond bleu rétroréfléchissant." — and the exclusion that
217
+ matters: "Les dispositions du présent article ne sont pas applicables aux
218
+ plaques spécifiques des véhicules immatriculés avec un usage 'véhicule de
219
+ collection'."
220
+ geometry_gap: >-
221
+ The symbol's dimensions are in annexes 1 bis and 6 bis, both of which
222
+ Légifrance publishes only as JO fac-similé IMAGES. No French Euro-band
223
+ geometry was secured in this pass (contrast Germany, whose Anlage 4 gives
224
+ the star-wreath ratio as text).
225
+ source: "https://www.legifrance.gouv.fr/loda/id/JORFTEXT000020237128 # art. 8"
226
+ identifiant_territorial:
227
+ side: right
228
+ optional: false
229
+ owner_chosen: true
230
+ rule: >-
231
+ Arrêté (2) art. 9: the band is "constitué par le logo officiel d'une
232
+ région ou de la collectivité européenne d'Alsace et le numéro de l'un des
233
+ départements de cette collectivité territoriale", it sits "à l'extrémité
234
+ droite" of the useful part "sur fond bleu non obligatoirement
235
+ rétroréfléchissant", it must be "identique sur la plaque avant et sur la
236
+ plaque arrière", and — the sentence that governs every consumer of this
237
+ dataset — "Le choix de cet identifiant territorial est libre et peut ne
238
+ pas avoir de lien avec le domicile du titulaire du certificat
239
+ d'immatriculation." Art. 9 also disapplies the band for the "véhicule
240
+ importé en transit", "véhicule en transit temporaire" and "véhicule de
241
+ collection" usages, and reserves reproduction of the logos to homologated
242
+ plate makers.
243
+ decode: "plates/_decode/fr-departements.yml"
244
+ decode_note: >-
245
+ The decode file exists for the FNI series and for validating the band's
246
+ (région, département) pairing. It must NEVER be used to infer where a
247
+ SIV-numbered vehicle is kept.
248
+ source: "https://www.legifrance.gouv.fr/loda/id/JORFTEXT000020237128 # art. 9"
249
+ font:
250
+ name: null
251
+ statutory_basis: >-
252
+ Arrêté (2) art. 6, verbatim: "Les lettres et les chiffres du numéro
253
+ d'immatriculation sont constitués par des caractères bâtons ne comportant,
254
+ ni rétrécissement, ni empattement, ni ouverture supérieure à 3 mm pour les
255
+ caractères fermés." That is the WHOLE typeface specification in French
256
+ law: sans-serif, no narrowing, no serifs, and closed characters may not
257
+ have an aperture wider than 3 mm.
258
+ licence: >-
259
+ NO NAMED TYPEFACE IS MANDATED — France is a third data point for the EU
260
+ dossier's finding (UK prescribes a drawing, Germany a Schriftmuster,
261
+ France a written description). PRD-PLATES §6 therefore applies at its
262
+ cleanest here: the render layer derives glyphs from the statutory
263
+ description, never from a third-party "plaque" TTF.
264
+ source: "https://www.legifrance.gouv.fr/loda/id/JORFTEXT000020237128 # art. 6"
265
+ dimensions:
266
+ status: sourced
267
+ instrument: "arrêté du 9 février 2009 (plaques) annexe 1 bis, in the version substituted by the arrêté du 7 mai 2020 (NOR TRER2011996A) art. 1er 6°"
268
+ note: >-
269
+ SOURCED, and the route matters because the previous pass could not take
270
+ it. Légifrance publishes annexe 1 bis only as a link to a PDF, and the
271
+ article body says so; but the SUBSTITUTING arrêté is reproduced in full in
272
+ the authenticated electronic Journal officiel, and the JO PDF carries the
273
+ whole table and the three layout plans as embedded images at 350-406 dpi.
274
+ Route: JO nº 0121 du 17/05/2020, texte 8 sur 82, downloaded from
275
+ legifrance.gouv.fr/download/file/…/JOE_TEXTE and read page by page. Every
276
+ figure below is transcribed from that table; the ±/+- tolerances are the
277
+ arrêté's own. Where a widely repeated retail figure exists it is noted as
278
+ what it is — a value INSIDE the statutory tolerance, not the nominal.
279
+ unit: mm
280
+ formats:
281
+ - id: long
282
+ annexe: "annexe 2 — cas général, 1 ligne"
283
+ length_overall: { nominal: 508, tolerance: "+14/-0", drawing_note: "the plan dimensions the physical support 520 ±2; the 520 mm plate sold everywhere in France is the +12 case" }
284
+ height_overall: { nominal: 98, tolerance: "+14/-0", with_bavette: { nominal: 120, tolerance: "+10/-2" } }
285
+ useful: { length_min: 508, height_min: 98 }
286
+ common_form: { w: 520, h: 110, basis: "within tolerance; the manufactured norm" }
287
+ - id: two_line
288
+ annexe: "annexe 3 — cas général, 2 lignes"
289
+ length_overall: { nominal: [263, 288], tolerance: "+14/-0" }
290
+ height_overall: { nominal: 188, tolerance: "+15/-0", with_bavette: { nominal: 210, tolerance: "+10/-3" } }
291
+ useful: { length_min: 263, height_min: 188, note: "263 minimum si longueur hors tout 275 ; 288 minimum si longueur hors tout 300" }
292
+ common_form: { w: 275, h: 200, basis: "within tolerance; the manufactured norm" }
293
+ - id: two_three_wheel
294
+ annexe: "annexe 4 bis — véhicules à deux ou trois roues à moteur et quadricycles à moteur, non carrossés"
295
+ length_overall: { nominal: 198, tolerance: "+14/-0" }
296
+ height_overall: { nominal: 118, tolerance: "+15/-0", with_bavette: { nominal: 140, tolerance: "+10/-3" } }
297
+ useful: { length_min: 198, height_min: 118 }
298
+ common_form: { w: 210, h: 130, basis: "within tolerance; the manufactured norm" }
299
+ corner_radius: { general: { nominal: 9, tolerance: "±3" }, two_three_wheel: { nominal: 8, tolerance: "±2" } }
300
+ characters:
301
+ general: { height: 75, height_tolerance: "±5", width: 39, width_tolerance: "±7", stroke: 11, stroke_tolerance: "±1", pitch_min: 45 }
302
+ two_three_wheel: { height: 45, height_tolerance: "±3", width: 23, width_tolerance: "±6", stroke: 7, stroke_tolerance: "±1", pitch_min: 24 }
303
+ width_exceptions:
304
+ general: { "M": { width: 43, tolerance: "±11" }, "W": { width: 43, tolerance: "±11" }, "1": { width: 25, tolerance: "±7" } }
305
+ two_three_wheel: { "M": { width: 25.5, tolerance: "±6.5" }, "W": { width: 25.5, tolerance: "±6.5" }, "1": { width: 14.5, tolerance: "±4.5" } }
306
+ uniformity: >-
307
+ Verbatim: "Les dimensions (hauteur, largeur, épaisseur) des différents
308
+ caractères d'une même plaque doivent être uniformes, exception faite, le
309
+ cas échéant, de la largeur des caractères 1, M et W." The PITCH is not
310
+ excepted — a French number is effectively monospaced at its entraxe.
311
+ clearances: { to_band_or_identifiant_min: 5, to_useful_edge_vertical_min: 5 }
312
+ tirets:
313
+ general: { length: 15, length_tolerance: "±2", height: 10, height_tolerance: "±1", entraxe: 177, entraxe_tolerance: "±10" }
314
+ two_three_wheel: { length: 10, length_tolerance: "±2", height: 6, height_tolerance: "±1", entraxe: "sans objet" }
315
+ printed_form: >-
316
+ THE STATUTORY GLYPH IS A BAR, NOT A HYPHEN, AND THE TABLE PROVES IT: a
317
+ tiret is 15 mm long and 10 mm high against 75 mm characters — a thick
318
+ short block at the middle of the cap height, which is exactly what issued
319
+ plates show (BK-604-DX, BP-257-RR, EP-651-TE, WW-477-WB). Recorded here
320
+ because `format.separator` can only spell "-", and a consumer drawing a
321
+ typographic hyphen draws the wrong object. Evidence: statutory +
322
+ photographic-observed.
323
+ position: >-
324
+ The two tirets are symmetric about the vertical axis of the useful part
325
+ (annexe 2 marks the axis at 260 ±5 from the left edge of a 520 mm plate),
326
+ so the layout of every AA-123-AA number is fixed. On the two-line plates
327
+ the FIRST tiret stays at the end of line 1: annexes 3 and 4 bis both draw
328
+ "AB -" over "725-FR" (annexe 3, 55 ±5 below the useful top edge) and
329
+ "AB -" over "948-MZ" (annexe 4 bis, 35 ±5), with the second tiret at
330
+ 3/5 of the useful length (annexe 3) or 126 ±10 from the left (4 bis).
331
+ euro_symbol_zone:
332
+ general: { width_min: 44, height_min: 98, two_line_height: 100, two_line_height_tolerance: "+5/-3" }
333
+ two_three_wheel: { width_min: 29, height: 62, height_tolerance: "+5/-3" }
334
+ note: "annexe 1 bis dimensions the European symbol and the identifiant territorial zone with ONE pair of rows — the two blue zones are the same size, one at each end of the useful part"
335
+ identifiant_territorial_zone:
336
+ logo: { position: "centré dans la moitié supérieure de la zone dédiée", general: { width: 39, width_tolerance: "+0/-5", height: 44, height_tolerance: "+0/-5" }, two_three_wheel: { width: 24, width_tolerance: "+0/-3", height: 27, height_tolerance: "+0/-3" } }
337
+ department_digits:
338
+ general: { height: 32, height_tolerance: "±3", width: 15, width_tolerance: "±2", stroke: 5, stroke_tolerance: "±1" }
339
+ two_three_wheel: { height: 22, height_tolerance: "±2", width: 10, width_tolerance: "±2", stroke: 3, stroke_tolerance: "±1" }
340
+ dom_note: "la taille des caractères du numéro de département DOM peut être ajustée pour un rendu homogène"
341
+ zones_source: "annexe 6 bis (positions of the département marking zones) — still image-only and NOT transcribed here"
342
+ homologation_marking:
343
+ present: true
344
+ position: "bottom right of the useful part, under the identifiant territorial"
345
+ envelope: { width_max: 52, height_max: 35 }
346
+ note: >-
347
+ Annexes 2, 3 and 4 bis all reserve this box and letter it "TPPR XXXX" in
348
+ their illustrative renderings; issued plates carry the plate maker's own
349
+ homologation reference there (observed: "TPPR 6151", "TPPR 11033",
350
+ "P 1116"). The CONTENT is manufacturer-specific and is not modelled.
351
+ remaining_gap: >-
352
+ Annexe 6 bis (the further specification of the European symbol and of the
353
+ département marking zones) and the PRE-2015 annexes 1, 3, 4, 5 and 6 that
354
+ art. 11 bis retired on 1 July 2015 are still published as images only and
355
+ are NOT transcribed. So the cyclomoteur plate issued before 1 July 2015 and
356
+ every FNI-era plate remain dimensionally unsourced.
357
+ sources:
358
+ - "https://www.legifrance.gouv.fr/download/file/RoSk8Ua8lFJWJLVDjh-XCyfJvp_yqT8SIiOnWW6Q0Fc=/JOE_TEXTE # JO nº 0121 du 17/05/2020, texte 8 sur 82 — arrêté du 7 mai 2020 (NOR TRER2011996A), which substitutes annexes 1 bis, 2, 3 and 4 bis in full"
359
+ - "https://www.legifrance.gouv.fr/loda/article_lc/LEGIARTI000041887893 # annexe 1 bis in force — body is a PDF link only, which is why the substituting arrêté is the readable route"
360
+ - "https://www.legifrance.gouv.fr/jorf/id/JORFTEXT000030249176 # arrêté du 11 février 2015 creating annexe 1 bis"
361
+ plate_count:
362
+ rule: >-
363
+ Code de la route art. R. 317-8 I: "Tout véhicule à moteur, à l'exception
364
+ des matériels de travaux publics doit être muni de deux plaques
365
+ d'immatriculation", with motocyclettes, tricycles à moteur, quadricycles à
366
+ moteur, cyclomoteurs and agricultural/forestry vehicles allowed a single
367
+ REAR plate, and W garage vehicles using removable plates. Art. R. 317-8 II
368
+ governs trailers and semi-trailers: separately registered above the
369
+ regulatory mass, otherwise carrying a plate that reproduces the towing
370
+ vehicle's number. Art. R. 317-8 IV delegates the characteristics to the
371
+ two ministers, which is the hook arrêté (2) hangs on.
372
+ source: "https://www.legifrance.gouv.fr/codes/article_lc/LEGIARTI000042266062 # art. R. 317-8, version en vigueur depuis le 16 juin 2025"
373
+ usages:
374
+ note: >-
375
+ France models several plate-relevant categories not as number series but
376
+ as "mentions relatives à l'usage du véhicule" on the certificat. Arrêté
377
+ (1) art. 4 lists them verbatim: "véhicule administration civile de
378
+ l'Etat-code TGPE", "véhicule militaire-numéro militaire", "véhicule
379
+ agricole-numéro d'exploitation", "véhicule de démonstration-date de fin de
380
+ validité de l'usage", "véhicule de collection", "véhicule en transit
381
+ temporaire-date de fin de validité de l'usage", "véhicule importé en
382
+ transit-date de fin de validité de l'usage", "véhicule zone franche du
383
+ pays de Gex", "véhicule zone franche de Haute-Savoie". Only three of the
384
+ nine change the PLATE (collection, and the two transit usages, plus the
385
+ two free-zone usages by annexe 7 item 1); the rest are certificate-only
386
+ and are therefore NOT series here.
387
+ military_gap: >-
388
+ MILITARY IS A RECORDED GAP. The "véhicule militaire" usage shows that a
389
+ separate "numéro militaire" exists alongside the SIV number, but neither
390
+ arrêté states its composition and no defence-ministry instrument was
391
+ located in this pass. French military plates are consequently NOT modelled
392
+ — deliberately, rather than guessed.
393
+ source: "https://www.legifrance.gouv.fr/loda/article_lc/LEGIARTI000049860467 # art. 4"
394
+
395
+ series:
396
+
397
+ # =========================================================================
398
+ # THE STANDARD SERIES — SIV, 15 April 2009 onward. AA-123-AA.
399
+ # =========================================================================
400
+ - id: fr-siv-standard
401
+ class: standard
402
+ categories: [car, van, truck, bus, trailer, semitrailer, tractor, machine]
403
+ period: { start: 2009 }
404
+ period_evidence: enabling-instrument
405
+ matching: strict
406
+ format:
407
+ pattern: "LL-999-LL"
408
+ regex: '\A[A-Z]{2}-\d{3}-[A-Z]{2}\z'
409
+ regex_strict: '\A(?!WW-)[A-Z]{2}-\d{3}-[A-Z]{2}\z'
410
+ grammar: >-
411
+ Annexe VII A, verbatim: "Le numéro d'immatriculation attribué à titre
412
+ définitif au véhicule se compose des éléments suivants : 2 lettres,
413
+ suivies de 3 chiffres, suivis de 2 lettres, les blocs de chiffres et de
414
+ lettres étant séparés par des tirets. Exemple : AA-111-AA."
415
+ charset:
416
+ letters_excluded: []
417
+ notes: >-
418
+ NO LETTER IS EXCLUDED BY THE LAW. Annexe VII states shapes only. The
419
+ familiar claim that I, O and U are never issued (as lookalikes of 1, 0
420
+ and V) and that SS is skipped appears in no French primary located in
421
+ this pass and is recorded as folklore in the dossier, NOT as data.
422
+ `regex_strict` therefore narrows on exactly one sourced ground: annexe
423
+ VII C assigns the two-letter group WW to provisional numbers, so a
424
+ definitive number opening "WW-" would collide with a different series
425
+ of the same annexe.
426
+ progression: >-
427
+ NOT SOURCED. Neither arrêté states an allocation order. The widely
428
+ repeated right-to-left increment (digits, then the right letter pair,
429
+ then the left) and the 277,977,744-combination count are folklore here
430
+ until a French primary states them — which matters, because the parse
431
+ API's French age inference depends entirely on that ordering.
432
+ separator: "-"
433
+ separator_note: >-
434
+ The hyphens are PRINTED and are regulated objects, not typography:
435
+ arrêté (2) art. 6 requires "les caractères et les tirets" to resist use
436
+ and forbids repositioning a detached one, and art. 10 I requires the
437
+ tirets to be integrated at manufacture. Art. 7 last sentence: "La
438
+ définition, les dimensions, l'ordre et l'espacement des tirets sont
439
+ fixés par le tableau à l'annexe 1 bis et par les plans aux annexes 2 à
440
+ 4 bis" — and that geometry is now transcribed under common.dimensions.
441
+ THE PRINTED FORM IS A BAR, NOT A HYPHEN: annexe 1 bis dimensions a tiret
442
+ at 15 x 10 mm against 75 mm characters, and issued plates BK-604-DX,
443
+ BP-257-RR, EP-651-TE and WW-477-WB all show a thick short block at the
444
+ middle of the cap height. A consumer drawing a typographic hyphen draws
445
+ the wrong object. Evidence: statutory + photographic-observed.
446
+ design:
447
+ plate: { w: 520, h: 110, unit: mm, source: "annexe 1 bis, cas général 1 ligne (508 +14/-0 x 98 +14/-0 hors tout; the plan draws the support at 520 ±2)" }
448
+ plate_variants:
449
+ - { w: 275, h: 200, lines: 2, source: "annexe 1 bis / annexe 3, cas général 2 lignes (263 utile mini si longueur hors tout 275; hauteur hors tout 188 +15/-0)" }
450
+ - { w: 300, h: 210, lines: 2, source: "annexe 1 bis / annexe 3, the second two-line size (288 utile mini si longueur hors tout 300; avec bavette 210 +10/-3)" }
451
+ background: { color: "#FFFFFF", finish: retroreflective, hex_basis: spec, spec_note: "arrêté (2) art. 7: 'fond rétroréfléchissant blanc'; the white chromaticity quadrilateral and luminance factor >= 0.35 are in the arrêté du 15 avril 1996" }
452
+ foreground: "#000000"
453
+ foreground_note: "'caractères noirs NON rétroréfléchissants' — the characters are required not to retroreflect, unlike the ground"
454
+ band: { side: left, color: "#003399", content: eu-stars+F, hex_basis: observed, note: "art. 8 requires the European symbol completed by 'F' on a retroreflective blue ground; the 1996 arrêté gives the blue only as a chromaticity quadrilateral, so the hex is the conventional EU blue and is observed, not specified" }
455
+ extra_field:
456
+ position: right
457
+ content: "identifiant territorial — official logo of a région (or of the collectivité européenne d'Alsace) plus the number of one of its départements"
458
+ background: "blue, not necessarily retroreflective"
459
+ owner_chosen: true
460
+ note: "art. 9; identical front and rear; reproduced only by homologated manufacturers"
461
+ emblem: { present: true, rendered: placeholder, note: "the identifiant territorial carries an official REGIONAL LOGO — 18 régions plus the collectivité européenne d'Alsace, none HELD. LICENCE ROUTE, corrected by reading art. 9 to its end: the logos are declared officiels ET LIBRES DE DROIT, and the article names their publisher — verbatim, 'Les logos des collectivités territoriales officiels et libres de droit, qui figurent sur le site internet du ministère de l intérieur : http://www.interieur.gouv.fr/, ne peuvent être reproduits sur les plaques d immatriculation que par le seul fabricant de plaques ou de matériau réfléchissant titulaire d homologation.' The reservation that follows is about reproducing them ON PLATES by makers without homologation — a manufacturing rule — and it sits after the words 'libres de droit'. So the blocker is ACQUIRING the official files, not their licence. PRD-PLATES §3 placeholder rule still applies until they are held and ledgered." }
462
+ shape_note: "art. 5: the useful part is rectangular with the long side horizontal; the physical support must be symmetric about a vertical axis and may be slightly curved; a lower 'bavette' outside the useful part may carry only the seller's or fitter's references"
463
+ background_pattern_rule: "art. 5: 'Les trames de fonds de plaques ne doivent pas comporter de caractères explicites (lettre ou symbole) ou ostentatoires' — decorative background textures are allowed, explicit letters or symbols in them are not"
464
+ rear_differs: false
465
+ display: "two plates (front and rear) on motor vehicles per art. R. 317-8 I"
466
+ region_encoding: none
467
+ region_encoding_mechanism: >-
468
+ NONE — and this is the headline French fact. The SIV number is attributed
469
+ "à titre définitif au véhicule par un système informatique centralisé"
470
+ (art. R. 322-2 I) in one national series; it contains no geographic group,
471
+ it does not change when the keeper moves, and the département shown on the
472
+ plate is a freely chosen graphic (art. 9 of arrêté (2), quoted in full in
473
+ this file's header). plates/_decode/fr-departements.yml exists to decode
474
+ the FNI series and to validate the band's (région, département) pairing —
475
+ never to place a SIV-numbered vehicle.
476
+ variants:
477
+ - class: trailer
478
+ note: >-
479
+ Trailers and semi-trailers below the mass threshold of art. R. 317-8 II
480
+ carry a plate REPRODUCING the towing vehicle's number rather than one
481
+ of their own, and it may be removable. Format-identical and
482
+ colour-identical, so a sub-entry per PRD-PLATES §2.3 and not a series.
483
+ sources:
484
+ - "https://www.legifrance.gouv.fr/codes/article_lc/LEGIARTI000042266062 # art. R. 317-8 II"
485
+ sources:
486
+ - "https://www.legifrance.gouv.fr/loda/article_lc/LEGIARTI000030801732 # annexe VII A: '2 lettres, suivies de 3 chiffres, suivis de 2 lettres ... Exemple : AA-111-AA'"
487
+ - "https://www.legifrance.gouv.fr/loda/id/JORFTEXT000020237128 # art. 5-10: plate constitution, caractères bâtons, black on retroreflective white, European symbol + F, identifiant territorial and its free choice"
488
+ - "https://www.legifrance.gouv.fr/loda/id/JORFTEXT000020446205 # arrêté du 23 mars 2009 art. 1-2: the SIV enters into force 15 April 2009"
489
+ - "https://www.legifrance.gouv.fr/codes/article_lc/LEGIARTI000032401205 # code de la route art. R. 322-2 I: number attributed 'à titre définitif au véhicule par un système informatique centralisé'"
490
+ - "https://www.legifrance.gouv.fr/codes/article_lc/LEGIARTI000042266062 # code de la route art. R. 317-8: two plates, trailer rules, delegation to the ministers"
491
+ - "https://www.legifrance.gouv.fr/loda/id/JORFTEXT000000193190 # arrêté du 15 avril 1996: homologation + the white and blue chromaticity quadrilaterals"
492
+ notes: >-
493
+ THE FRENCH STANDARD SERIES, and the cleanest "looks geographic, is not"
494
+ case in the dataset. Three cautions a consumer needs. (i) The number is
495
+ permanent and national: no département group, no re-registration on a
496
+ move, and therefore no region signal at all — the blue band on the right
497
+ is decoration the owner picked. (ii) The alphabet is unsourced: this file
498
+ accepts every A-Z in both letter pairs because French law restricts
499
+ neither, and the famous I/O/U exclusion is folklore until a primary lands.
500
+ (iii) The series has been open since 15 April 2009 with no announced
501
+ successor; art. R. 322-2 makes the number die with the vehicle, not with
502
+ the owner.
503
+
504
+ # =========================================================================
505
+ # MOTORCYCLES — same number, different plate regime.
506
+ # =========================================================================
507
+ - id: fr-siv-motorcycle
508
+ class: motorcycle
509
+ categories: [motorcycle]
510
+ period: { start: 2009 }
511
+ period_evidence: enabling-instrument
512
+ matching: strict
513
+ format:
514
+ pattern: "LL-999-LL"
515
+ regex: '\A[A-Z]{2}-\d{3}-[A-Z]{2}\z'
516
+ regex_strict: '\A(?!WW-)[A-Z]{2}-\d{3}-[A-Z]{2}\z'
517
+ charset: { notes: "annexe VII A applies unchanged — motorcycles take the ordinary definitive number" }
518
+ design:
519
+ plate: { w: 210, h: 130, unit: mm, lines: 2, source: "annexe 1 bis / annexe 4 bis, véhicules à deux ou trois roues (198 +14/-0 x 118 +15/-0 hors tout)" }
520
+ background: { color: "#FFFFFF", finish: retroreflective, hex_basis: spec }
521
+ foreground: "#000000"
522
+ band: { side: left, color: "#003399", content: eu-stars+F, hex_basis: observed }
523
+ rear_differs: true
524
+ display: "ONE plate, rear only — art. R. 317-8 I allows motocyclettes, tricycles à moteur, quadricycles à moteur non carrossés and cyclomoteurs a single rear plate"
525
+ layout: "two lines, per the plans in annexe 4 bis (the motorcycle/moped-specific layout annexe created in 2015)"
526
+ dimensions_note: >-
527
+ The 2015 reform is dated and sourced even though its numbers are not:
528
+ arrêté (2) art. 11 bis, verbatim, "Les plaques d'immatriculation des
529
+ motocyclettes, des tricycles à moteur, des quadricycles à moteur, non
530
+ carrossés, et des cyclomoteurs posées avant le 1er juillet 2015, dont
531
+ les dimensions et caractéristiques étaient prévues aux annexes 1, 3, 4,
532
+ 5 et 6 de l'arrêté du 9 février 2009 susvisé doivent être remplacées
533
+ avant le 1er juillet 2017 par des plaques d'immatriculation dont les
534
+ dimensions et caractéristiques sont prévues aux annexes 1 bis, 3, 4 bis
535
+ et 6 bis." So there IS a hard French motorcycle-plate size change with a
536
+ 1 July 2015 start and a 1 July 2017 compliance deadline — and the mm on
537
+ both sides of it are in image-only annexes (see the dimensions gap).
538
+ The frequently quoted 210 x 130 mm is NOT sourced here.
539
+ region_encoding: none
540
+ sources:
541
+ - "https://www.legifrance.gouv.fr/loda/article_lc/LEGIARTI000030801732 # annexe VII A — motorcycles take the ordinary definitive number"
542
+ - "https://www.legifrance.gouv.fr/codes/article_lc/LEGIARTI000042266062 # art. R. 317-8 I: single rear plate for motocyclettes, tricycles, quadricycles non carrossés, cyclomoteurs"
543
+ - "https://www.legifrance.gouv.fr/loda/id/JORFTEXT000020237128 # art. 7 (two-line layout per annexes 3 à 4 bis) and art. 11 bis (the 1 July 2015 / 1 July 2017 replacement rule)"
544
+ notes: >-
545
+ MOTORCYCLES. Its own series and not a variant of fr-siv-standard because
546
+ the plate regime differs on three sourced points: one plate instead of two
547
+ (art. R. 317-8 I), its own layout annexe (4 bis), and a statutory
548
+ dimensional cut-over on 1 July 2015 with a 1 July 2017 deadline
549
+ (art. 11 bis). The NUMBER is identical to a car's, so a French motorcycle
550
+ registration is not distinguishable from a car's by string alone — the
551
+ exact opposite of the Netherlands, where the first letter encodes the
552
+ category.
553
+
554
+ # =========================================================================
555
+ # MOPEDS — two series, split by annexe VII's own 30 June 2015 boundary.
556
+ # =========================================================================
557
+ - id: fr-siv-cyclomoteur-2009
558
+ class: moped
559
+ categories: [moped]
560
+ period: { start: 2009, end: 2015 }
561
+ period_evidence: enabling-instrument
562
+ matching: strict
563
+ format:
564
+ pattern: "L 99 L"
565
+ regex: '\A[A-Z]{1,2} \d{2,3} [A-Z]\z'
566
+ grammar: >-
567
+ Annexe VII A, second paragraph, verbatim: "Pour le cas particulier des
568
+ cyclomoteurs immatriculés jusqu'au 30 juin 2015, il se compose de 1 à 2
569
+ lettres, suivies de 2 à 3 chiffres, suivis de 1 lettre, avec un espace
570
+ entre les blocs de lettres et le bloc de chiffres. Au-delà de cette
571
+ date, ceux qui ont été préalablement immatriculés suivant ce format
572
+ conservent leur numéro d'immatriculation. Exemple : A 11 A."
573
+ separator: " "
574
+ separator_note: "the arrêté specifies a SPACE here and hyphens for the definitive number — the only French series pair whose separators differ, and a clean illustration of why the dataset commits to a separator set (PRD-PLATES §2.6)"
575
+ design:
576
+ background: { color: "#FFFFFF", finish: retroreflective, hex_basis: spec }
577
+ foreground: "#000000"
578
+ band: { side: left, color: "#003399", content: eu-stars+F, hex_basis: observed }
579
+ display: "one plate, rear only (art. R. 317-8 I)"
580
+ region_encoding: none
581
+ sources:
582
+ - "https://www.legifrance.gouv.fr/loda/article_lc/LEGIARTI000030801732 # annexe VII A second paragraph: the cyclomoteur format and its 30 June 2015 cut-off"
583
+ - "https://www.legifrance.gouv.fr/codes/article_lc/LEGIARTI000042266062 # art. R. 317-8 I: cyclomoteurs carry a single rear plate"
584
+ notes: >-
585
+ THE FRENCH MOPED FORMAT, closed 30 June 2015 — the shortest registration
586
+ in this file (as few as four characters, "A 11 A") and the only French
587
+ series that is NOT the definitive AA-123-AA shape. Two things a parse API
588
+ must carry. (i) The series is CLOSED to new issue but NOT withdrawn: the
589
+ annexe says in terms that mopeds already registered this way "conservent
590
+ leur numéro d'immatriculation", so these strings stay valid indefinitely —
591
+ the ended-but-on-the-road case. (ii) period.start 2009 is the SIV's start,
592
+ not the format's: mopeds became registrable in France before the SIV and
593
+ this shape probably predates 15 April 2009 under the FNI. No primary for
594
+ an earlier start was secured — recorded gap.
595
+
596
+ - id: fr-siv-moped
597
+ class: moped
598
+ categories: [moped]
599
+ period: { start: 2015 }
600
+ period_evidence: enabling-instrument
601
+ matching: strict
602
+ format:
603
+ pattern: "LL-999-LL"
604
+ regex: '\A[A-Z]{2}-\d{3}-[A-Z]{2}\z'
605
+ regex_strict: '\A(?!WW-)[A-Z]{2}-\d{3}-[A-Z]{2}\z'
606
+ charset: { notes: "the cyclomoteur exception in annexe VII A runs 'jusqu'au 30 juin 2015'; from 1 July 2015 a newly registered moped takes the ordinary definitive number" }
607
+ design:
608
+ plate: { w: 210, h: 130, unit: mm, lines: 2, source: "annexe 1 bis / annexe 4 bis — art. 11 bis puts cyclomoteur plates on these annexes from 1 July 2015" }
609
+ background: { color: "#FFFFFF", finish: retroreflective, hex_basis: spec }
610
+ foreground: "#000000"
611
+ band: { side: left, color: "#003399", content: eu-stars+F, hex_basis: observed }
612
+ display: "one plate, rear only (art. R. 317-8 I); two-line layout per annexe 4 bis"
613
+ region_encoding: none
614
+ sources:
615
+ - "https://www.legifrance.gouv.fr/loda/article_lc/LEGIARTI000030801732 # annexe VII A: the cyclomoteur exception ends 30 June 2015"
616
+ - "https://www.legifrance.gouv.fr/loda/id/JORFTEXT000020237128 # art. 11 bis: cyclomoteur plates posed before 1 July 2015 replaced by 1 July 2017 with annexe 1 bis / 4 bis plates"
617
+ notes: >-
618
+ MOPEDS FROM 1 JULY 2015 — the date is the authority's own, written into
619
+ annexe VII as the end of the cyclomoteur exception and into art. 11 bis as
620
+ the start of the new plate annexes. This series overlaps
621
+ fr-siv-cyclomoteur-2009 at 2015 by construction: the old numbers keep
622
+ running while the new shape starts, which is exactly the parallel-issuance
623
+ case PRD-PLATES §2.2 sanctions.
624
+
625
+ # =========================================================================
626
+ # DEALER — W garage. Two series, split by the 2026 pink plate.
627
+ # =========================================================================
628
+ - id: fr-wgarage-2009
629
+ class: dealer
630
+ categories: [car, van, truck, bus, motorcycle, moped, trailer, tractor, machine]
631
+ period: { start: 2009, end: 2025 }
632
+ period_evidence: enabling-instrument
633
+ binding: business
634
+ matching: strict
635
+ format:
636
+ pattern: "W-999-LL"
637
+ regex: '\AW-\d{3}-[A-Z]{2}\z'
638
+ grammar: >-
639
+ Annexe VII B, verbatim: "Le numéro W garage se compose de la lettre W,
640
+ suivie de 3 chiffres, suivis de 2 lettres, les blocs de chiffres et de
641
+ lettres étant séparés par des tirets. Exemple : W-111-AA."
642
+ design:
643
+ plate: { w: 520, h: 110, unit: mm, source: "annexe 1 bis, cas général 1 ligne" }
644
+ background: { finish: retroreflective, note: "NO COLOUR IS PRESCRIBED for W garage plates in any version of the arrêté before 1 January 2026 — verified against the 2009 original and the version in force 1 June 2025, whose annexe 7 has three items, none of them W or WW. Art. 7 al. 1's black-on-white rule is expressly limited to vehicles 'portant le numéro définitif', which a W garage number is not. The colour is therefore a RECORDED GAP for this period, not an assumption." }
645
+ band: { side: left, content: eu-stars+F, note: "art. 8's Euro-symbol duty is written for 'véhicules portant le numéro définitif', so its text does not reach a W garage number; issued plates carry the symbol anyway. Photographic-observed: W-143-AK, black on white, euroband present and NO identifiant territorial." }
646
+ removable: true
647
+ removable_note: "art. R. 317-8 I and arrêté (2) art. 4 allow removable plates for vehicles circulating under a W garage certificate — France's answer to the German rote Kennzeichen"
648
+ region_encoding: none
649
+ validity: { period: "civil year", note: "the W garage certificate runs for the calendar year and carries the end date of validity; renewal is applied for between 1 November and 31 December" }
650
+ sources:
651
+ - "https://www.legifrance.gouv.fr/loda/article_lc/LEGIARTI000030801732 # annexe VII B: W + 3 chiffres + 2 lettres, hyphen-separated"
652
+ - "https://www.legifrance.gouv.fr/loda/article_lc/LEGIARTI000047977247 # art. 9: who may hold a W garage certificate (professionnels du commerce de l'automobile, réparateurs, importateurs, transporteurs, coopératives agricoles, établissements de formation), the permitted uses (essais techniques, transport pour carrossage, présentation à la presse, présentation à l'acheteur, remorquage), the calendar-year validity, and the rule that where the W number is used on an already-registered vehicle 'ce numéro doit seul être utilisé'"
653
+ - "https://www.legifrance.gouv.fr/codes/article_lc/LEGIARTI000042266062 # art. R. 317-8 I: removable plates for W garage vehicles"
654
+ notes: >-
655
+ W GARAGE, 2009-2025 — the French trade plate, and like the German 06 plate
656
+ it binds to a BUSINESS and moves between vehicles, so `binding: business`
657
+ is set and a vehicle-keyed consumer must not join on it. Art. 9's rule
658
+ that where a W number is used on an already-registered vehicle "ce numéro
659
+ doit seul être utilisé" is the tell: the vehicle's own plates come off.
660
+ This entry exists as a separate series from fr-wgarage-2026 solely because
661
+ the DESIGN changed on 1 January 2026 (PRD-PLATES §2.3); the number format
662
+ is identical across the split. TRANSITIONAL GAP: no provision on plates
663
+ ALREADY IN SERVICE on 1 January 2026 was located — whether a pre-2026 W
664
+ garage plate had to be replaced with a pink one, and by when, is
665
+ unresolved, so `period.end: 2025` records the end of the old DESIGN's
666
+ issuance and not necessarily the end of its validity.
667
+
668
+ - id: fr-wgarage-2026
669
+ class: dealer
670
+ categories: [car, van, truck, bus, motorcycle, moped, trailer, tractor, machine]
671
+ period: { start: 2026 }
672
+ period_evidence: enabling-instrument
673
+ binding: business
674
+ matching: strict
675
+ format:
676
+ pattern: "W-999-LL"
677
+ regex: '\AW-\d{3}-[A-Z]{2}\z'
678
+ grammar: "annexe VII B unchanged — the 2025 amendment touched only the plate, never the number"
679
+ design:
680
+ plate: { w: 520, h: 110, unit: mm, source: "annexe 1 bis, cas général 1 ligne — the 2025 amendment changed the colour, not the geometry" }
681
+ background: { color: "#FF41B2", finish: non-retroreflective, hex_basis: derived, hex_note: "DERIVED, NOT STATED. The arrêté names the colour only as 'rose' and binds it to the chromaticity quadrilateral (0.345,0.155) (0.500,0.195) (0.470,0.295) (0.365,0.280) added to the arrêté du 15 avril 1996 by the arrêté du 21 novembre 2025 art. 2. The hex is the sRGB rendering of that quadrilateral's centroid (x=0.4200, y=0.2312) at Y=0.30, red-channel-clipped because the specified pink is outside the sRGB gamut. No photograph was consulted. Flagged for the human pass." }
682
+ foreground: "#000000"
683
+ finish_note: "the new art. 1 bis of the arrêté du 15 avril 1996, verbatim: 'Les dispositions de l'article 1er ne sont pas applicables aux plaques d'immatriculation provisoire WW et immatriculation W garage présentées en caractères noirs sur fond rose.' — pink WW/W plates are exempted from the homologation-and-retroreflective-product regime that binds every other French plate, while still being bound to the pink coordinates"
684
+ band: { side: left, content: eu-stars+F, note: "art. 8's duty is written for definitive numbers; not resolved for pink plates — recorded gap" }
685
+ removable: true
686
+ region_encoding: none
687
+ validity: { period: "civil year" }
688
+ sources:
689
+ - "https://www.legifrance.gouv.fr/loda/article_lc/LEGIARTI000052974050 # annexe 7 item 4 (version en vigueur depuis le 01/01/2026): 'Le numéro d'immatriculation est reproduit sur chaque plaque d'immatriculation en caractères noirs sur fond rose.'"
690
+ - "https://www.legifrance.gouv.fr/jorf/id/JORFTEXT000052971649 # arrêté du 21 novembre 2025 (NOR INTS2532392A) art. 1 (inserts annexe 7 item 4), art. 2 (inserts art. 1 bis and the pink coordinates into the arrêté du 15 avril 1996), art. 3 ('Le présent arrêté entre en vigueur le 1er janvier 2026')"
691
+ - "https://www.legifrance.gouv.fr/loda/article_lc/LEGIARTI000030801732 # annexe VII B: the W garage number composition, unchanged"
692
+ notes: >-
693
+ W GARAGE FROM 1 JANUARY 2026 — black on PINK. The most useful new date
694
+ signal in European plate data: a pink French plate cannot predate 2026,
695
+ and before 2026 no French instrument prescribed any colour for these
696
+ plates at all. Note also what the change reveals about French plate law's
697
+ shape — the pink plate had to be exempted from the 1996 homologation
698
+ arrêté to exist, because a pink retroreflective product is not a
699
+ homologated type.
700
+
701
+ # =========================================================================
702
+ # TEMPORARY — WW. Same 2026 split, same reason.
703
+ # =========================================================================
704
+ - id: fr-ww-2009
705
+ class: temporary
706
+ categories: [car, van, truck, bus, motorcycle, moped, trailer, tractor, machine]
707
+ period: { start: 2009, end: 2025 }
708
+ period_evidence: enabling-instrument
709
+ matching: strict
710
+ format:
711
+ pattern: "WW-999-LL"
712
+ regex: '\AWW-\d{3}-[A-Z]{2}\z'
713
+ grammar: >-
714
+ Annexe VII C, verbatim: "Le numéro WW se compose de deux lettres WW,
715
+ suivies de 3 chiffres, suivis de 2 lettres, les blocs de chiffres et de
716
+ lettres étant séparés par des tirets. Exemple : WW-111-AA."
717
+ fields_note: "the plate additionally bears the WW registration's END-OF-VALIDITY DATE as mm/aa at the right-hand end of the useful part (arrêté (2) art. 7 al. 2) — a field a single pattern string cannot carry"
718
+ design:
719
+ plate: { w: 520, h: 110, unit: mm, source: "annexe 1 bis, cas général 1 ligne" }
720
+ background: { finish: retroreflective, note: "no colour prescribed before 1 January 2026 — same recorded gap as fr-wgarage-2009" }
721
+ band: { side: left, content: eu-stars+F, note: "not written for provisional numbers, but issued plates carry the symbol — photographic-observed (WW-799-VQ, WW-764-AS)" }
722
+ identifiant_territorial: present
723
+ identifiant_territorial_note: "photographic-observed: issued 2009-2025 WW plates carry a full identifiant territorial — WW-799-VQ with the Auvergne-Rhône-Alpes logo over 74, WW-764-AS with Limousin over 19. Art. 9 is not disapplied for WW."
724
+ extra_field:
725
+ position: right
726
+ content: "mm/aa, the end of the WW registration's validity"
727
+ printed: unobserved
728
+ printed_note: >-
729
+ Art. 7 al. 2 requires the expiry on the plate, but no issued 2009-2025
730
+ WW plate located in either pass shows it: the right-hand end carries
731
+ the identifiant territorial instead. The field only becomes visible on
732
+ the 2026 pink plate, whose annexe 7 item 4 puts it there in terms.
733
+ Divergence recorded, not resolved.
734
+ region_encoding: none
735
+ validity:
736
+ months: 4
737
+ months_extended: 6
738
+ note: >-
739
+ Art. 8 II: "Un certificat provisoire d'immatriculation WW est délivré au
740
+ demandeur lui permettant de circuler, pendant quatre mois. Cette durée
741
+ est de six mois pour les véhicules neufs vendus incomplets aux fins de
742
+ carrossage, les machines agricoles automotrices et les véhicules de
743
+ catégories R et S mentionnés au I." — and "L'immatriculation provisoire
744
+ est suivie obligatoirement d'une immatriculation définitive".
745
+ sources:
746
+ - "https://www.legifrance.gouv.fr/loda/article_lc/LEGIARTI000030801732 # annexe VII C: WW + 3 chiffres + 2 lettres"
747
+ - "https://www.legifrance.gouv.fr/loda/article_lc/LEGIARTI000053057758 # art. 8 I: the closed list of WW-eligible vehicles, including 'les véhicules neufs exportés vers les départements d'outre-mer et les collectivités d'outre-mer, vers l'Union européenne ou vers les Etats tiers' and used vehicles 'destinés à être directement exportés en dehors du territoire métropolitain'; art. 8 II: four months, six for incomplete/agricultural"
748
+ - "https://www.legifrance.gouv.fr/loda/id/JORFTEXT000020237128 # art. 7 al. 2: the WW expiry date is reproduced on the plate"
749
+ notes: >-
750
+ WW PROVISIONAL, 2009-2025 — AND FRANCE'S EXPORT PLATE. There is no
751
+ separate French export series: art. 8 I puts export squarely inside WW,
752
+ listing new vehicles exported to the DOM/COM, to the EU or to third
753
+ states, used vehicles bought from a French dealer for direct export, and
754
+ diplomatic vehicles being exported "après restitution de leurs plaques
755
+ diplomatiques aux autorités douanières". A consumer looking for
756
+ `class: export` in France should read this series and fr-ww-2026. The
757
+ four-month validity and the mandatory follow-on definitive registration
758
+ are both in art. 8 II. Same transitional gap as fr-wgarage-2009: nothing
759
+ located governs WW plates already in service on 1 January 2026, so
760
+ `period.end: 2025` closes the old design's issuance, not its validity.
761
+
762
+ - id: fr-ww-2026
763
+ class: temporary
764
+ categories: [car, van, truck, bus, motorcycle, moped, trailer, tractor, machine]
765
+ period: { start: 2026 }
766
+ period_evidence: enabling-instrument
767
+ matching: strict
768
+ format:
769
+ pattern: "WW-999-LL"
770
+ regex: '\AWW-\d{3}-[A-Z]{2}\z'
771
+ grammar: "annexe VII C unchanged"
772
+ fields_note: "mm/aa expiry field at the right-hand end, now specified as black on pink"
773
+ design:
774
+ plate: { w: 520, h: 110, unit: mm, source: "annexe 1 bis, cas général 1 ligne" }
775
+ background: { color: "#FF41B2", finish: non-retroreflective, hex_basis: derived, hex_note: "same derivation as fr-wgarage-2026. The 'no photograph was consulted' caveat is now partly answered: Commons CC0 File:Plaque d'immatriculation provisoire - véhicule en attente d'immatriculation (101).jpg photographs an issued WW-477-WB pink plate, and CC0 File:France 2026 Temporary Plate.png is a vector rendering. Neither is colour-managed, so the hex stays DERIVED — but the colour is no longer unphotographed." }
776
+ foreground: "#000000"
777
+ extra_field: { position: right, content: "mm/aa expiry", foreground: "#000000", background: "rose" }
778
+ band: { side: left, content: eu-stars+F, note: "photographic-observed: the pink plate keeps the blue euroband unchanged (WW-477-WB)" }
779
+ identifiant_territorial: absent
780
+ identifiant_territorial_note: "photographic-observed: the pink plate's right-hand end carries the mm/aa expiry, not an identifiant territorial (WW-477-WB, 06 over 26)"
781
+ region_encoding: none
782
+ validity: { months: 4, months_extended: 6 }
783
+ sources:
784
+ - "https://www.legifrance.gouv.fr/loda/article_lc/LEGIARTI000052974050 # annexe 7 item 4: 'caractères noirs sur fond rose' plus 'La date de fin de validité de l'immatriculation provisoire WW (mm/aa) est reproduite dans la partie utile de la plaque, à l'extrémité droite de celle-ci et en caractères noirs sur fond rose.'"
785
+ - "https://www.legifrance.gouv.fr/jorf/id/JORFTEXT000052971649 # arrêté du 21 novembre 2025 art. 1 and art. 3 (in force 1 January 2026)"
786
+ - "https://www.legifrance.gouv.fr/loda/article_lc/LEGIARTI000053057758 # art. 8, version en vigueur depuis le 01/01/2026"
787
+ notes: >-
788
+ WW PROVISIONAL FROM 1 JANUARY 2026 — black on pink, with the expiry month
789
+ and year in the right-hand field on the same pink ground. Same split logic
790
+ as the W garage pair: identical number, new design, new series. Note that
791
+ art. 8 itself was independently amended with effect from the same date
792
+ (arrêté du 15 décembre 2025 art. 2), so the whole WW regime turns over on
793
+ 1 January 2026 and the human pass should re-read art. 8 rather than assume
794
+ continuity of the eligibility list.
795
+
796
+ # =========================================================================
797
+ # TRANSIT AND FREE-ZONE — the red plates.
798
+ # =========================================================================
799
+ - id: fr-transit-red
800
+ class: temporary
801
+ categories: [car, van, truck, bus, motorcycle, trailer]
802
+ period: { start: 2009 }
803
+ period_evidence: enabling-instrument
804
+ matching: strict
805
+ format:
806
+ pattern: "LL-999-LL"
807
+ regex: '\A[A-Z]{2}-\d{3}-[A-Z]{2}\z'
808
+ regex_strict: '\A(?!WW-)[A-Z]{2}-\d{3}-[A-Z]{2}\z'
809
+ charset: { notes: "these are ORDINARY definitive numbers — annexe VII creates no transit number. What changes is the plate, and the certificate's `usage` mention." }
810
+ fields_note: "for the two transit usages the plate additionally carries the usage's end-of-validity date as mm/aa at the right-hand end, in white on red (annexe 7 item 1). The Gex and Haute-Savoie free-zone usages take the red plate WITHOUT a date."
811
+ design:
812
+ plate: { w: 520, h: 110, unit: mm, source: "annexe 1 bis, cas général 1 ligne" }
813
+ background: { color: "#CC0000", finish: retroreflective, hex_basis: observed, hex_note: "annexe 7 says 'fond rouge' and the arrêté du 15 avril 1996's colorimetric table has NO red row — the colour is named and not numbered, so this hex is observed within a named colour and is one of the weakest claims in the file" }
814
+ foreground: "#FFFFFF"
815
+ band: { side: left, content: eu-stars+F, note: "art. 8 is not disapplied for transit plates (only for collection), so the European symbol is required" }
816
+ extra_field: { position: right, content: "mm/aa end of the usage's validity, white on red — transit usages only" }
817
+ identifiant_territorial: absent
818
+ identifiant_territorial_note: "art. 9 last paragraph expressly disapplies the identifiant territorial to 'véhicule importé en transit' and 'véhicule en transit temporaire' plates — so a red French plate has no département band at all"
819
+ border_rule: { present: true, color: "#FFFFFF", note: "a thin white rule inset about 2 mm from the rim, on two independent photographs (AA-572-BF and EP-651-TE). In neither arrêté; photographic-observed." }
820
+ extra_field_layout: "the mm/aa prints as MONTH OVER YEAR, two short lines stacked at the right-hand end of the useful part (both references)"
821
+ region_encoding: none
822
+ sources:
823
+ - "https://www.legifrance.gouv.fr/loda/article_lc/LEGIARTI000052974050 # annexe 7 item 1: 'Usages \"véhicule en transit temporaire\", \"véhicule importé en transit\", \"véhicule pays de Gex\" et \"véhicule pays de Savoie\" — Le numéro d'immatriculation est reproduit sur chaque plaque d'immatriculation en caractères blancs sur fond rouge.'"
824
+ - "https://www.legifrance.gouv.fr/loda/article_lc/LEGIARTI000049860467 # art. 4: the usages 'véhicule en transit temporaire', 'véhicule importé en transit', 'véhicule zone franche du pays de Gex', 'véhicule zone franche de Haute-Savoie'"
825
+ - "https://www.legifrance.gouv.fr/loda/id/JORFTEXT000020237128 # art. 7 al. 4 (the usage expiry date on the plate), art. 9 last paragraph (no identifiant territorial), art. 10 II (exceptional ministerial authorisations to depart from annexe 7 for 'véhicule importé en transit')"
826
+ notes: >-
827
+ THE RED PLATES — successors of the old TT (transit temporaire) and IT
828
+ (importé en transit) series, plus the two Alpine free-zone usages. Two
829
+ caveats. (i) CLASS CAVEAT: `temporary` fits the two transit usages, whose
830
+ certificate mention itself carries an end-of-validity date, but NOT the
831
+ Gex and Haute-Savoie free-zone usages, which are a customs status rather
832
+ than a short validity — _meta/classes.yml has no fiscal-zone class and the
833
+ four usages share one annexe-7 colour row, so they share one series here.
834
+ (ii) Art. 10 II lets the two ministers authorise, case by case, a plate
835
+ for an "importé en transit" vehicle "dans des caractéristiques n'entrant
836
+ pas dans le cadre défini à l'annexe 7" — a sanctioned escape hatch from
837
+ the design this series records.
838
+
839
+ # =========================================================================
840
+ # COLLECTION — the black plate, and the only French plate with no EU band.
841
+ # =========================================================================
842
+ - id: fr-collection
843
+ class: historic
844
+ categories: [car, van, truck, bus, motorcycle, trailer, tractor, machine]
845
+ period: { start: 2009 }
846
+ period_evidence: enabling-instrument
847
+ matching: strict
848
+ format:
849
+ pattern: "LL-999-LL"
850
+ regex: '\A[A-Z]{2}-\d{3}-[A-Z]{2}\z'
851
+ regex_strict: '\A(?!WW-)[A-Z]{2}-\d{3}-[A-Z]{2}\z'
852
+ charset: { notes: "an ordinary definitive number; annexe VII creates no collection number" }
853
+ design:
854
+ plate: { w: 520, h: 110, unit: mm, source: "annexe 1 bis, cas général 1 ligne" }
855
+ background: { color: "#000000", finish: non-retroreflective, hex_basis: observed, hex_note: "annexe 7 item 3 names 'fond noir'; the 1996 colorimetric table does carry a 'noir' quadrilateral, but for the CHARACTERS of ordinary plates, and no finish is stated for the collection ground — hence observed" }
856
+ foreground: "#FFFFFF"
857
+ optional: true
858
+ optional_note: "annexe 7 item 3 is permissive, not mandatory: 'Le numéro d'immatriculation PEUT être reproduit sur chaque plaque d'immatriculation en caractères blancs sur fond noir.' A collection vehicle may equally run ordinary black-on-white plates, so absence of a black plate proves nothing."
859
+ band: { side: none }
860
+ band_note: >-
861
+ THE ONLY FRENCH PLATE WITHOUT THE EURO-BAND. Arrêté (2) art. 8 last
862
+ paragraph: "Les dispositions du présent article ne sont pas applicables
863
+ aux plaques spécifiques des véhicules immatriculés avec un usage
864
+ 'véhicule de collection'." Art. 9 disapplies the identifiant territorial
865
+ to the same plates. So a black French plate carries the number and
866
+ nothing else — no stars, no F, no département.
867
+ identifiant_territorial: absent
868
+ region_encoding: none
869
+ eligibility:
870
+ note: >-
871
+ Arrêté (1) art. 4 conditions the "véhicule de collection" usage on the
872
+ vehicle satisfying "les dispositions du 6.3 de l'article R. 311-1 du
873
+ code de la route" and not being able to meet art. R. 321-15, with
874
+ supporting documents including an attestation from the manufacturer or
875
+ from the Fédération française des véhicules d'époque.
876
+ threshold_gap: >-
877
+ The age threshold itself lives in art. R. 311-1 6.3, which was NOT
878
+ fetched in this pass. The commonly repeated "30 years" is therefore NOT
879
+ asserted here — the same discipline plates/de.yml applied to the German
880
+ H-Kennzeichen threshold.
881
+ sources:
882
+ - "https://www.legifrance.gouv.fr/loda/article_lc/LEGIARTI000052974050 # annexe 7 item 3: 'Véhicules de collection — Le numéro d'immatriculation peut être reproduit sur chaque plaque d'immatriculation en caractères blancs sur fond noir.'"
883
+ - "https://www.legifrance.gouv.fr/loda/id/JORFTEXT000020237128 # art. 8 last paragraph (no European symbol) and art. 9 last paragraph (no identifiant territorial) for collection plates"
884
+ - "https://www.legifrance.gouv.fr/loda/article_lc/LEGIARTI000049860467 # art. 4: the 'véhicule de collection' usage and its conditions, referring to art. R. 311-1 6.3"
885
+ notes: >-
886
+ VÉHICULE DE COLLECTION — white on black, optional, and stripped of both
887
+ blue bands. Worth stating plainly for the encyclopedia: France did not
888
+ revive a historic FORMAT (contrast the Dutch dark-blue regime, which is
889
+ tied to sidecode 1/2/3 registrations); a French collection vehicle carries
890
+ an ordinary modern AA-123-AA number, merely printed white on black. The
891
+ black plate is also the only French design whose absence of an EU band is
892
+ itself sourced rather than inferred.
893
+
894
+ # =========================================================================
895
+ # DIPLOMATIC AND CONSULAR — annexe VII D. Five entries, one per sourced
896
+ # composition. Colours from annexe 7 item 2.
897
+ # =========================================================================
898
+ - id: fr-diplomatic-cd
899
+ class: diplomatic
900
+ categories: [car, van, motorcycle]
901
+ period: { start: 2009 }
902
+ period_evidence: enabling-instrument
903
+ matching: strict
904
+ format:
905
+ pattern: "999 CD 9999"
906
+ regex: '\A\d{1,3} (?:CMD|CD) \d{1,4}(?: 973)?(?: [ZX])?\z'
907
+ regex_strict: '\A(?:[1-9]|[1-9]\d|1\d{2}|4\d{2}|500|600|700) (?:CMD|CD) [1-9]\d{0,3}(?: 973)?(?: [ZX])?\z'
908
+ regex_strict_note: >-
909
+ The strict twin encodes the numeric ranges annexe VII D.1 actually
910
+ states — first group 1-199, or 400-499 for an international
911
+ organisation, or the fixed 500 (hautes personnalités), 600 (Conseil de
912
+ l'Europe, Strasbourg) and 700 (CIRC, Lyon) — plus the no-leading-zero
913
+ consequence of every range starting at 1. It deliberately does NOT
914
+ enforce the tighter 1-999 sub-range that applies to the second group in
915
+ the hautes-personnalités case only, because a single alternation
916
+ carrying that exception would be less readable than the fact is worth.
917
+ grammar: >-
918
+ Annexe VII D.1. Ambassades: "a) Un premier groupe de un à trois chiffres
919
+ (1 à 199) identifiant le pays représenté ; b) Le sigle CMD (chef de
920
+ mission diplomatique) ou CD (corps diplomatique) ; c) Un deuxième groupe
921
+ de un à quatre chiffres (1 à 9999) indiquant l'ordre d'immatriculation
922
+ par ambassade. Exemple : 100 CD 20." Hautes personnalités: the country
923
+ group is the fixed number 500, the sigle is CD, and the second group
924
+ runs 1 à 999. Organisations internationales: the first group is 400-499,
925
+ with 600 for the Conseil de l'Europe at Strasbourg and 700 for the
926
+ Institut international de recherche sur le cancer at Lyon, then CMD or
927
+ CD, then 1 à 9999. "Pour l'Agence spatiale européenne, en Guyane, le
928
+ numéro d'identification est complété par le chiffre 973. Exemple :
929
+ 405 CD 20 973."
930
+ suffix_rule: >-
931
+ Annexe VII D.4, common to CMD, CD, C and K: a Z is appended at the right
932
+ of the last digit group for a vehicle registered with exemption from the
933
+ certificate tax, and an X for a vehicle belonging to a person who does
934
+ NOT enjoy fiscal or customs immunities. Examples: "105 CD 5 Z",
935
+ "600 CD 20 X".
936
+ range_note: "the country group is 1-199 and the organisation group 400-499 (with the fixed 500, 600, 700 cases) — ranges the regex deliberately does NOT encode, because a numeric range is not a lexical constraint and PRD-PLATES keeps regexes lexical; the ranges are recorded here for the decode layer"
937
+ design:
938
+ background: { color: "#0B5D3B", finish: retroreflective, hex_basis: observed, hex_note: "annexe 7 item 2 says 'fond vert jaspe'; the 1996 colorimetric table has no green row at all, so this is a named colour with no coordinates anywhere in French law — observed, and flagged" }
939
+ foreground: "#E87511"
940
+ foreground_note: "'caractères orangés' — likewise named and not numbered"
941
+ band: { side: none, note: "SETTLED PHOTOGRAPHICALLY, and against the guess: French CD/CMD/C/K plates carry NO European symbol at all. Art. 8's duty is written for 'véhicules portant le numéro définitif', which a diplomatic number is not, and two independent photographs — 168 CD 66 in orange on jasper green, 431 K 12355 in white on jasper green — show a plain coloured face from rim to rim. Evidence: photographic-observed." }
942
+ border_rule: { present: true, color: "as the characters", note: "both references show a thin rule inset about 2 mm from the rim in the character colour, orange on the CD plate and white on the K plate. In neither arrêté; photographic-observed." }
943
+ region_encoding: none
944
+ region_encoding_note: "the leading 1-199 group is a COUNTRY code allocated by the Ministère des affaires étrangères and is NOT published in the arrêté — a diplomatic decode table is L4 work per PRD-PLATES §7 and is deliberately not authored here"
945
+ sources:
946
+ - "https://www.legifrance.gouv.fr/loda/article_lc/LEGIARTI000030801732 # annexe VII D.1 (CMD/CD compositions for ambassades, hautes personnalités and organisations internationales, plus the ESA/Guyane 973 completion) and D.4 (the Z and X suffixes)"
947
+ - "https://www.legifrance.gouv.fr/loda/article_lc/LEGIARTI000052974050 # annexe 7 item 2: 'Séries CMD, CD — Le numéro d'immatriculation est reproduit sur chaque plaque d'immatriculation en caractères orangés sur fond vert jaspe.'"
948
+ - "https://www.legifrance.gouv.fr/codes/article_lc/LEGIARTI000032401205 # code de la route art. R. 322-2 V: diplomatic vehicles' numbers are completed by a status-linked specific number"
949
+ notes: >-
950
+ CMD / CD — the French diplomatic series. Unlike Germany, which signals
951
+ diplomatic status only through an ordinary-looking prefix, France gives
952
+ the corps its own colour scheme, and unlike Spain it uses ONE green for
953
+ four series and distinguishes them by the character colour. Note the
954
+ annexe-7 trap the design must carry: a CD or CMD number is ORANGE on
955
+ green, but the SAME number becomes WHITE on green the moment a Z or X
956
+ suffix is added (annexe 7 item 2, "Cas particulier"), so character colour
957
+ is not a reliable series discriminator on its own.
958
+
959
+ - id: fr-diplomatic-cd-delegation
960
+ class: diplomatic
961
+ categories: [car, van, motorcycle]
962
+ period: { start: 2009 }
963
+ period_evidence: enabling-instrument
964
+ matching: strict
965
+ format:
966
+ pattern: "L 999 CD 999"
967
+ regex: '\A[A-Z] \d{3} (?:CMD|CD) \d{1,3}(?: [ZX])?\z'
968
+ regex_strict: '\A[UES] (?:2\d{2}|3\d{2}) (?:CMD|CD) (?:[1-9]|[1-9]\d|[1-9]\d{2})(?: [ZX])?\z'
969
+ grammar: >-
970
+ Annexe VII D.1, délégations auprès des organisations internationales:
971
+ "une lettre désignant l'organisation : U (UNESCO), E (OCDE), S (Conseil
972
+ de l'Europe) ; un premier groupe de trois chiffres (200 à 399)
973
+ identifiant le pays représenté ; le sigle CMD ou CD ; un deuxième groupe
974
+ de un à trois chiffres (1 à 999) indiquant l'ordre d'immatriculation par
975
+ délégation. Exemple : U 300 CD 20."
976
+ charset:
977
+ organisation_letters: [U, E, S]
978
+ notes: >-
979
+ The CD delegation list is CLOSED in the arrêté's own punctuation — it
980
+ ends with a semicolon after "S (Conseil de l'Europe)". That is why
981
+ this series carries a regex_strict on [UES] and the K delegation
982
+ series below does not: the K list ends with an ellipsis.
983
+ design:
984
+ background: { color: "#0B5D3B", finish: retroreflective, hex_basis: observed }
985
+ foreground: "#E87511"
986
+ band: { side: left, content: eu-stars+F }
987
+ region_encoding: none
988
+ sources:
989
+ - "https://www.legifrance.gouv.fr/loda/article_lc/LEGIARTI000030801732 # annexe VII D.1, délégations: the organisation letter, the 200-399 country group, CMD/CD, and the 1-999 order group"
990
+ - "https://www.legifrance.gouv.fr/loda/article_lc/LEGIARTI000052974050 # annexe 7 item 2: orange on jasper green"
991
+ notes: >-
992
+ CD DELEGATIONS TO INTERNATIONAL ORGANISATIONS — the only French series
993
+ that opens with a bare organisation letter, which makes "U 300 CD 20"
994
+ trivially separable from an embassy's "100 CD 20". Distinct from
995
+ fr-diplomatic-cd because the composition has a leading letter and a
996
+ three-digit country group in a different range.
997
+
998
+ - id: fr-consular-c
999
+ class: consular
1000
+ categories: [car, van, motorcycle]
1001
+ period: { start: 2009 }
1002
+ period_evidence: enabling-instrument
1003
+ matching: strict
1004
+ format:
1005
+ pattern: "999 C 999 99"
1006
+ regex: '\A\d{1,3} C \d{1,3} \d{2,3}(?: [ZX])?\z'
1007
+ regex_strict: '\A(?:[1-9]|[1-9]\d|1\d{2}) C (?:[1-9]|[1-9]\d|[1-9]\d{2}) \d{2,3}(?: [ZX])?\z'
1008
+ regex_strict_note: "annexe VII D.2's own ranges: country group 1-199, consular order group 1-999 — both starting at 1, hence no leading zeros"
1009
+ grammar: >-
1010
+ Annexe VII D.2, verbatim: "un premier groupe de un à trois chiffres
1011
+ (1 à 199) identifiant le pays représenté ; la lettre C (corps
1012
+ consulaire) ; un deuxième groupe de un à trois chiffres (1 à 999)
1013
+ indiquant l'ordre d'immatriculation par consulat ; le numéro du
1014
+ département. Remarque : les deux derniers groupes de chiffres seront
1015
+ séparés par un point. Exemple : 105 C 1.75."
1016
+ separator: " "
1017
+ separator_note: >-
1018
+ THE ARRÊTÉ PRESCRIBES A FULL STOP HERE, NOT A SPACE — "les deux derniers
1019
+ groupes de chiffres seront séparés par un point", example "105 C 1.75".
1020
+ U+002E is in this dataset's FORGIVING set but not its EMITTED set
1021
+ (plates/_meta/separators.yml), so `pattern` and `regex` write a space at
1022
+ that position and this note records the divergence rather than laundering
1023
+ it. Consequences: (a) a forgiving consumer is unaffected, because
1024
+ stripping the forgiving set turns both "105 C 1.75" and "105 C 1 75"
1025
+ into "105C175"; (b) a strict, printed-form consumer will miss the dotted
1026
+ form; (c) this is the dataset's first sourced case of an authority
1027
+ prescribing a separator outside the emitted pair, and it is an amendment
1028
+ candidate for _meta/separators.yml. See the dossier.
1029
+ trailing_group_note: "the last group is 'le numéro du département' — 2 characters in metropolitan France and 3 for the overseas départements, which is why the regex quantifies \\d{2,3}. Corsican consular numbers would need 2A/2B; no French primary states how the point-separated form handles a letter-bearing département code, and it is NOT invented here"
1030
+ design:
1031
+ background: { color: "#0B5D3B", finish: retroreflective, hex_basis: observed }
1032
+ foreground: "#FFFFFF"
1033
+ foreground_note: "annexe 7 item 2: 'Séries C et K — ... en caractères blancs sur fond vert jaspe.'"
1034
+ band: { side: left, content: eu-stars+F }
1035
+ region_encoding: "plates/_decode/fr-departements.yml"
1036
+ region_encoding_note: >-
1037
+ THE ONE MODERN FRENCH SERIES THAT REALLY DOES ENCODE GEOGRAPHY. The final
1038
+ group is the département of the consular post, written into the number
1039
+ itself by annexe VII D.2 — not a chosen band. It decodes through
1040
+ plates/_decode/fr-departements.yml exactly as an FNI suffix does.
1041
+ sources:
1042
+ - "https://www.legifrance.gouv.fr/loda/article_lc/LEGIARTI000030801732 # annexe VII D.2: the C series composition, the point rule and the département group; D.4 for the Z and X suffixes"
1043
+ - "https://www.legifrance.gouv.fr/loda/article_lc/LEGIARTI000052974050 # annexe 7 item 2: white on jasper green for C and K"
1044
+ notes: >-
1045
+ C — CAREER CONSULAR CORPS, for holders of the carte spéciale CC and for
1046
+ service vehicles of consular posts headed by career consular officers.
1047
+ Two things make it the most interesting French series: it is the only
1048
+ modern French registration whose STRING contains a département, and it is
1049
+ the series that broke the dataset's separator contract (see
1050
+ `separator_note`). A parse API should treat a match here as a genuine
1051
+ region claim, in flat contradiction to the SIV band.
1052
+
1053
+ - id: fr-diplomatic-k
1054
+ class: diplomatic
1055
+ categories: [car, van, motorcycle]
1056
+ period: { start: 2009 }
1057
+ period_evidence: enabling-instrument
1058
+ matching: strict
1059
+ format:
1060
+ pattern: "999 K 9999"
1061
+ regex: '\A\d{1,3} K \d{3,4}(?: (?:973|67))?(?: [ZX])?\z'
1062
+ regex_strict: '\A(?:[1-9]|[1-9]\d|1\d{2}|4\d{2}|600|700) K (?:[1-9]\d{2}|[1-9]\d{3})(?: (?:973|67))?(?: [ZX])?\z'
1063
+ regex_strict_note: "annexe VII D.3's ranges: country group 1-199 or organisation group 400-499 (600 Conseil de l'Europe, 700 CIRC), order group 100-9999. The two completions are LITERALS in the arrêté — 973 for the ESA in Guyane, 67 for the European Parliament's Strasbourg office — so both regexes spell them out rather than quantifying."
1064
+ grammar: >-
1065
+ Annexe VII D.3. Ambassades: "a) Un premier groupe de un à trois chiffres
1066
+ (1 à 199) identifiant le pays représenté ; b) La lettre K ; c) Un
1067
+ deuxième groupe de trois à quatre chiffres (100 à 9999) indiquant
1068
+ l'ordre d'immatriculation par ambassade. Exemple : 105 K 100."
1069
+ Organisations internationales: first group 400-499 (600 for the Conseil
1070
+ de l'Europe at Strasbourg, 700 for the Institut international de
1071
+ recherche sur le cancer at Lyon), then K, then 100 à 9999. "Exemples :
1072
+ 401 K 1000 ; 600 K 100." The ESA in Guyane completes the number with
1073
+ 973 and the European Parliament's Strasbourg secretariat office with 67.
1074
+ note: "the embassy and organisation forms share one lexical shape (1-3 digits, K, 3-4 digits) and are therefore one series; they differ only by the numeric RANGE of the first group, which the regex does not encode"
1075
+ observed_overflow: >-
1076
+ FLAGGED FOR THE VERIFIER. Issued organisation K plates carry FIVE digits
1077
+ in the order group, beyond annexe VII D.3's stated 100 à 9999. Two
1078
+ independent Commons CC0 photographs, both under the 431 organisation
1079
+ code: "431 K 12355" and "431 K 11589 Z". Both regexes above reject them.
1080
+ The annexe is quoted correctly, so either the range has been outgrown in
1081
+ practice or it was amended somewhere not located in this pass; the
1082
+ widening is NOT made here because no instrument was found for it.
1083
+ Evidence: photographic-observed.
1084
+ design:
1085
+ background: { color: "#0B5D3B", finish: retroreflective, hex_basis: observed }
1086
+ foreground: "#FFFFFF"
1087
+ band: { side: left, content: eu-stars+F }
1088
+ region_encoding: none
1089
+ sources:
1090
+ - "https://www.legifrance.gouv.fr/loda/article_lc/LEGIARTI000030801732 # annexe VII D.3, ambassades and organisations internationales; D.4 for Z and X"
1091
+ - "https://www.legifrance.gouv.fr/loda/article_lc/LEGIARTI000052974050 # annexe 7 item 2: white on jasper green"
1092
+ notes: >-
1093
+ K — INTERNATIONAL CIVIL SERVANTS (carte spéciale FI) AND ADMINISTRATIVE
1094
+ AND TECHNICAL STAFF (carte spéciale AT) of missions, consular posts,
1095
+ international organisations and delegations. Not "diplomatic" in the
1096
+ strict Vienna sense at all — annexe VII D.3 defines the series precisely
1097
+ as the NON-assimilated staff — but `_meta/classes.yml` has no vocabulary
1098
+ value between `diplomatic` and `consular`, so `diplomatic` is recorded as
1099
+ the closest fit and this note carries the truth. COLLISION WORTH FLAGGING:
1100
+ an organisation K number completed by 973 or 67 has the same four-group
1101
+ shape as a consulate K number (fr-consular-k), and the two loose regexes
1102
+ genuinely overlap. Only the numeric RANGE of the first group separates
1103
+ them — 400-499/600/700 for an organisation, 1-199 for a consulate — which
1104
+ is why both series carry range-encoding strict twins. A parse API should
1105
+ score on the strict twins here, not the loose ones.
1106
+
1107
+ - id: fr-consular-k
1108
+ class: consular
1109
+ categories: [car, van, motorcycle]
1110
+ period: { start: 2009 }
1111
+ period_evidence: enabling-instrument
1112
+ matching: strict
1113
+ format:
1114
+ pattern: "999 K 999 99"
1115
+ regex: '\A\d{1,3} K \d{1,3} \d{2,3}(?: [ZX])?\z'
1116
+ regex_strict: '\A(?:[1-9]|[1-9]\d|1\d{2}) K (?:[1-9]|[1-9]\d|[1-9]\d{2}) \d{2,3}(?: [ZX])?\z'
1117
+ regex_strict_note: "country group 1-199, consular order group 1-999 (annexe VII D.3, consulats)"
1118
+ grammar: >-
1119
+ Annexe VII D.3, consulats: "un premier groupe de un à trois chiffres
1120
+ (1 à 199) identifiant le pays représenté ; La lettre K ; un deuxième
1121
+ groupe de un à trois chiffres (1 à 999) indiquant l'ordre
1122
+ d'immatriculation par consulat ; le numéro du département, tel qu'il est
1123
+ utilisé dans les séries normales. Remarque : les deux derniers groupes
1124
+ de chiffres seront séparés par un point. Exemple : 105 K 10.75."
1125
+ separator: " "
1126
+ separator_note: "same full-stop divergence as fr-consular-c; see that series' separator_note and the dossier"
1127
+ historic_cross_reference: >-
1128
+ Note the phrase "le numéro du département, TEL QU'IL EST UTILISÉ DANS
1129
+ LES SÉRIES NORMALES". That wording is a 1984 fossil left standing in a
1130
+ 2009 annexe: the "séries normales" that used département numbers were
1131
+ the FNI's, abrogated on 31 December 2009. The consular series is thus
1132
+ the last place in French law where the FNI's geographic convention is
1133
+ still operative.
1134
+ design:
1135
+ background: { color: "#0B5D3B", finish: retroreflective, hex_basis: observed }
1136
+ foreground: "#FFFFFF"
1137
+ band: { side: left, content: eu-stars+F }
1138
+ region_encoding: "plates/_decode/fr-departements.yml"
1139
+ region_encoding_note: "the trailing group is the consular post's département, written into the number — decodable, unlike the SIV band"
1140
+ sources:
1141
+ - "https://www.legifrance.gouv.fr/loda/article_lc/LEGIARTI000030801732 # annexe VII D.3, consulats: composition, the point rule, and the 'tel qu'il est utilisé dans les séries normales' cross-reference"
1142
+ - "https://www.legifrance.gouv.fr/loda/article_lc/LEGIARTI000052974050 # annexe 7 item 2"
1143
+ notes: >-
1144
+ K AT A CONSULAR POST — the administrative-and-technical staff counterpart
1145
+ of the C series, and the second of the two French numbers containing a
1146
+ département. Distinct from fr-diplomatic-k because the composition
1147
+ differs: a consulate K number has FOUR groups and an embassy K number
1148
+ three, and the consulate's order group runs 1-999 where the embassy's runs
1149
+ 100-9999.
1150
+
1151
+ - id: fr-diplomatic-k-delegation
1152
+ class: diplomatic
1153
+ categories: [car, van, motorcycle]
1154
+ period: { start: 2009 }
1155
+ period_evidence: enabling-instrument
1156
+ matching: strict
1157
+ format:
1158
+ pattern: "L 999 K 999"
1159
+ regex: '\A[A-Z] \d{3} K \d{1,3}(?: [ZX])?\z'
1160
+ regex_strict: '\A[A-Z] (?:2\d{2}|3\d{2}) K (?:[1-9]|[1-9]\d|[1-9]\d{2})(?: [ZX])?\z'
1161
+ regex_strict_note: >-
1162
+ THE STRICT TWIN NARROWS THE NUMBERS ONLY AND LEAVES THE LETTER OPEN ON
1163
+ PURPOSE. It encodes annexe VII D.3's country range 200-399 and order
1164
+ range 1-999, and keeps [A-Z] at the organisation position — see
1165
+ `charset.notes` for why closing that class would be an invention.
1166
+ grammar: >-
1167
+ Annexe VII D.3, délégations auprès des organisations internationales:
1168
+ "une lettre désignant l'organisation : U (UNESCO), E (OCDE), S (Conseil
1169
+ de l'Europe)... ; un premier groupe de trois chiffres (200 à 399)
1170
+ identifiant le pays représenté ; la lettre K ; un deuxième groupe de un
1171
+ à trois chiffres (1 à 999) indiquant l'ordre d'immatriculation par
1172
+ délégation. Exemple : U 305 K 10."
1173
+ charset:
1174
+ notes: >-
1175
+ NO regex_strict, deliberately. The organisation-letter list in D.3 is
1176
+ printed with a TRAILING ELLIPSIS — "U (UNESCO), E (OCDE), S (Conseil
1177
+ de l'Europe)..." — where the corresponding D.1 list for CD delegations
1178
+ ends with a plain semicolon. The arrêté therefore leaves the K
1179
+ delegation letters OPEN, and narrowing this regex to [UES] would
1180
+ invent a closure the authority declined to write. The asymmetry
1181
+ between D.1 and D.3 is real and is recorded, not smoothed.
1182
+ design:
1183
+ background: { color: "#0B5D3B", finish: retroreflective, hex_basis: observed }
1184
+ foreground: "#FFFFFF"
1185
+ band: { side: left, content: eu-stars+F }
1186
+ region_encoding: none
1187
+ sources:
1188
+ - "https://www.legifrance.gouv.fr/loda/article_lc/LEGIARTI000030801732 # annexe VII D.3, délégations — note the ellipsis after 'S (Conseil de l'Europe)'"
1189
+ - "https://www.legifrance.gouv.fr/loda/article_lc/LEGIARTI000052974050 # annexe 7 item 2"
1190
+ notes: >-
1191
+ K DELEGATIONS — administrative and technical staff of foreign delegations
1192
+ to international organisations. Modelled separately from fr-diplomatic-k
1193
+ because of the leading organisation letter, and the one series in this
1194
+ file whose strict twin deliberately stops short of its letter class,
1195
+ because of a single typographic detail in the arrêté (an ellipsis where
1196
+ the parallel CD provision has a semicolon) that a paraphrase would erase.
1197
+
1198
+ # =========================================================================
1199
+ # ONE SERIES BACK — the FNI, 1950/1984 to 2009. THE geographic French plate.
1200
+ # =========================================================================
1201
+ - id: fr-fni-1984
1202
+ class: standard
1203
+ categories: [car, van, truck, bus, motorcycle, moped, trailer, semitrailer, tractor, machine]
1204
+ period: { start: 1984, end: 2009 }
1205
+ period_evidence: instrument-in-force
1206
+ # RECALL-ONLY (PRD-PLATES §2.7), and for an unusual reason: the composition
1207
+ # annexe of the governing instrument IS NOT PUBLISHED. Légifrance renders
1208
+ # annexe I of the arrêté du 5 novembre 1984 as the single line "(Annexe non
1209
+ # reproduite, voir JO du 22 décembre 1984 pages 11837 et suivantes". So the
1210
+ # widths below are NOT primary-sourced; the regex is an observed envelope
1211
+ # and a match against it is a shape hit, nothing more.
1212
+ matching: recall-only
1213
+ format:
1214
+ pattern: "999 LL 99"
1215
+ regex: '\A\d{1,4} [A-Z]{1,3} (?:\d{2,3}|2[AB])\z'
1216
+ grammar_gap: >-
1217
+ THE COMPOSITION IS A RECORDED GAP. Arrêté du 5 novembre 1984 art. 1:
1218
+ "La composition des numéros d'immatriculation de toutes les séries
1219
+ susvisées est définie en annexe I du présent arrêté." Annexe I is not
1220
+ reproduced by Légifrance ("Annexe non reproduite, voir JO du 22 décembre
1221
+ 1984 pages 11837 et suivantes"), so the only government-published
1222
+ statement of the FNI shape located in this pass is the example
1223
+ "123 AB 45" on service-public.gouv.fr. The 1-to-4-digit and
1224
+ 1-to-3-letter widths, and the 2A/2B Corsican forms, are the widely
1225
+ repeated envelope and are recorded as recall-only, not as sourced
1226
+ grammar. Next action: the JO of 22 December 1984, pp. 11837 et seq.
1227
+ separator: " "
1228
+ design:
1229
+ background: { color: "#FFFFFF", finish: retroreflective, hex_basis: observed, hex_note: "the FNI-era plate colour rules are in neither arrêté read here; the widely repeated white-front / yellow-rear regime and the date it ended are NOT sourced in this pass" }
1230
+ foreground: "#000000"
1231
+ band: { side: none, note: "unresolved: the EU band became compulsory in France at a date no instrument read here supplies; plates made late in the FNI era carry it and early ones do not" }
1232
+ region_encoding: "plates/_decode/fr-departements.yml"
1233
+ region_encoding_mechanism: >-
1234
+ GENUINELY GEOGRAPHIC, and the reason this series matters. Under the 1984
1235
+ arrêté the certificat was issued "soit par la préfecture du département du
1236
+ domicile du propriétaire" (art. 2) and a change of département was a
1237
+ mutation requiring a new certificate (art. 10 A/B) — so the trailing
1238
+ département group told you where the vehicle was kept, and it CHANGED when
1239
+ the owner moved. Decode right-to-left through
1240
+ plates/_decode/fr-departements.yml, remembering that pre-1976 Corsica
1241
+ (20), the pre-1968 Seine and Seine-et-Oise codes and the pre-1962 Algerian
1242
+ codes are NOT in that table and must resolve to "unknown" rather than to a
1243
+ modern département.
1244
+ sources:
1245
+ - "https://www.legifrance.gouv.fr/loda/id/LEGITEXT000006075077 # arrêté du 5 novembre 1984 relatif à l'immatriculation des véhicules; art. 1 (the series: normales, TT and IT, diplomatic CMD/CD/C/K, W, WW including the export series WAL à WZL and WAE à WZE, FFECSA and DF; composition delegated to annexe I); art. 2 (préfecture du département du domicile); abrogated 31 December 2009"
1246
+ - "https://www.legifrance.gouv.fr/loda/article_lc/LEGIARTI000006889019 # annexe I 'Composition des numéros d'immatriculation' — rendered as '(Annexe non reproduite, voir JO du 22 décembre 1984 pages 11837 et suivantes'. This citation evidences the GAP, not the format."
1247
+ - "https://www.legifrance.gouv.fr/loda/article_lc/LEGIARTI000042128428 # arrêté (1) art. 19 II-III: the 1984 arrêté continues to apply to vehicles without a definitive number until 31 December 2009 at the latest, and such vehicles may keep circulating under their old number until a formality produces a new certificate"
1248
+ - "https://www.legifrance.gouv.fr/loda/id/JORFTEXT000020446205 # arrêté du 23 mars 2009: SIV from 15 April 2009; the former rules run on for already-registered vehicles until 14 October 2009"
1249
+ - "https://www.service-public.gouv.fr/particuliers/vosdroits/F20319 # the French administration's own plate page, giving the old FNI format as '123 AB 45' and the SIV as 'AB-123-CD'"
1250
+ notes: >-
1251
+ THE FNI — France's plate for two human generations, and the one that
1252
+ actually decodes. Four things the dataset has to say honestly. (i) THE
1253
+ PERIOD: 1984 is the date of the instrument that governed the system at its
1254
+ end, not the date the system began; the FNI is universally dated to 1950
1255
+ and no primary for 1950 was secured, so 1950 is recorded as folklore and
1256
+ 1984 as instrument-in-force. (ii) THE END: 2009, but softly — art. 19 III
1257
+ of the 2009 arrêté lets an FNI-numbered vehicle keep circulating under its
1258
+ old number until a formality forces a new certificate, so FNI plates are
1259
+ still legally on French roads in 2026 and a parse API must not treat them
1260
+ as expired. (iii) THE FORMAT is recall-only because the governing annexe
1261
+ is unpublished (see grammar_gap) — the single largest sourcing hole in
1262
+ this file. (iv) THE FAMILY: art. 1 of the 1984 arrêté also names TT and IT
1263
+ special series, W and WW special series including the EXPORT sub-series
1264
+ WAL-WZL and WAE-WZE, and FFECSA/DF series, all of whose compositions live
1265
+ in the same unpublished annexe. None of them is modelled, deliberately.