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,785 @@
1
+ # plates/ro.yml — Romania (PRD-PLATES gate L1, wave 2).
2
+ #
3
+ # WHAT IS PRIMARY HERE AND WHAT IS NOT.
4
+ #
5
+ # The Romanian instrument chain is fully IDENTIFIED — every instrument below is
6
+ # named with its number, its date and its Monitorul Oficial reference — and it
7
+ # was almost entirely UNREACHABLE from this pass's network position.
8
+ # legislatie.just.ro answered four separate requests with a socket hang-up, its
9
+ # print view did the same, the text-extraction proxy returned 422, the fetch tool
10
+ # refuses web.archive.org, and by the second half of the pass every search engine
11
+ # available had either exhausted its budget or moved to a CAPTCHA. The one
12
+ # fragment of instrument text that WAS obtained is art. 23 of the Regulament, and
13
+ # it is quoted verbatim below with its retrieval route stated honestly rather
14
+ # than laundered.
15
+ #
16
+ # EVERYTHING ELSE IS `secondary-wikipedia`, TAGGED PER FACT, WITH THE ARTICLE
17
+ # URL. One `grep -n secondary-wikipedia plates/ro.yml` enumerates the whole
18
+ # Wikipedia-derived surface of this file. A reviewer fingerprinting
19
+ # plates/_decode/ro-counties.yml against Wikipedia should find a match: that is
20
+ # the declared provenance of that table, recorded in the table itself.
21
+ #
22
+ # THE FIVE STRUCTURAL FACTS THAT SHAPE THIS FILE
23
+ #
24
+ # 1. BUCHAREST'S THREE DIGITS ARE A REAL FORMAT FORK, NOT AN ERROR. A Romanian
25
+ # county plate reads `CJ 12 ABC` — two-letter code, TWO digits, three letters.
26
+ # A Bucharest plate reads `B 123 ABC` — one-letter code, THREE digits, three
27
+ # letters. Both are current, both are ordinary standard-issue plates, and they
28
+ # are DIFFERENT SERIAL SPACES. This file models them as separate series
29
+ # (ro-standard-* and ro-bucharest-*) with separate regexes, because a single
30
+ # regex covering both would accept `CJ 123 ABC`, which Romania does not issue.
31
+ #
32
+ # 2. THE STATUTE IS WIDER THAN WHAT IS ISSUED, AND BUCHAREST IS THE PROOF. Art.
33
+ # 23 of the Regulament prescribes "numărul de ordine, format din cifre arabe"
34
+ # and fixes NO NUMBER OF DIGITS. That is why Bucharest could lengthen its
35
+ # order number from two digits to three without any amendment, and it is why
36
+ # every standard series here carries a `regex_statutory` (PRD-PLATES §2.7)
37
+ # that is genuinely wider than its `regex`: the issued grammar is two digits
38
+ # for counties and three for the capital, but the LEGAL bound is any number of
39
+ # Arabic numerals. Romania is the cleanest example of that tier in the dataset
40
+ # so far — us-fl's statutory tier is a charset bound; Romania's is a LENGTH
41
+ # bound the capital has already used.
42
+ #
43
+ # 3. THE 2006 INSTRUMENTS DID NOT START THE 1992 SERIES. H.G. nr. 1.391/2006 and
44
+ # Ordinul M.A.I. nr. 1.501/2006 are the instruments IN FORCE; the format they
45
+ # describe has run since 1992, fourteen years before either was made. This
46
+ # file therefore dates the standard series to 1992 (secondary) and cites the
47
+ # 2006 instruments for the RULE, never for the PERIOD. Doing the opposite —
48
+ # shipping an instrument's own window as the series period — is the documented
49
+ # Spanish failure (a 1999-2000 decree window shipped for a format that ran
50
+ # three decades) and it is the single easiest way to get a plates file wrong.
51
+ #
52
+ # 4. THE PHYSICAL SPEC IS IN TWO ROMANIAN STANDARDS, AND THEY ARE PAYWALLED.
53
+ # SR 13078:1996 ("Vehicule rutiere. Plăci de înmatriculare retroreflectorizante
54
+ # pentru autovehicule şi remorci") and SR 13140:1996 (the content and structure
55
+ # of provisional and running-test numbers) are the Romanian analogue of BS AU
56
+ # 145e and DIN 74069 — building to them is fine, their text is not
57
+ # redistributable, and in this pass neither was purchased or read. They are
58
+ # the reason every colour and every millimetre below is `secondary-wikipedia`
59
+ # with `hex_basis: observed`. This is the same posture PRD-PLATES §4 records
60
+ # for SAE J686: NAMED, UNPINNED, never quoted.
61
+ #
62
+ # 5. ROMANIA'S EU BAND HAS A HARD DATE AND A SOFT ONE. Accession was 1 January
63
+ # 2007, which is a treaty date and not in doubt. That the twelve-star band
64
+ # REPLACED the Romanian tricolour band on plates on or about that date is
65
+ # reported by a secondary and is tagged as such. The design change is modelled
66
+ # as a series boundary (PRD-PLATES §2.3, the same cut plates/it.yml makes at
67
+ # 1999), so each of the two territorial formats appears twice: once with the
68
+ # national band and once with the EU band.
69
+ jurisdiction: ro
70
+ authority:
71
+ name: Direcţia Regim Permise de Conducere şi Înmatriculare a Vehiculelor (D.R.P.C.I.V.), Ministerul Afacerilor Interne — under O.U.G. nr. 195/2002 and its Regulament
72
+ url: "https://legislatie.just.ro/Public/DetaliiDocument/79058"
73
+ binding: vehicle
74
+ binding_note: >-
75
+ VEHICLE-bound. Art. 23 of the Regulament attributes the number at
76
+ înmatriculare, to the vehicle: "La înmatriculare, fiecărui autovehicul şi
77
+ fiecărei remorci li se atribuie câte un număr de înmatriculare". ONE THING THIS
78
+ FILE DOES NOT ESTABLISH, and a marketplace consumer will want it: whether a
79
+ Romanian mark is REASSIGNED when a vehicle moves to another county. Because the
80
+ territorial code is inside the mark, a county change cannot leave the mark
81
+ intact, so re-plating must happen on some trigger — but WHICH trigger, and
82
+ whether an intra-county sale also re-plates, is in the înmatriculare procedure
83
+ (Ordinul M.A.I. nr. 1.501/2006), which was not retrieved. Recorded as a gap
84
+ rather than inferred: the inference is tempting and this file declines it.
85
+ instrument:
86
+ enabling_act:
87
+ citation: "Ordonanţa de urgenţă a Guvernului nr. 195 din 12 decembrie 2002 privind circulaţia pe drumurile publice"
88
+ monitorul_oficial: "M. Of. nr. 958 din 28 decembrie 2002"
89
+ approved_by: "Legea nr. 49 din 8 martie 2006, M. Of. nr. 246 din 20 martie 2006"
90
+ republished: "M. Of. nr. 670 din 3 august 2006"
91
+ relevant_article: "art. 19 — înmatricularea şi înregistrarea vehiculelor"
92
+ implementing_regulation:
93
+ citation: "Regulamentul de aplicare a Ordonanţei de urgenţă a Guvernului nr. 195/2002 privind circulaţia pe drumurile publice, aprobat prin Hotărârea Guvernului nr. 1.391 din 4 octombrie 2006"
94
+ relevant_article: "art. 23 — the composition of the registration number"
95
+ verbatim: >-
96
+ "La înmatriculare, fiecărui autovehicul şi fiecărei remorci li se atribuie
97
+ câte un număr de înmatriculare compus din indicativul judeţului sau al
98
+ municipiului Bucureşti, numărul de ordine, format din cifre arabe, şi o
99
+ combinaţie de trei litere cu caractere latine majuscule."
100
+ retrieval_caveat: >-
101
+ READ THIS BEFORE RELYING ON THE QUOTE. The sentence above is the
102
+ instrument's own text, but it was NOT read off legislatie.just.ro: four
103
+ direct requests to that host, plus its print view, plus a text-extraction
104
+ proxy, all failed (every URL and failure mode is listed in
105
+ plates/_decode/ro-counties.yml `primary_attempts`). It was recovered from a
106
+ search index's rendering of the legislatie.just.ro page. That is one
107
+ remove from the primary. It is cited here as instrument text because it is
108
+ instrument text, and the remove is stated so a verifier re-derives it from
109
+ the source rather than from this file.
110
+ source: "https://legislatie.just.ro/Public/DetaliiDocument/79058 # H.G. nr. 1.391/2006, Regulament, art. 23 — the composition rule. See retrieval_caveat."
111
+ registration_procedure:
112
+ citation: "Ordinul ministrului administraţiei şi internelor nr. 1.501 din 13 noiembrie 2006 privind procedura înmatriculării, înregistrării, radierii şi eliberarea autorizaţiei de circulaţie provizorie sau pentru probe a vehiculelor"
113
+ monitorul_oficial: "M. Of. nr. 941 din 21 noiembrie 2006"
114
+ note: >-
115
+ The instrument that governs the PROVISIONAL and the RUNNING-TEST (probe)
116
+ plate — both are named in its own title, which is why those two series
117
+ below carry `instrument-in-force` for their rule even though this pass could
118
+ not read the Ordin's text. Not retrieved.
119
+ physical_standards:
120
+ - { citation: "SR 13078:1996 — Vehicule rutiere. Plăci de înmatriculare retroreflectorizante pentru autovehicule şi remorci", status: "NAMED, UNPINNED (ASRO, paywalled). Never quoted here." }
121
+ - { citation: "SR 13140:1996 — the content and structure of provisional and running-test registration numbers", status: "NAMED, UNPINNED (ASRO, paywalled). Never quoted here." }
122
+ historic_instruments:
123
+ - { citation: "Legea nr. 121/1947 asupra poliţiei circulaţiei pe drumurile publice", monitorul_oficial: "M. Of., Partea I, nr. 90 din 21 aprilie 1947", status: "locator only — not retrieved" }
124
+ - { citation: "Regulament de aplicare a Legii privitoare la circulaţia automobilelor", monitorul_oficial: "M. Of. nr. 117 din 28 august 1921", status: "locator only — not retrieved" }
125
+ source: "https://en.wikipedia.org/wiki/Vehicle_registration_plates_of_Romania # secondary-wikipedia: the instrument NUMBERS, dates and Monitorul Oficial references in this block were taken from the article's reference apparatus and used as LOCATORS. The instruments themselves are cited individually above. Accessed 2026-08-02"
126
+
127
+ # ---------------------------------------------------------------------------
128
+ # Jurisdiction-wide facts, cited once and referenced per series.
129
+ # ---------------------------------------------------------------------------
130
+ common:
131
+ mark_composition:
132
+ verbatim: "art. 23 al Regulamentului: 'un număr de înmatriculare compus din indicativul judeţului sau al municipiului Bucureşti, numărul de ordine, format din cifre arabe, şi o combinaţie de trei litere cu caractere latine majuscule.'"
133
+ three_elements:
134
+ - "indicativul judeţului sau al municipiului Bucureşti — the territorial code: ONE letter for the capital, TWO for each county (plates/_decode/ro-counties.yml)"
135
+ - "numărul de ordine, format din cifre arabe — an order number in Arabic numerals, WITH NO DIGIT COUNT PRESCRIBED (see header fact 2)"
136
+ - "o combinaţie de trei litere cu caractere latine majuscule — three uppercase Latin letters"
137
+ note: >-
138
+ Three elements, and only the FIRST and the THIRD are bounded by the text.
139
+ The unbounded middle is the whole reason this file ships a
140
+ `regex_statutory` wider than its `regex`, and the reason Bucharest's fork
141
+ required no amendment.
142
+ alphabet:
143
+ evidence_tier: secondary-wikipedia
144
+ letters_excluded_reported: [Q]
145
+ positional_rules_reported:
146
+ - "the three-letter group is reported never to BEGIN with I or O (confusable with 1 and 0)"
147
+ - "III and OOO are reported not to be issued"
148
+ reserved_combinations_reported: [POL, DEP, SNT, SRI, GUV]
149
+ reserved_note: >-
150
+ Reported as reserved for institutions — POL for police, DEP for the Chamber
151
+ of Deputies, SNT for the Senate, SRI for the intelligence service, GUV for
152
+ the Government. These are reservations INSIDE the ordinary serial space, so
153
+ they are recorded here rather than authored as series: a reserved
154
+ combination changes who holds the plate, not the format or the design, and
155
+ PRD-PLATES §2.3 makes that a note and not a series.
156
+ not_encoded_because: >-
157
+ The three restrictions above do not compose into a single sourced alphabet
158
+ (Q excluded everywhere? only in the letter group? is the leading-I/O rule
159
+ about the first letter of the triple or of the whole mark?), and the
160
+ Regulament's own text prescribes only "trei litere cu caractere latine
161
+ majuscule". No `regex_strict` in this file encodes any of them; the strict
162
+ twins carry the COUNTY CODE SET only.
163
+ source: "https://en.wikipedia.org/wiki/Vehicle_registration_plates_of_Romania # letter Q never used; combinations beginning I or O prohibited; III and OOO not allowed; POL/DEP/SNT/SRI/GUV reserved. Accessed 2026-08-02"
164
+ design_defaults:
165
+ evidence_tier: secondary-wikipedia
166
+ plate_sizes:
167
+ - { type: A, w: 520, h: 110, unit: mm, note: "the standard one-row plate; mandatory at the front" }
168
+ - { type: B, w: 340, h: 200, unit: mm, note: "two-row rear plate" }
169
+ - { type: C, w: 240, h: 130, unit: mm, note: "motorcycles only" }
170
+ colours: "black characters on a white retroreflective ground for the standard series"
171
+ spec_note: >-
172
+ The binding spec is SR 13078:1996, which is paywalled and unread (header
173
+ fact 4). Every hex below is therefore `hex_basis: observed` — an observed
174
+ rendering of a named colour — and NOT a spec claim. Contrast plates/de.yml,
175
+ whose RAL values come out of FZV Anlage 3/4, and plates/at.yml, whose CIE
176
+ chromaticity quadrangles come out of KDV Anlage 5e.
177
+ source: "https://en.wikipedia.org/wiki/Vehicle_registration_plates_of_Romania # the three plate sizes and the standard colours. Accessed 2026-08-02"
178
+ band_history:
179
+ evidence_tier: secondary-wikipedia
180
+ shape_note: "expressed as an ordered list below rather than as a map, because the two entries are periods and not keys"
181
+ periods:
182
+ - { from: 1992, to: 2007, content: "Romanian national flag band at the left" }
183
+ - { from: 2007, content: "EU band — twelve stars over the RO country code" }
184
+ accession_note: >-
185
+ Romania acceded to the European Union on 1 January 2007, which is a treaty
186
+ date and is not in doubt. That the band CHANGED on or about that date is
187
+ the secondary's claim, and it is what the series boundary rests on. No
188
+ Romanian instrument prescribing the band's geometry was reached.
189
+ source: "https://en.wikipedia.org/wiki/Vehicle_registration_plates_of_Romania # Romanian flag band 1992-2006, EU band with twelve stars and the RO code from 2007. Accessed 2026-08-02"
190
+ security_upgrade_2024:
191
+ evidence_tier: secondary-wikipedia
192
+ status: "REPORTED, NOT MODELLED AS A SERIES"
193
+ reported: >-
194
+ A new generation of Romanian plates is reported from September 2024,
195
+ carrying a unique personal identification code, a scannable barcode and
196
+ phosphorescent holograms of the Romanian coat of arms running the length of
197
+ the plate. The SERIAL is not reported to change.
198
+ why_not_a_series: >-
199
+ A design change of that size WOULD be a series boundary under PRD-PLATES
200
+ §2.3, and the honest reason it is not authored as one is that the entire
201
+ evidence for it is a single secondary summary with a month and no
202
+ instrument. Authoring `ro-standard-2024` on that basis would put a
203
+ confidently-dated series into the dataset on the weakest evidence in this
204
+ file. It is recorded here instead, and named as the FIRST target for the
205
+ Romanian verifier: find the instrument, and re-cut ro-standard-2007 at its
206
+ commencement date. The series-id contract (PRD-QUALITY I-5/I-6) makes that
207
+ re-cut cheap — a new id plus an alias — which is precisely why waiting is
208
+ the cheap option and guessing is not.
209
+ source: "https://en.wikipedia.org/wiki/Vehicle_registration_plates_of_Romania # the September 2024 security-feature generation. Accessed 2026-08-02"
210
+
211
+ region_encoding_tables:
212
+ reference: "plates/_decode/ro-counties.yml"
213
+ bare_filename: "ro-counties.yml"
214
+ reference_note: >-
215
+ The path form above is the convention every other reference in this dataset
216
+ uses (all 77 decode-file path references across plates/*.yml spell
217
+ `plates/_decode/<file>.yml`), so it is what this file spells; the bare
218
+ filename is carried alongside for a consumer that resolves by name.
219
+ note: >-
220
+ ONE table, TWO structurally different kinds of row, and the file keeps them
221
+ apart on purpose: `municipality` (B — one letter, THREE digits in the serial)
222
+ and `counties` (41 rows — two letters, TWO digits). The split is the format
223
+ fork of header fact 1, made visible in the decode file so a decoder cannot
224
+ treat the capital as a 42nd county.
225
+
226
+ verifier_targets:
227
+ - "The instrument behind the September 2024 security-feature generation. If it exists and is dated, ro-standard-2007 must be re-cut at its commencement."
228
+ - "The statutory annex of county indicative — the whole of plates/_decode/ro-counties.yml is waiting on it. The cheapest known route is the correct legex.ro document id; legex.ro is reachable, its id for HG 1391/2006 is not known."
229
+ - "The ISO 3166-2:RO register, diffed against the 41 county rows. Recorded in the decode file as an UNVERIFIED hypothesis, deliberately not relied on."
230
+ - "The year Bucharest's three-digit order number began. The only source reached says 'around 2010' and this file's period.start for ro-bucharest-2010 is that soft number — the weakest date in the file."
231
+ - "SR 13078:1996, for every colour and dimension here."
232
+
233
+ series:
234
+
235
+ # =========================================================================
236
+ # THE CURRENT COUNTY SERIES — CJ 12 ABC.
237
+ # =========================================================================
238
+ - id: ro-standard-2007
239
+ class: standard
240
+ categories: [car, van, truck, bus, trailer]
241
+ period: { start: 2007 }
242
+ period_evidence: secondary-wikipedia
243
+ period_note: >-
244
+ 2007 is the EU band's arrival, not the serial's. THE SERIAL GRAMMAR HAS RUN
245
+ UNCHANGED SINCE 1992 (see ro-standard-1992) and the 2006 instruments that
246
+ state it are later still — see header fact 3. A consumer wanting "when did
247
+ Romania's current registration mark begin" should read 1992; this series
248
+ answers "when did the plate that carries it start looking like this".
249
+ matching: strict
250
+ format:
251
+ pattern: "LL 99 LLL"
252
+ regex: '\A[A-Z]{2} ?\d{2} ?[A-Z]{3}\z'
253
+ regex_strict: '\A(?:AB|AG|AR|BC|BH|BN|BR|BT|BV|BZ|CJ|CL|CS|CT|CV|DB|DJ|GJ|GL|GR|HD|HR|IF|IL|IS|MH|MM|MS|NT|OT|PH|SB|SJ|SM|SV|TL|TM|TR|VL|VN|VS) ?\d{2} ?[A-Z]{3}\z'
254
+ regex_statutory: '\A[A-Z]{1,2} ?\d+ ?[A-Z]{3}\z'
255
+ tier_note: >-
256
+ THE THREE TIERS, AND WHAT EACH ONE CLAIMS. `regex_strict` is the CLOSED
257
+ COUNTY CODE SET — 41 alternatives, the contents of
258
+ plates/_decode/ro-counties.yml, which is `secondary-wikipedia` and is
259
+ tagged as such there and here. `regex` is the round-trippable printed
260
+ form with any two letters. `regex_statutory` is art. 23's own bound: a
261
+ territorial code, ANY number of Arabic numerals, three uppercase Latin
262
+ letters — and it is the tier that accepts a Bucharest plate too, which is
263
+ correct, because the statute does not distinguish them.
264
+ charset:
265
+ evidence_tier: secondary-wikipedia
266
+ notes: "see common.alphabet — the reported letter restrictions are recorded there and deliberately not encoded."
267
+ separator_note: >-
268
+ Both printed gaps are written as optional emitted SPACEs (PRD-PLATES
269
+ §2.6). No separator GLYPH is prescribed by art. 23, which names three
270
+ element groups and no punctuation between them.
271
+ progression: >-
272
+ Not established. Whether the letter triple or the order number advances
273
+ first, and whether allocation is sequential or pooled, was not sourced —
274
+ so a Romanian plate cannot be dated from its serial by anything in this
275
+ file. Recorded gap.
276
+ design:
277
+ plate: { w: 520, h: 110, unit: mm, note: "type A, mandatory at the front" }
278
+ plate_variants:
279
+ - { w: 340, h: 200, unit: mm, note: "type B, two-row rear plate" }
280
+ background: { color: "#FFFFFF", finish: retroreflective, hex_basis: observed }
281
+ foreground: "#000000"
282
+ band: { side: left, color: "#003399", content: eu-stars+RO, hex_basis: observed, stars_color: "#FFCC00" }
283
+ rear_differs: false
284
+ rear_differs_note: "Same serial front and rear; only the physical TYPE may differ (a type-B two-row plate at the rear where the housing requires it), which is a housing choice and not a front/rear asymmetry of the UK kind."
285
+ evidence_tier: secondary-wikipedia
286
+ region_encoding: "plates/_decode/ro-counties.yml"
287
+ region_encoding_mechanism: >-
288
+ THE TERRITORIAL CODE IS THE FIRST ELEMENT OF THE MARK ITSELF, by art. 23,
289
+ and it denotes the county of REGISTRATION. Romania is therefore unlike
290
+ Italy (where the province survives only on a removable sticker denoting the
291
+ holder's residence) and unlike France (where the SIV département band is
292
+ owner-chosen and decodes to nothing). A Romanian county claim from a
293
+ Romanian serial is a real claim — subject only to the decode table's own
294
+ tier, which is secondary.
295
+ sources:
296
+ - "https://legislatie.just.ro/Public/DetaliiDocument/79058 # H.G. nr. 1.391/2006, Regulament art. 23 — FORMAT, the three elements of the mark, verbatim. See instrument.implementing_regulation.retrieval_caveat"
297
+ - "https://en.wikipedia.org/wiki/Vehicle_registration_plates_of_Romania # secondary-wikipedia: the EU band from 2007 (PERIOD START), the two-digit county order number (FORMAT), colours and the 520x110 / 340x200 sizes (DESIGN). Accessed 2026-08-02"
298
+ - "plates/_decode/ro-counties.yml # the 41 county codes that populate regex_strict — itself secondary-wikipedia, declared there"
299
+ notes: >-
300
+ THE CURRENT ROMANIAN COUNTY PLATE. Two-letter county code, two digits,
301
+ three letters, black on white, EU band. This is the series a parse API will
302
+ hit most often and it is the one place in the file where all three regex
303
+ tiers earn their keep at once: the strict twin knows the 41 codes, the
304
+ middle one knows the printed shape, and the statutory one knows that art.
305
+ 23 never fixed a digit count. Distinct from ro-standard-1992 in DESIGN
306
+ only — the serial ran continuously across the 2007 boundary and plates
307
+ issued before it were not recalled, so both designs are on the road today.
308
+
309
+ - id: ro-standard-1992
310
+ class: standard
311
+ categories: [car, van, truck, bus, trailer]
312
+ period: { start: 1992, end: 2007 }
313
+ period_evidence: secondary-wikipedia
314
+ period_note: >-
315
+ THE DATE THAT MATTERS IN THIS FILE, AND IT IS SECONDARY. 1992 is when
316
+ Romania replaced the communist-era mark with the county-code format that is
317
+ still in use. No instrument introducing it was reached — the instruments
318
+ this file HAS are from 2002 and 2006 and merely state the rule (header fact
319
+ 3). The secondary adds two transition facts recorded in `notes`. END is the
320
+ EU band's arrival, a design change, not a format change.
321
+ matching: strict
322
+ format:
323
+ pattern: "LL 99 LLL"
324
+ regex: '\A[A-Z]{2} ?\d{2} ?[A-Z]{3}\z'
325
+ regex_strict: '\A(?:AB|AG|AR|BC|BH|BN|BR|BT|BV|BZ|CJ|CL|CS|CT|CV|DB|DJ|GJ|GL|GR|HD|HR|IF|IL|IS|MH|MM|MS|NT|OT|PH|SB|SJ|SM|SV|TL|TM|TR|VL|VN|VS) ?\d{2} ?[A-Z]{3}\z'
326
+ regex_statutory: '\A[A-Z]{1,2} ?\d+ ?[A-Z]{3}\z'
327
+ charset:
328
+ evidence_tier: secondary-wikipedia
329
+ notes: "identical to ro-standard-2007; the 2007 change touched only the band."
330
+ design:
331
+ plate: { w: 520, h: 110, unit: mm }
332
+ background: { color: "#FFFFFF", finish: retroreflective, hex_basis: observed }
333
+ foreground: "#000000"
334
+ band: { side: left, content: "Romanian national flag", hex_basis: observed, colors: ["#002B7F", "#FCD116", "#CE1126"], note: "the tricolour band that preceded the EU band; the three hexes are observed renderings of the national colours and are NOT a spec claim" }
335
+ evidence_tier: secondary-wikipedia
336
+ region_encoding: "plates/_decode/ro-counties.yml"
337
+ sources:
338
+ - "https://en.wikipedia.org/wiki/Vehicle_registration_plates_of_Romania # secondary-wikipedia: the 1992 introduction of retroreflective plates in the CC 12 ABC format; official vehicles first; most vehicles kept old plates until the end of May 1993; old plates valid until 2000; the Romanian flag band 1992-2006. PERIOD + DESIGN. Accessed 2026-08-02"
339
+ - "https://legislatie.just.ro/Public/DetaliiDocument/79058 # H.G. nr. 1.391/2006, Regulament art. 23 — the same composition rule, stated fourteen years later. FORMAT"
340
+ notes: >-
341
+ THE POST-COMMUNIST REFORM PLATE, WITH ITS TRANSITION RECORDED RATHER THAN
342
+ SMOOTHED. Two facts the secondary supplies and this file keeps: the 1992
343
+ rollout went to OFFICIAL vehicles first, with most of the fleet keeping old
344
+ plates until the end of May 1993; and communist-era plates remained VALID
345
+ until 2000. So the honest picture is a series that legally begins in 1992,
346
+ covers the fleet through 1993, and runs in parallel with its predecessor for
347
+ eight years — which is why ro-communist-1966 below carries an end of 1992
348
+ for ISSUANCE and says in its own notes that validity ran to 2000. Distinct
349
+ from ro-standard-2007 in the band only.
350
+
351
+ # =========================================================================
352
+ # THE CAPITAL — THE FORMAT FORK. B 123 ABC, three digits, not two.
353
+ # =========================================================================
354
+ - id: ro-bucharest-2010
355
+ class: standard
356
+ categories: [car, van, truck, bus, trailer]
357
+ period: { start: 2010 }
358
+ period_evidence: corroboration-only
359
+ period_note: >-
360
+ THE WEAKEST DATE IN THIS FILE, AND IT IS FLAGGED AS SUCH. The only source
361
+ reached says the three-digit order number was adopted "starting around
362
+ 2010" because the two-digit space ran out. That is an approximation in the
363
+ source and it is recorded as an approximation here: `corroboration-only`,
364
+ not `secondary-dated`, because the source does not actually give a date.
365
+ Treat 2010 as a low-confidence boundary; the true first issue is a named
366
+ verifier target. It is a CAPACITY event, so there may be no instrument to
367
+ find at all — which is itself the finding (header fact 2: no amendment was
368
+ needed).
369
+ matching: strict
370
+ format:
371
+ pattern: "B 999 LLL"
372
+ regex: '\AB ?\d{3} ?[A-Z]{3}\z'
373
+ regex_statutory: '\A[A-Z]{1,2} ?\d+ ?[A-Z]{3}\z'
374
+ charset:
375
+ evidence_tier: secondary-wikipedia
376
+ notes: "see common.alphabet. The leading B is a LITERAL — the indicative of the municipality of Bucharest — and is spelled as one in the pattern, not as an L token."
377
+ capacity_note: >-
378
+ Two digits times the letter triple gave Bucharest on the order of 1.4
379
+ million marks; the third digit multiplies that by ten. The county
380
+ two-digit form is nowhere near exhaustion, which is why the fork exists
381
+ in the capital and only in the capital.
382
+ design:
383
+ plate: { w: 520, h: 110, unit: mm }
384
+ background: { color: "#FFFFFF", finish: retroreflective, hex_basis: observed }
385
+ foreground: "#000000"
386
+ band: { side: left, color: "#003399", content: eu-stars+RO, hex_basis: observed, stars_color: "#FFCC00" }
387
+ evidence_tier: secondary-wikipedia
388
+ region_encoding: "plates/_decode/ro-counties.yml"
389
+ region_encoding_mechanism: >-
390
+ The single letter B is the indicative of the municipality of Bucharest and
391
+ is carried in the decode file's `municipality` block, deliberately apart
392
+ from the 41 county rows. THERE IS NO MAXIMAL-MUNCH AMBIGUITY with the
393
+ seven B-initial county codes: the character after the territorial code is
394
+ always a DIGIT for the capital and always a LETTER for a county, so
395
+ "B123ABC" and "BC12ABC" separate mechanically even after separator
396
+ stripping.
397
+ sources:
398
+ - "https://en.wikipedia.org/wiki/Vehicle_registration_plates_of_Romania # secondary-wikipedia: Bucharest expanded to a three-digit order number around 2010 owing to capacity. FORMAT + PERIOD. Accessed 2026-08-02"
399
+ - "https://legislatie.just.ro/Public/DetaliiDocument/79058 # H.G. nr. 1.391/2006, Regulament art. 23 — 'indicativul judeţului SAU AL MUNICIPIULUI BUCUREŞTI' and an order number of unspecified length: the statutory room the fork used. FORMAT"
400
+ notes: >-
401
+ THE CURRENT BUCHAREST PLATE, AND THE FILE'S HEADLINE STRUCTURAL FACT. One
402
+ letter, THREE digits, three letters — a different serial space from every
403
+ county plate in the country, current at the same time, on the same design.
404
+ It is modelled as its own series rather than as a variant because a variant
405
+ shares the parent's regex and this one cannot: a single regex admitting both
406
+ `CJ 12 ABC` and `B 123 ABC` would also admit `CJ 123 ABC`, which is not
407
+ issued. The fork needed no amendment because art. 23 never fixed a digit
408
+ count, and that absence is the fact that makes `regex_statutory` real here
409
+ rather than decorative.
410
+
411
+ - id: ro-bucharest-2007
412
+ class: standard
413
+ categories: [car, van, truck, bus, trailer]
414
+ period: { start: 2007, end: 2010 }
415
+ period_evidence: corroboration-only
416
+ period_note: "START is the EU band; END is the same soft 'around 2010' boundary as ro-bucharest-2010 and inherits its low confidence."
417
+ matching: strict
418
+ format:
419
+ pattern: "B 99 LLL"
420
+ regex: '\AB ?\d{2} ?[A-Z]{3}\z'
421
+ regex_statutory: '\A[A-Z]{1,2} ?\d+ ?[A-Z]{3}\z'
422
+ design:
423
+ plate: { w: 520, h: 110, unit: mm }
424
+ background: { color: "#FFFFFF", finish: retroreflective, hex_basis: observed }
425
+ foreground: "#000000"
426
+ band: { side: left, color: "#003399", content: eu-stars+RO, hex_basis: observed, stars_color: "#FFCC00" }
427
+ evidence_tier: secondary-wikipedia
428
+ region_encoding: "plates/_decode/ro-counties.yml"
429
+ sources:
430
+ - "https://en.wikipedia.org/wiki/Vehicle_registration_plates_of_Romania # secondary-wikipedia: the Bucharest two-digit form, and its replacement by the three-digit form around 2010. FORMAT + PERIOD. Accessed 2026-08-02"
431
+ - "https://legislatie.just.ro/Public/DetaliiDocument/79058 # H.G. nr. 1.391/2006, Regulament art. 23. FORMAT"
432
+ notes: >-
433
+ THE TWO-DIGIT BUCHAREST PLATE WITH THE EU BAND — the short-lived middle
434
+ state, and the one that most often confuses a naive parser, because it has
435
+ the capital's one-letter code AND the counties' two-digit order number.
436
+ Still very much on the road: nothing was recalled when the third digit
437
+ arrived, so a current Bucharest vehicle may carry either length.
438
+
439
+ - id: ro-bucharest-1992
440
+ class: standard
441
+ categories: [car, van, truck, bus, trailer]
442
+ period: { start: 1992, end: 2007 }
443
+ period_evidence: secondary-wikipedia
444
+ period_note: "The capital's form of the 1992 reform mark; ends at the band change, as ro-standard-1992 does."
445
+ matching: strict
446
+ format:
447
+ pattern: "B 99 LLL"
448
+ regex: '\AB ?\d{2} ?[A-Z]{3}\z'
449
+ regex_statutory: '\A[A-Z]{1,2} ?\d+ ?[A-Z]{3}\z'
450
+ design:
451
+ plate: { w: 520, h: 110, unit: mm }
452
+ background: { color: "#FFFFFF", finish: retroreflective, hex_basis: observed }
453
+ foreground: "#000000"
454
+ band: { side: left, content: "Romanian national flag", hex_basis: observed, colors: ["#002B7F", "#FCD116", "#CE1126"] }
455
+ evidence_tier: secondary-wikipedia
456
+ region_encoding: "plates/_decode/ro-counties.yml"
457
+ sources:
458
+ - "https://en.wikipedia.org/wiki/Vehicle_registration_plates_of_Romania # secondary-wikipedia: the 1992 format and the national-flag band that preceded EU accession. FORMAT + PERIOD + DESIGN. Accessed 2026-08-02"
459
+ - "https://legislatie.just.ro/Public/DetaliiDocument/79058 # H.G. nr. 1.391/2006, Regulament art. 23. FORMAT"
460
+ notes: >-
461
+ THE ORIGINAL BUCHAREST PLATE of the 1992 system, with the tricolour band.
462
+ Recorded separately from ro-standard-1992 for the same reason its
463
+ successors are recorded separately from theirs: the capital's mark has one
464
+ fewer letter and, later, one more digit, and folding it into the county
465
+ series would make the county regex wrong.
466
+
467
+ # =========================================================================
468
+ # MOTORCYCLES — same serial, a plate a third of the size.
469
+ # =========================================================================
470
+ - id: ro-motorcycle-2007
471
+ class: motorcycle
472
+ categories: [motorcycle]
473
+ period: { start: 2007 }
474
+ period_evidence: corroboration-only
475
+ period_note: >-
476
+ The type-C plate size is sourced; its own start date is not. 2007 is
477
+ inherited from the EU-band design this series is described in, not from a
478
+ sourced first issue for motorcycles. Marked `corroboration-only` to say
479
+ exactly that.
480
+ matching: strict
481
+ format:
482
+ pattern: "LL 99 LLL"
483
+ regex: '\A[A-Z]{2} ?\d{2} ?[A-Z]{3}\z'
484
+ regex_strict: '\A(?:AB|AG|AR|BC|BH|BN|BR|BT|BV|BZ|CJ|CL|CS|CT|CV|DB|DJ|GJ|GL|GR|HD|HR|IF|IL|IS|MH|MM|MS|NT|OT|PH|SB|SJ|SM|SV|TL|TM|TR|VL|VN|VS) ?\d{2} ?[A-Z]{3}\z'
485
+ regex_statutory: '\A[A-Z]{1,2} ?\d+ ?[A-Z]{3}\z'
486
+ note: "The SERIAL is the ordinary county mark; only the plate differs. A Bucharest motorcycle carries the capital's one-letter form on the same small plate — not modelled separately, and recorded here as a gap rather than duplicated on a guess."
487
+ design:
488
+ plate: { w: 240, h: 130, unit: mm, note: "type C, motorcycles only — two rows" }
489
+ background: { color: "#FFFFFF", finish: retroreflective, hex_basis: observed }
490
+ foreground: "#000000"
491
+ band: { side: left, color: "#003399", content: eu-stars+RO, hex_basis: observed }
492
+ display: "rear only"
493
+ evidence_tier: secondary-wikipedia
494
+ region_encoding: "plates/_decode/ro-counties.yml"
495
+ sources:
496
+ - "https://en.wikipedia.org/wiki/Vehicle_registration_plates_of_Romania # secondary-wikipedia: type C, 240 x 130 mm, motorcycles only. DESIGN. Accessed 2026-08-02"
497
+ - "https://legislatie.just.ro/Public/DetaliiDocument/79058 # H.G. nr. 1.391/2006, Regulament art. 23. FORMAT"
498
+ notes: >-
499
+ THE MOTORCYCLE PLATE — the ordinary county mark on a 240 x 130 mm two-row
500
+ plate. Its own series rather than a variant because the dimensions differ
501
+ (PRD-PLATES §2.3), and `corroboration-only` because the size is sourced
502
+ while the date is inherited. Romania does not appear to give motorcycles a
503
+ distinct serial grammar, which is worth stating as a negative: unlike Italy,
504
+ whose motorcycle plate had five digits where the car had three-plus-two,
505
+ a Romanian motorcycle mark is indistinguishable from a car mark as a string.
506
+
507
+ # =========================================================================
508
+ # THE PRE-1992 SYSTEM.
509
+ # =========================================================================
510
+ - id: ro-communist-1966
511
+ class: standard
512
+ categories: [car, van, truck, bus, motorcycle]
513
+ period: { start: 1966, end: 1992 }
514
+ period_evidence: secondary-wikipedia
515
+ period_note: >-
516
+ Both boundaries are secondary and neither is instrument-dated. The 1966
517
+ start is the reported adoption of the numeric-type-prefix arrangement; the
518
+ 1992 end is the reform. ISSUANCE ended in 1992; VALIDITY did not — see
519
+ notes.
520
+ matching: recall-only
521
+ format:
522
+ pattern: "99-LL-9999"
523
+ regex: '\A\d{1,2}-?[A-Z]{1,2}-?\d{1,5}\z'
524
+ pattern_note: >-
525
+ RECALL-ONLY, and for three compounding reasons: the leading numeric group
526
+ is a TYPE code of one or two digits, the territorial letters are a
527
+ different and unsourced code set from the modern one, and the trailing
528
+ sequence length is reported only as "a numerical sequence". The regex is
529
+ a shape bound over all of that; a match is never a validity claim.
530
+ type_prefix:
531
+ evidence_tier: secondary-wikipedia
532
+ note: >-
533
+ THE LEADING DIGITS ENCODED THE VEHICLE KIND, which is the genuinely
534
+ interesting structural difference from the modern mark — Romania used
535
+ to put the vehicle CLASS in the registration and now puts only the
536
+ place. Reported ranges: 1-19 automobiles, 21-30 freight vehicles,
537
+ 31-40 buses, 41-45 road tractors, 46-50 motorcycles.
538
+ status_marks:
539
+ evidence_tier: secondary-wikipedia
540
+ note: >-
541
+ Recorded because it is the kind of thing a plate encyclopedia exists
542
+ for and because it is emphatically NOT modellable: high officials in
543
+ the 1970s and 1980s are reported to have carried 1-B marks with three
544
+ digits, sometimes with the middle digit equal to the sum of the outer
545
+ two. That is a social convention inside a serial space, not a grammar,
546
+ and no regex here encodes it.
547
+ design:
548
+ background: { color: "#FFFFFF", finish: painted, hex_basis: observed }
549
+ foreground: "#000000"
550
+ band: { side: none }
551
+ evidence_tier: secondary-wikipedia
552
+ region_encoding: none
553
+ region_encoding_note: >-
554
+ THE LETTERS ARE TERRITORIAL BUT plates/_decode/ro-counties.yml DOES NOT
555
+ DECODE THEM. The pre-1992 letter set was built on the administrative
556
+ regions of the day rather than on today's counties — the repeated example
557
+ is the Craiova area running as "OL" for Oltenia — and no primary or
558
+ secondary listing that set was obtained. `region_encoding: none` is
559
+ therefore a REFUSAL rather than a claim of no geography: there is geography
560
+ in the mark and this dataset cannot decode it, which is the safer of the
561
+ two errors for a parse API to inherit.
562
+ sources:
563
+ - "https://en.wikipedia.org/wiki/Vehicle_registration_plates_of_Romania # secondary-wikipedia: the 1966-1992 aa-BB-ccccc arrangement, the vehicle-type digit ranges, the regional letter codes and their derivation, and the status-mark convention. FORMAT + PERIOD. Accessed 2026-08-02"
564
+ notes: >-
565
+ THE COMMUNIST-ERA MARK. Vehicle-type digits, regional letters, sequence —
566
+ the reverse emphasis of the modern mark, which drops the type entirely and
567
+ leads with the place. The transition is the part worth carrying: issuance
568
+ stopped with the 1992 reform, but these plates remained VALID UNTIL 2000,
569
+ so Romanian traffic ran both systems side by side for eight years and a
570
+ photograph from the 1990s proves nothing about a vehicle's registration
571
+ date. Recorded as a period overlap with distinct notes, per PRD-PLATES
572
+ §2.2, rather than as a clean cut.
573
+
574
+ # =========================================================================
575
+ # PROVISIONAL AND RUNNING-TEST — the two plates named in the Ordin's own title.
576
+ # =========================================================================
577
+ - id: ro-provisional-2006
578
+ class: temporary
579
+ categories: [car, van, truck, bus, motorcycle, trailer]
580
+ period: { start: 2006 }
581
+ period_evidence: instrument-in-force
582
+ period_note: >-
583
+ 2006 IS THE INSTRUMENT, NOT THE FIRST ISSUE, and the distinction is the
584
+ whole point of this field. Ordinul M.A.I. nr. 1.501 din 13 noiembrie 2006
585
+ governs "eliberarea autorizaţiei de circulaţie provizorie" — the rule is
586
+ in force from then. Provisional plates certainly existed before 2006 (SR
587
+ 13140:1996 is a 1996 standard for exactly these numbers), so the TRUE start
588
+ of this series is earlier and unestablished. `instrument-in-force` means
589
+ here what it means in plates/de.yml and plates/at.yml: the year of the
590
+ instrument that STATES the rule.
591
+ matching: recall-only
592
+ format:
593
+ pattern: "LL 0999"
594
+ regex: '\A[A-Z]{1,2} ?0\d{2,5}\z'
595
+ pattern_note: >-
596
+ RECALL-ONLY. The reported grammar is a territorial code followed by three
597
+ to six digits of which the first is always 0 and the second is always
598
+ non-zero. The leading zero is the one hard character and it is spelled as
599
+ a LITERAL in the pattern; the second-digit rule is NOT encoded, because a
600
+ regex that encoded it would be narrower than the pattern can generate and
601
+ the length range already makes this a union. A match is a shape hit.
602
+ design:
603
+ background: { color: "#FFFFFF", finish: retroreflective, hex_basis: observed }
604
+ foreground: "#CE1126"
605
+ colour_note: "RED characters on white — the visual tell of a Romanian provisional plate. The hex is an observed rendering; SR 13078:1996 is unread."
606
+ band: { side: left, color: "#003399", content: eu-stars+RO, hex_basis: observed }
607
+ evidence_tier: secondary-wikipedia
608
+ validity:
609
+ evidence_tier: secondary-wikipedia
610
+ rule: "maximum 30 days, re-issuable to a cumulative 90 days"
611
+ region_encoding: "plates/_decode/ro-counties.yml"
612
+ sources:
613
+ - "https://en.wikipedia.org/wiki/Vehicle_registration_plates_of_Romania # secondary-wikipedia: red characters, county code plus three to six digits with a leading zero, 30-day validity re-issuable to 90. FORMAT + COLOUR + VALIDITY. Accessed 2026-08-02"
614
+ - "https://legislatie.just.ro/Public/DetaliiDocument/79058 # the Regulament's parent package; the Ordin M.A.I. nr. 1.501/2006 (M. Of. nr. 941 din 21 noiembrie 2006) is the instrument named in instrument.registration_procedure and is the PERIOD basis"
615
+ notes: >-
616
+ THE RED PROVISIONAL PLATE. Romania runs a genuinely separate LONG-TERM
617
+ temporary plate as well — reported as black-charactered, with a number that
618
+ never begins with zero and a red validity strip on the right giving year
619
+ and month, used for foreign residents and leased vehicles. That second
620
+ plate is NOT authored here: it shares neither this one's colour nor its
621
+ leading-zero rule, and no date was sourced for it. It is listed in
622
+ `unmodelled_series`. Splitting them on colour would have been easy and
623
+ wrong without a date for the second.
624
+
625
+ - id: ro-probe-2006
626
+ class: dealer
627
+ categories: [car, van, truck, bus, motorcycle, trailer]
628
+ period: { start: 2006 }
629
+ period_evidence: instrument-in-force
630
+ period_note: "As ro-provisional-2006: the Ordin of 2006 names 'autorizaţia de circulaţie ... pentru probe' in its own title. The instrument's year, not a first issue."
631
+ matching: recall-only
632
+ format:
633
+ pattern: "LL 999"
634
+ regex: '\A[A-Z]{1,2} ?\d{3}\z'
635
+ pattern_note: >-
636
+ RECALL-ONLY. Three digits reported to begin at 101, which is a starting
637
+ POINT and not a grammar — this file does not encode "at least 101"
638
+ because it cannot source an upper bound or a wrap rule. The word PROBE is
639
+ reported to be inscribed on the plate; it is carried in `design`, not in
640
+ the serial, on the same principle that keeps the Italian marchio out of
641
+ an Italian serial.
642
+ design:
643
+ background: { color: "#FFFFFF", finish: retroreflective, hex_basis: observed }
644
+ foreground: "#CE1126"
645
+ inscription: "PROBE"
646
+ inscription_note: "a word printed on the plate, not a serial element; a consumer must not concatenate it into the mark"
647
+ band: { side: left, color: "#003399", content: eu-stars+RO, hex_basis: observed }
648
+ evidence_tier: secondary-wikipedia
649
+ region_encoding: "plates/_decode/ro-counties.yml"
650
+ sources:
651
+ - "https://en.wikipedia.org/wiki/Vehicle_registration_plates_of_Romania # secondary-wikipedia: county code plus three digits from 101, with the PROBE inscription, on the same red-on-white scheme as the provisional plate. FORMAT + DESIGN. Accessed 2026-08-02"
652
+ - "https://legislatie.just.ro/Public/DetaliiDocument/79058 # the Regulament package; Ordinul M.A.I. nr. 1.501/2006 is the instrument that names the probe authorisation. PERIOD"
653
+ notes: >-
654
+ THE RUNNING-TEST (PROBE) PLATE — Romania's trade plate, bound to a business
655
+ rather than to a vehicle, which is why it takes class `dealer` and why its
656
+ categories are the full vehicle range: the plate travels between vehicles,
657
+ not with one. It shares the provisional plate's red-on-white scheme, so
658
+ colour alone does not separate them for an OCR consumer; the PROBE
659
+ inscription and the digit count do.
660
+
661
+ # =========================================================================
662
+ # DIPLOMATIC AND CONSULAR — described by the secondary, dated by inheritance.
663
+ # =========================================================================
664
+ - id: ro-diplomatic-1992
665
+ class: diplomatic
666
+ categories: [car, van]
667
+ period: { start: 1992 }
668
+ period_evidence: corroboration-only
669
+ period_note: >-
670
+ NO DATE WAS SOURCED FOR THIS SERIES. 1992 is inherited from the reform that
671
+ produced the modern Romanian plate system and is a LOWER-BOUND PLACEHOLDER,
672
+ not a first-issue claim — `corroboration-only` marks precisely that. A
673
+ diplomatic plate regime certainly predates 1992; this file does not claim
674
+ to know when the CD six-digit form began.
675
+ matching: strict
676
+ format:
677
+ pattern: "CD 999-999"
678
+ regex: '\ACD ?\d{3}-?\d{3}\z'
679
+ progression:
680
+ evidence_tier: secondary-wikipedia
681
+ note: >-
682
+ A TWO-PART NUMERIC DECODE: the first three digits are a country code
683
+ identifying the sending state and the last three a rank or sequence
684
+ within the mission, with 101 reported for an ambassador or head of
685
+ mission. The country-code table is NOT authored — PRD-PLATES puts
686
+ diplomatic decode tables at gate L4, and plates/fi.yml made the same
687
+ call for the Finnish mission table. Note that this is a MISSION decode,
688
+ not a geographic one, and it does not touch ro-counties.yml.
689
+ design:
690
+ background: { color: "#FFFFFF", finish: retroreflective, hex_basis: observed }
691
+ foreground: "#003399"
692
+ colour_note: "BLUE characters on white. Observed rendering; SR 13078:1996 unread."
693
+ band: { side: left, color: "#003399", content: eu-stars+RO, hex_basis: observed }
694
+ evidence_tier: secondary-wikipedia
695
+ region_encoding: none
696
+ sources:
697
+ - "https://en.wikipedia.org/wiki/Vehicle_registration_plates_of_Romania # secondary-wikipedia: CD plus six digits in blue, three-digit country code and three-digit rank code, 101 for the head of mission. FORMAT + COLOUR. Accessed 2026-08-02"
698
+ notes: >-
699
+ THE DIPLOMATIC CORPS PLATE. Authored despite an unsourced start date
700
+ because PRD-PLATES gate L1 names diplomatic among the core classes, and
701
+ because the FORMAT and the DECODE MECHANISM are described well enough to be
702
+ useful; the date is the part this file admits it does not have, in the
703
+ period_note rather than in a footnote. A companion series TC — reported for
704
+ consular transport including NATO officers — is described in
705
+ `unmodelled_series` because its scope, as reported, overlaps this one and
706
+ ro-consular-1992 in a way no source consulted resolves.
707
+
708
+ - id: ro-consular-1992
709
+ class: consular
710
+ categories: [car, van]
711
+ period: { start: 1992 }
712
+ period_evidence: corroboration-only
713
+ period_note: "As ro-diplomatic-1992 — 1992 is inherited from the system reform and is a placeholder, not a sourced first issue."
714
+ matching: strict
715
+ format:
716
+ pattern: "CO 999-999"
717
+ regex: '\ACO ?\d{3}-?\d{3}\z'
718
+ progression:
719
+ evidence_tier: secondary-wikipedia
720
+ note: "the same two-part numeric decode as the CD series — country code then rank; table not authored (gate L4)."
721
+ design:
722
+ background: { color: "#FFFFFF", finish: retroreflective, hex_basis: observed }
723
+ foreground: "#003399"
724
+ band: { side: left, color: "#003399", content: eu-stars+RO, hex_basis: observed }
725
+ evidence_tier: secondary-wikipedia
726
+ region_encoding: none
727
+ sources:
728
+ - "https://en.wikipedia.org/wiki/Vehicle_registration_plates_of_Romania # secondary-wikipedia: CO for consulates, blue characters, same six-digit structure as CD. FORMAT + COLOUR. Accessed 2026-08-02"
729
+ notes: >-
730
+ THE CONSULATE PLATE — a separate series from ro-diplomatic-1992 because the
731
+ class vocabulary distinguishes consular from diplomatic and because the
732
+ prefix differs, which is a format difference. Everything else about it,
733
+ including its date, is as weakly evidenced as its diplomatic sibling and is
734
+ flagged the same way.
735
+
736
+ # ---------------------------------------------------------------------------
737
+ # Described but NOT modelled.
738
+ # ---------------------------------------------------------------------------
739
+ unmodelled_series:
740
+ evidence_tier: secondary-wikipedia
741
+ source: "https://en.wikipedia.org/wiki/Vehicle_registration_plates_of_Romania # every row below. Accessed 2026-08-02"
742
+ reason_not_modelled: "each lacks a defensible date, a determinate format, or both. PRD-PLATES §5.3 prefers the recorded gap."
743
+ rows:
744
+ - token: "long-term temporary plate"
745
+ note: >-
746
+ Reported as black-charactered (not red), with an order number that never
747
+ begins with zero and a red validity strip at the right giving year and
748
+ month; used for foreign residents and leased vehicles. A genuinely
749
+ distinct series from ro-provisional-2006 — different colour, different
750
+ leading-digit rule, different validity mechanism — and undated. Modelling
751
+ it on a guessed start would have made the strongest-looking of this
752
+ file's weak entries.
753
+ - token: "green-lettered plate"
754
+ note: >-
755
+ Reported for zero-emission vehicles: green characters on white, otherwise
756
+ the standard format. NO DATE AT ALL WAS SOURCED — not a year, not a
757
+ month. Since the series would be indistinguishable from ro-standard-2007
758
+ as a STRING (the colour is the whole difference), authoring it without a
759
+ date would add a recall-only duplicate of an existing regex and one
760
+ invented year. Recorded instead. Class `electric` is available in
761
+ _meta/classes.yml the moment a date is.
762
+ - token: "TC"
763
+ note: "reported for consular transport, including NATO officers and consulates — a scope that overlaps both CD and CO as reported, with no source consulted resolving the boundary."
764
+ - token: "A + 3 to 7 digits"
765
+ note: >-
766
+ Military (Armată), reported to start at 100, with historic branch
767
+ prefixes U (Uscat, ground), A (Aer, air), M (Marină, navy) and I
768
+ (Înzestrare, logistics), and with the EU band absent from older plates.
769
+ Undated at both ends. Romania's military registration is also likely to
770
+ sit outside the civil instruments entirely, as Italy's expressly does
771
+ (art. 138 of the Codice della Strada, see plates/it.yml) — a structural
772
+ reason to leave it to a pass that can reach the defence instrument.
773
+ - token: "MAI"
774
+ note: "Ministry of Internal Affairs — gendarmerie, police, emergency services and some ambulances. Prefix reported, format and dates not."
775
+ - token: "yellow local-administration plate"
776
+ note: >-
777
+ Reported for public utilities, tractors, agricultural machinery, scooters
778
+ and golf carts, valid only inside the issuing locality, on a yellow
779
+ ground — and, in the source's own words, of NON-STANDARDISED format
780
+ varying by issuing authority. That is a species PRD-PLATES §2.2 cannot
781
+ represent as one series and should not: a format that varies by locality
782
+ is a table of formats, not a format. Recorded as the shape of the problem
783
+ for whoever attempts it.
784
+ - token: "September 2024 security generation"
785
+ note: "see common.security_upgrade_2024 — the reason it is not a series is given there in full."