vehicles 0.9.0 → 0.9.2

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 (195) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +57 -7
  3. data/README.md +353 -69
  4. data/data/PROVENANCE-vehicles.md +2 -2
  5. data/data/plates/PROVENANCE.md +2 -2
  6. data/data/plates/_decode/at-districts.yml +2 -2
  7. data/data/plates/_decode/cn-issuing-offices.yml +2 -2
  8. data/data/plates/_decode/cn-provinces.yml +2 -2
  9. data/data/plates/_decode/cz-kraj.yml +1 -1
  10. data/data/plates/_decode/dk-serial-blocks.yml +1 -1
  11. data/data/plates/_decode/es-provinces.yml +1 -1
  12. data/data/plates/_decode/fr-departements.yml +2 -2
  13. data/data/plates/_decode/gb-age-identifiers.yml +1 -1
  14. data/data/plates/_decode/gb-memory-tags.yml +1 -1
  15. data/data/plates/_decode/gr-prefectures.yml +1 -1
  16. data/data/plates/_decode/hr-cities.yml +3 -3
  17. data/data/plates/_decode/ie-counties.yml +3 -3
  18. data/data/plates/_decode/in-state-codes.yml +2 -2
  19. data/data/plates/_decode/it-provinces.yml +3 -3
  20. data/data/plates/_decode/jp-office-marks.yml +2 -2
  21. data/data/plates/_decode/jp-use-marks.yml +2 -2
  22. data/data/plates/_decode/kr-authority-marks.yml +1 -1
  23. data/data/plates/_decode/mx-entity-series.yml +1 -1
  24. data/data/plates/_decode/my-index-marks.yml +4 -4
  25. data/data/plates/_decode/pt-trailer-services.yml +1 -1
  26. data/data/plates/_decode/ro-counties.yml +1 -1
  27. data/data/plates/_decode/se-diplomatic.yml +1 -1
  28. data/data/plates/_decode/si-regions.yml +1 -1
  29. data/data/plates/_decode/ua-regions.yml +1 -1
  30. data/data/plates/_meta/classes.yml +1 -1
  31. data/data/plates/_meta/separators.yml +1 -1
  32. data/data/plates/ad.yml +555 -52
  33. data/data/plates/ar.yml +8 -8
  34. data/data/plates/at.yml +91 -10
  35. data/data/plates/au-act.yml +13 -13
  36. data/data/plates/au-nsw.yml +9 -9
  37. data/data/plates/au-nt.yml +13 -14
  38. data/data/plates/au-qld.yml +7 -7
  39. data/data/plates/au-sa.yml +7 -7
  40. data/data/plates/au-tas.yml +10 -10
  41. data/data/plates/au-vic.yml +6 -6
  42. data/data/plates/au-wa.yml +8 -8
  43. data/data/plates/be.yml +11 -11
  44. data/data/plates/br.yml +14 -14
  45. data/data/plates/ca-ab.yml +10 -10
  46. data/data/plates/ca-bc.yml +6 -6
  47. data/data/plates/ca-mb.yml +4 -4
  48. data/data/plates/ca-nb.yml +9 -9
  49. data/data/plates/ca-nl.yml +11 -11
  50. data/data/plates/ca-ns.yml +12 -12
  51. data/data/plates/ca-nt.yml +7 -7
  52. data/data/plates/ca-nu.yml +7 -7
  53. data/data/plates/ca-on.yml +21 -21
  54. data/data/plates/ca-pe.yml +13 -13
  55. data/data/plates/ca-qc.yml +11 -11
  56. data/data/plates/ca-sk.yml +6 -6
  57. data/data/plates/ca-yt.yml +6 -6
  58. data/data/plates/ch.yml +14 -14
  59. data/data/plates/cn.yml +9 -9
  60. data/data/plates/cy.yml +6 -6
  61. data/data/plates/cz.yml +9 -9
  62. data/data/plates/de.yml +8 -8
  63. data/data/plates/dk.yml +12 -12
  64. data/data/plates/ee.yml +13 -13
  65. data/data/plates/eg.yml +708 -0
  66. data/data/plates/es.yml +8 -8
  67. data/data/plates/fi.yml +14 -14
  68. data/data/plates/fr.yml +12 -12
  69. data/data/plates/gb.yml +16 -16
  70. data/data/plates/gr.yml +14 -14
  71. data/data/plates/hr.yml +15 -15
  72. data/data/plates/hu.yml +16 -16
  73. data/data/plates/ie.yml +7 -7
  74. data/data/plates/in.yml +7 -7
  75. data/data/plates/is.yml +3 -3
  76. data/data/plates/it.yml +21 -21
  77. data/data/plates/jp.yml +121 -121
  78. data/data/plates/kr.yml +6 -6
  79. data/data/plates/li.yml +6 -6
  80. data/data/plates/lt.yml +10 -10
  81. data/data/plates/lu.yml +4 -4
  82. data/data/plates/lv.yml +9 -9
  83. data/data/plates/mc.yml +4 -4
  84. data/data/plates/mt.yml +5 -5
  85. data/data/plates/mx.yml +7 -7
  86. data/data/plates/my.yml +18 -18
  87. data/data/plates/ng.yml +346 -0
  88. data/data/plates/nl.yml +5 -5
  89. data/data/plates/no.yml +7 -7
  90. data/data/plates/nz.yml +18 -18
  91. data/data/plates/pl.yml +4 -4
  92. data/data/plates/pt.yml +13 -5
  93. data/data/plates/ro.yml +14 -14
  94. data/data/plates/se.yml +13 -13
  95. data/data/plates/si.yml +8 -8
  96. data/data/plates/sk.yml +15 -15
  97. data/data/plates/sm.yml +7 -7
  98. data/data/plates/th.yml +10 -10
  99. data/data/plates/tr.yml +432 -0
  100. data/data/plates/ua.yml +9 -9
  101. data/data/plates/us-ak.yml +11 -11
  102. data/data/plates/us-al.yml +12 -12
  103. data/data/plates/us-ar.yml +15 -15
  104. data/data/plates/us-as.yml +10 -10
  105. data/data/plates/us-az.yml +10 -10
  106. data/data/plates/us-ca.yml +13 -13
  107. data/data/plates/us-co.yml +14 -14
  108. data/data/plates/us-ct.yml +24 -24
  109. data/data/plates/us-dc.yml +7 -7
  110. data/data/plates/us-de.yml +10 -10
  111. data/data/plates/us-fl.yml +17 -17
  112. data/data/plates/us-ga.yml +10 -10
  113. data/data/plates/us-gu.yml +11 -11
  114. data/data/plates/us-hi.yml +11 -11
  115. data/data/plates/us-ia.yml +9 -9
  116. data/data/plates/us-id.yml +13 -13
  117. data/data/plates/us-il.yml +11 -11
  118. data/data/plates/us-in.yml +9 -9
  119. data/data/plates/us-ks.yml +8 -8
  120. data/data/plates/us-ky.yml +11 -11
  121. data/data/plates/us-la.yml +11 -11
  122. data/data/plates/us-ma.yml +10 -10
  123. data/data/plates/us-md.yml +7 -7
  124. data/data/plates/us-me.yml +16 -16
  125. data/data/plates/us-mi.yml +8 -8
  126. data/data/plates/us-mn.yml +13 -13
  127. data/data/plates/us-mo.yml +13 -13
  128. data/data/plates/us-mp.yml +12 -12
  129. data/data/plates/us-ms.yml +8 -8
  130. data/data/plates/us-mt.yml +12 -12
  131. data/data/plates/us-nc.yml +12 -12
  132. data/data/plates/us-nd.yml +10 -10
  133. data/data/plates/us-ne.yml +10 -10
  134. data/data/plates/us-nh.yml +8 -8
  135. data/data/plates/us-nj.yml +8 -8
  136. data/data/plates/us-nm.yml +14 -14
  137. data/data/plates/us-nv.yml +18 -18
  138. data/data/plates/us-ny.yml +17 -17
  139. data/data/plates/us-oh.yml +13 -13
  140. data/data/plates/us-ok.yml +12 -12
  141. data/data/plates/us-or.yml +15 -15
  142. data/data/plates/us-pa.yml +14 -14
  143. data/data/plates/us-pr.yml +15 -15
  144. data/data/plates/us-ri.yml +10 -10
  145. data/data/plates/us-sc.yml +7 -7
  146. data/data/plates/us-sd.yml +12 -12
  147. data/data/plates/us-tn.yml +8 -8
  148. data/data/plates/us-tx.yml +17 -17
  149. data/data/plates/us-ut.yml +12 -12
  150. data/data/plates/us-va.yml +14 -14
  151. data/data/plates/us-vi.yml +16 -16
  152. data/data/plates/us-vt.yml +9 -9
  153. data/data/plates/us-wa.yml +18 -18
  154. data/data/plates/us-wi.yml +8 -8
  155. data/data/plates/us-wv.yml +9 -9
  156. data/data/plates/us-wy.yml +10 -10
  157. data/data/plates/va.yml +7 -7
  158. data/data/plates/za.yml +11 -11
  159. data/data/vehicles.json +121081 -62015
  160. data/lib/generators/vehicles/templates/initializer.rb +21 -12
  161. data/lib/generators/vehicles/templates/vehicles_refresh_job.rb +8 -4
  162. data/lib/vehicles/color.rb +8 -1
  163. data/lib/vehicles/colors.rb +14 -10
  164. data/lib/vehicles/configuration.rb +82 -3
  165. data/lib/vehicles/data_source.rb +220 -0
  166. data/lib/vehicles/dataset.rb +38 -6
  167. data/lib/vehicles/dataset_resolution.rb +39 -3
  168. data/lib/vehicles/dataset_slice.rb +90 -0
  169. data/lib/vehicles/hosted_result.rb +94 -0
  170. data/lib/vehicles/http.rb +75 -7
  171. data/lib/vehicles/id_lookup.rb +37 -0
  172. data/lib/vehicles/kind_rule.rb +63 -0
  173. data/lib/vehicles/labels.rb +131 -0
  174. data/lib/vehicles/make.rb +45 -19
  175. data/lib/vehicles/model.rb +66 -19
  176. data/lib/vehicles/model_match.rb +16 -2
  177. data/lib/vehicles/model_matcher.rb +6 -7
  178. data/lib/vehicles/plates/series.rb +87 -8
  179. data/lib/vehicles/plates/template_fill.rb +2 -2
  180. data/lib/vehicles/plates/templates.rb +9 -5
  181. data/lib/vehicles/plates.rb +54 -8
  182. data/lib/vehicles/providers/hosted_provider.rb +145 -32
  183. data/lib/vehicles/providers/local_provider.rb +2 -2
  184. data/lib/vehicles/refresh_result.rb +74 -0
  185. data/lib/vehicles/refresher.rb +190 -54
  186. data/lib/vehicles/release_checks.rb +72 -0
  187. data/lib/vehicles/text_matcher.rb +19 -10
  188. data/lib/vehicles/validators/vehicle_make_validator.rb +18 -1
  189. data/lib/vehicles/validators/vehicle_model_validator.rb +17 -1
  190. data/lib/vehicles/version.rb +1 -1
  191. data/lib/vehicles.rb +119 -67
  192. data/rakelib/data_refresh.rake +1 -1
  193. data/rakelib/plates_refresh.rake +1 -1
  194. data/sig/vehicles.rbs +67 -13
  195. metadata +13 -2
@@ -4,8 +4,8 @@
4
4
  (the gem projection) at a release tag:
5
5
 
6
6
  - **Source**: https://github.com/vehiclesdb/vehiclesdb `dist/vehicles.json`
7
- - **Tag**: `v2026.11.0` (commit `a5df1047239f1b9a017052cea34eca8a5c947dfd`), dataset version `2026.11.0`
8
- - **country_ranks**: 15516 model(s) carried it natively; 0 merged from
7
+ - **Tag**: `v2026.11.6` (commit `7b2b37f41e676ad42cdc0b1dfed1460670f1595b`), dataset version `2026.11.6`
8
+ - **country_ranks**: 16223 model(s) carried it natively; 0 merged from
9
9
  the same tag's `catalog/<kind>/models.json` `popularity.by_country[cc].rank`
10
10
  - **License**: CC-BY 4.0 (see the data repo's LICENSE + ATTRIBUTION.md)
11
11
 
@@ -1,10 +1,10 @@
1
- # Bundled plates dataset (PRD-PLATES, full corpus)
1
+ # Bundled plates dataset (full corpus)
2
2
 
3
3
  Copy of `plates/` from the public data repo (EXCLUDING `_art/`),
4
4
  refreshed on gem releases:
5
5
 
6
6
  - **Source**: https://github.com/vehiclesdb/vehiclesdb `plates/`
7
- - **Commit**: `c7dd65c6f4144d39c62706b7be10231a12bc27e1`
7
+ - **Commit**: `db0ec0abf7eae90b719a0a66f40b231f903bfac6`
8
8
  - **License**: CC-BY 4.0 (see the data repo's LICENSE + ATTRIBUTION.md)
9
9
 
10
10
  Refresh: `rake plates:refresh` (this file is generated by it).
@@ -8,7 +8,7 @@
8
8
  # discharges the delegation by pointing at ANLAGE 5d: "Die Bezeichnung der den
9
9
  # Zulassungsschein ausstellenden Behörde im Kennzeichen bestimmt sich nach
10
10
  # Anlage 5d." Anlage 5d is a CLOSED, PRIMARY, 98-row table printed inside the
11
- # regulation — so unlike the German ~400-code Bundesanzeiger list (PRD-PLATES
11
+ # regulation — so unlike the German ~400-code Bundesanzeiger list (the plates spec
12
12
  # §2.4), it is authored here in full, verbatim, in the annex's own order
13
13
  # (by Bundesland, then as the annex prints them).
14
14
  #
@@ -23,7 +23,7 @@
23
23
  # at-historic, at-electric, at-dealer-probefahrt, at-temporary-*,
24
24
  # at-trailer-foreign, at-wunschkennzeichen) via region_encoding.
25
25
  #
26
- # PERIOD DISCIPLINE (PRD-PLATES §2.4): these are the codes in the CONSOLIDATED
26
+ # PERIOD DISCIPLINE (the plates spec §2.4): these are the codes in the CONSOLIDATED
27
27
  # Anlage 5d in force on the access date (Fassung im RIS seit 26.09.2024,
28
28
  # NOR40265416). Austrian district reform has repeatedly merged Bezirke
29
29
  # (Bruck-Mürzzuschlag, Hartberg-Fürstenfeld, Murtal and Südoststeiermark are
@@ -44,7 +44,7 @@
44
44
  # 豫V (Zhengzhou), announced by 郑州市人民政府 for 2020-09-16 and
45
45
  # cited below — it is NOT in Annex A because Annex A predates it.
46
46
  #
47
- # PERIOD DISCIPLINE (PRD-PLATES § 2.4). Rows are the 2007 state and are never
47
+ # PERIOD DISCIPLINE (the plates spec § 2.4). Rows are the 2007 state and are never
48
48
  # deleted: a plate issued under an old code stays on the road, and several of
49
49
  # the place names below have since been renamed or reorganised (襄樊市 →
50
50
  # 襄阳市 2010; 巢湖市 dissolved 2011; 铜仁地区/毕节地区/海东地区/吐鲁番地区/
@@ -92,7 +92,7 @@ period_note: >-
92
92
  2007 is the year GA 36-2007 came into force (实施 2007-11-01), NOT the year
93
93
  these codes began: most of them were already allocated under GA 36-1992 and
94
94
  the 1992-format plates that carry them were issued from 1992 onward. This is
95
- the instrument-in-force case in PRD-PLATES § 2.4 exactly — a consolidation
95
+ the instrument-in-force case in the plates spec § 2.4 exactly — a consolidation
96
96
  documenting an older practice. The 2014 and 2018 editions each reissued
97
97
  Annex A and neither text is public, so no row here can be dated later than
98
98
  2007 and none can be shown to have been withdrawn.
@@ -68,7 +68,7 @@
68
68
  # rather than by this table will disagree with the road.
69
69
  #
70
70
  # ============================================================================
71
- # PERIOD DISCIPLINE (PRD-PLATES § 2.4) — ONE ROW IS YOUNGER THAN THE OTHERS
71
+ # PERIOD DISCIPLINE (the plates spec § 2.4) — ONE ROW IS YOUNGER THAN THE OTHERS
72
72
  # ============================================================================
73
73
  # GA 36-2007's 前言 lists, among the changes that edition made to GA 36-1992,
74
74
  # verbatim: "――增加了重庆的简称;" and "――增加了"渝"、"港"、"澳"、"使"、"警"、
@@ -591,7 +591,7 @@ limits:
591
591
  dataset with the British mark, which names the six-month period of first
592
592
  registration to 2050.
593
593
  cross_file_divergences: >-
594
- RECORDED, NOT AVERAGED (PRD-PLATES § 5.3). Two `row_period_start` values in
594
+ RECORDED, NOT AVERAGED (the plates spec § 5.3). Two `row_period_start` values in
595
595
  `classification_han` above disagree with the period on the plates/cn.yml
596
596
  series that uses the same character, and the disagreement is left standing
597
597
  for the verifier rather than reconciled by one file overwriting the other.
@@ -21,7 +21,7 @@
21
21
  # parse API that learned one and inferred the other would be wrong on twelve of
22
22
  # the fourteen rows. Both are authored here, in the instrument's own order.
23
23
  #
24
- # PERIOD DISCIPLINE (PRD-PLATES §2.4). The fourteen kraje were created by
24
+ # PERIOD DISCIPLINE (the plates spec §2.4). The fourteen kraje were created by
25
25
  # ústavní zákon č. 347/1997 Sb. and have not been re-cut since, so unlike the
26
26
  # German and Austrian tables this one has no withdrawn rows and no merger
27
27
  # history. What DID change is the meaning of the code on a plate, and it
@@ -39,7 +39,7 @@
39
39
  # * `secondary-wikipedia` — the rest of the pre-2012 rows. Both the English
40
40
  # and the Danish Wikipedia article carry a pre-2012 block table, each
41
41
  # crediting the enthusiast register nrpl.dk. THE TWO TABLES DISAGREE, and
42
- # PRD-PLATES §5.3 says record disagreements rather than average them, so
42
+ # the plates spec §5.3 says record disagreements rather than average them, so
43
43
  # conflicting rows carry both readings and a `conflict:` note. Nothing here
44
44
  # is presented as an instrument.
45
45
  #
@@ -10,7 +10,7 @@
10
10
  #
11
11
  # Referenced by: es-provincial (plates/es.yml) via region_encoding.
12
12
  #
13
- # PERIOD DISCIPLINE (PRD-PLATES §2.4 — "province codes changed over time"):
13
+ # PERIOD DISCIPLINE (the plates spec §2.4 — "province codes changed over time"):
14
14
  # these codes are the set in force in the CONSOLIDATED Anexo XVIII, and they
15
15
  # use the CURRENT official province names (Illes Balears, Girona, Lleida,
16
16
  # Ourense, A Coruña). Historic contraseñas that predate the RGV and appear on
@@ -21,7 +21,7 @@
21
21
  # avoir de lien avec le domicile du titulaire du certificat
22
22
  # d'immatriculation." A SIV plate DOES NOT DECODE. Reading region off a
23
23
  # modern French plate is the single most expensive mistake a plate-parse
24
- # API can make, and PRD-PLATES §2.4 already names it ("France's SIV
24
+ # API can make, and the plates spec §2.4 already names it ("France's SIV
25
25
  # département band is OWNER-CHOSEN, not geographic ... the decode table
26
26
  # must say so or the parse API will lie"). It says so.
27
27
  #
@@ -42,7 +42,7 @@
42
42
  # 96 metropolitan départements including Corse-du-Sud (2A) and Haute-Corse (2B),
43
43
  # plus the five overseas départements 971-974 and 976. Fetched 2026-08-02.
44
44
  #
45
- # PERIOD DISCIPLINE (PRD-PLATES §2.4 — decode tables rot). This is the list in
45
+ # PERIOD DISCIPLINE (the plates spec §2.4 — decode tables rot). This is the list in
46
46
  # force TODAY. Historic FNI codes that are NOT in it are NOT invented here:
47
47
  # * 20 = Corse before the 1976 split into 2A/2B;
48
48
  # * 75 covering the whole former Seine before the 1968 Île-de-France
@@ -5,7 +5,7 @@
5
5
  # § 23(4) does not reach the composition of a mark, so the twice-yearly code
6
6
  # is an administrative allocation published in DVLA's leaflet INF104 and, for
7
7
  # the export series, in HMRC's VAT manual. Both are authority publications and
8
- # therefore PRIMARY under PRD-PLATES § 4.
8
+ # therefore PRIMARY under the plates spec § 4.
9
9
  #
10
10
  # THE RULE, and it is complete and mechanical:
11
11
  # a vehicle first registered March-August of year YY takes the code YY
@@ -9,7 +9,7 @@
9
9
  # Secretary of State under § 23(1), and DVLA publishes it in the leaflet
10
10
  # INF104. So where plates/_decode/es-provinces.yml is enacted law and the
11
11
  # German district list is a Bundesanzeiger publication, this is a leaflet —
12
- # and a leaflet from the issuing authority is still a PRIMARY (PRD-PLATES § 4:
12
+ # and a leaflet from the issuing authority is still a PRIMARY (the plates spec § 4:
13
13
  # "Government/authority pages ... PRIMARY").
14
14
  #
15
15
  # Every row below is INF104 (4/22) § 05 "DVLA memory tags and age identifiers",
@@ -77,7 +77,7 @@
77
77
  # plate. This is the Greek analogue of the two-table trap recorded in
78
78
  # plates/_decode/it-provinces.yml.
79
79
  #
80
- # PERIOD DISCIPLINE (PRD-PLATES §2.4). 34 of the 195 rows are combinations that
80
+ # PERIOD DISCIPLINE (the plates spec §2.4). 34 of the 195 rows are combinations that
81
81
  # are ALLOCATED BUT NOT YET IN ISSUE (`status: allocated-not-yet-issued`). They
82
82
  # are kept, not dropped, because they are the forward half of the allocation —
83
83
  # but a consumer must not report them as observed geography, and a validator
@@ -81,7 +81,7 @@ period_note: >-
81
81
  period, so the 1990s code set is not asserted here.
82
82
 
83
83
  # ---------------------------------------------------------------------------
84
- # THE DIACRITIC PROBLEM — a PRD-PLATES §2.6 finding, recorded, not folded away.
84
+ # THE DIACRITIC PROBLEM — a the plates spec §2.6 finding, recorded, not folded away.
85
85
  # ---------------------------------------------------------------------------
86
86
  diacritics:
87
87
  affected_codes: ["ČK", "KŽ", "PŽ", "ŠI", "VŽ", "ŽU"]
@@ -91,7 +91,7 @@ diacritics:
91
91
  it as A-Z 0-9), so no `format.pattern` or `format.regex` in plates/hr.yml
92
92
  can spell them: the area-code position is written `[A-Z]{2}` there and is
93
93
  therefore NARROWER than the issuing grammar for these six areas. Per
94
- PRD-PLATES §2.7 that is still `matching: strict` — narrower is strict — but
94
+ the plates spec §2.7 that is still `matching: strict` — narrower is strict — but
95
95
  a consumer matching a photographed Croatian plate MUST either ASCII-fold the
96
96
  input or widen the class itself. Extending the serial alphabet is a schema
97
97
  amendment (§2.6), not a data entry, and is NOT attempted here.
@@ -110,7 +110,7 @@ diacritics:
110
110
 
111
111
  # ---------------------------------------------------------------------------
112
112
  # What moved between the 2008 annex and the 2017 annex, from diffing the two
113
- # primaries. Recorded because decode tables rot (PRD-PLATES §9) and because it
113
+ # primaries. Recorded because decode tables rot (the plates spec §9) and because it
114
114
  # shows the annex is maintained at the MUNICIPALITY level, not the code level.
115
115
  # ---------------------------------------------------------------------------
116
116
  changed_2008_2017:
@@ -23,7 +23,7 @@
23
23
  # POST-MERGER identifiers T (Tipperary), L (Limerick City and County) and
24
24
  # W (Waterford City and County).
25
25
  #
26
- # THE DISCREPANCY IS REAL AND IS RECORDED, NOT AVERAGED (PRD-PLATES §5.3): the
26
+ # THE DISCREPANCY IS REAL AND IS RECORDED, NOT AVERAGED (the plates spec §5.3): the
27
27
  # VRT First Schedule table still reads TN / TS / LK / L / WD / W and has never
28
28
  # been amended to add T or to merge LK into L and WD into W, while the
29
29
  # trade-licence table WAS amended for exactly that reason — S.I. 328/2013's own
@@ -36,7 +36,7 @@
36
36
  # Referenced by: plates/ie.yml (ie-standard-1987, ie-standard-1991,
37
37
  # ie-standard-2013, ie-trade-1993) via region_encoding.
38
38
  #
39
- # PERIOD DISCIPLINE (PRD-PLATES §2.4): these are the marks assignable to
39
+ # PERIOD DISCIPLINE (the plates spec §2.4): these are the marks assignable to
40
40
  # vehicles FIRST REGISTERED on or after 1 January 1987. The pre-1987 marks are a
41
41
  # different, disjoint set and are handled in `historic_pre_1987` below — they are
42
42
  # NOT in `codes:` and a pre-1987 plate must never be decoded through it. Marks
@@ -193,7 +193,7 @@ historic_pre_1987:
193
193
  exhaustive_list_note: >-
194
194
  The complete pre-1987 mark list is the 1958 Schedule as amended fourteen
195
195
  times, and merging those fourteen insertions row-by-row is gate-L4 work
196
- (PRD-PLATES §7). It is deliberately NOT half-done here: a partial list read
196
+ (the plates spec §7). It is deliberately NOT half-done here: a partial list read
197
197
  as complete would make a parse API declare real plates invalid, which is
198
198
  worse than declaring them unresolved. The amending instruments, all read and
199
199
  all conforming to the expansion rule above, are pinned so the merge can be
@@ -98,7 +98,7 @@ cautions:
98
98
  are the registering authority (RTO district) code, which no central
99
99
  instrument enumerates and which each State creates, merges and renumbers on
100
100
  its own. There are well over a thousand of them. They are deliberately not
101
- tabled (PRD-PLATES § 2.4 mechanism-note rule) and a decode must not guess.
101
+ tabled (the plates spec § 2.4 mechanism-note rule) and a decode must not guess.
102
102
 
103
103
  # ---------------------------------------------------------------------------
104
104
  # CODES. `evidence: instrument` = the row is quoted verbatim in a gazette
@@ -146,7 +146,7 @@ codes:
146
146
  - { code: "WB", name: "West Bengal", type: state, evidence: corroboration-only, verify: true }
147
147
 
148
148
  # ---------------------------------------------------------------------------
149
- # WITHDRAWN CODES. Rows are never deleted (PRD-PLATES § 2.4 period discipline):
149
+ # WITHDRAWN CODES. Rows are never deleted (the plates spec § 2.4 period discipline):
150
150
  # every one of these is still on live, valid plates, because an Indian
151
151
  # registration mark is not reissued when a State is renamed or merged.
152
152
  # ---------------------------------------------------------------------------
@@ -33,7 +33,7 @@
33
33
  # (c) legally not part of the plate. On a pre-1993 plate the sigla is in the mark
34
34
  # and denotes the province OF REGISTRATION (art. 320 D.P.R. 420/1959). Same two
35
35
  # letters, opposite semantics, and a parse API must not blend them. This is
36
- # Italy's version of the French SIV caution recorded in PRD-PLATES §2.4.
36
+ # Italy's version of the French SIV caution recorded in the plates spec §2.4.
37
37
  jurisdiction: it
38
38
  topic: provinces
39
39
  authority:
@@ -57,7 +57,7 @@ period_note: >-
57
57
  later (Monza-Brianza MB, Fermo FM, Barletta-Andria-Trani BT in 2004-2009, Sud
58
58
  Sardegna SU in 2016) never appeared on a provincial-era plate at all.
59
59
 
60
- # PERIOD DISCIPLINE (PRD-PLATES §2.4). D.P.R. 20 luglio 2017, n. 140 (GU
60
+ # PERIOD DISCIPLINE (the plates spec §2.4). D.P.R. 20 luglio 2017, n. 140 (GU
61
61
  # 22-09-2017 n. 222) withdrew four sigle and added one, and its art. 2 comma 2
62
62
  # states the rule every decode table of this kind needs, verbatim:
63
63
  # "I veicoli dotati di targhe di immatricolazione con le sigle delle province,
@@ -82,7 +82,7 @@ withdrawn_rule_source: "https://www.normattiva.it/do/atto/caricaAKN?dataGU=19921
82
82
  # * Three sigle carry a heraldic device the appendix describes in words and
83
83
  # which a render pipeline must not silently drop: Aosta ("La O è sormontata
84
84
  # dallo stemma"), Bolzano ("La Z è sormontata dallo stemma"), Trento ("La N è
85
- # sormontata dallo stemma"). PRD-PLATES §3 placeholder rule applies to those
85
+ # sormontata dallo stemma"). The plates spec §3 placeholder rule applies to those
86
86
  # three emblems.
87
87
  maximal_munch: false
88
88
 
@@ -18,7 +18,7 @@
18
18
  # 250 cm3), and § 63-4(2) to 検査対象外軽自動車 (125-250 cm3 motorcycles).
19
19
  # One decode table therefore serves every series in plates/jp.yml.
20
20
  #
21
- # THE SCRIPT LINE (PRD-PLATES §2.6). These marks are written in kanji and
21
+ # THE SCRIPT LINE (the plates spec §2.6). These marks are written in kanji and
22
22
  # hiragana. They are NOT in the dataset's serial alphabet (A-Z 0-9), so they
23
23
  # can never appear in a `format.pattern` or a `format.regex`; plates/jp.yml
24
24
  # carries them as a `format.fields[]` entry with `script: kanji-hiragana` and
@@ -35,7 +35,7 @@
35
35
  # boundary change stays valid afterwards. A decoder must therefore treat a mark
36
36
  # as evidence of the base of use AT FIRST REGISTRATION (or last renumbering),
37
37
  # never as a current-location signal. This is the same caution plates/gb.yml
38
- # records for DVLA memory tags and PRD-PLATES §2.4 records for the French SIV.
38
+ # records for DVLA memory tags and the plates spec §2.4 records for the French SIV.
39
39
  #
40
40
  # ROWS ARE NEVER DELETED. No mark has been withdrawn from 別表第一 in any
41
41
  # revision e-Gov publishes (2017-04-01 onward): the table has only grown,
@@ -37,12 +37,12 @@
37
37
  # instrument states a reason, and none is claimed here. What IS a sourced fact is
38
38
  # the omission itself, which is why every set below is written out in full.
39
39
  #
40
- # SCRIPT AND CODEPOINTS (PRD-PLATES §4, the identity-is-form rule). The hiragana
40
+ # SCRIPT AND CODEPOINTS (the plates spec §4, the identity-is-form rule). The hiragana
41
41
  # are recorded in the instrument's own characters. The Roman letters are
42
42
  # recorded TWICE: `chars` carries the instrument's FULL-WIDTH forms exactly as
43
43
  # e-Gov publishes them (A = U+FF21, not U+0041), and `ascii` carries the
44
44
  # half-width normalisation that plates/jp.yml's regexes are written in, because
45
- # PRD-PLATES §2.6 confines the dataset's serial alphabet to A-Z and 0-9. The
45
+ # the plates spec §2.6 confines the dataset's serial alphabet to A-Z and 0-9. The
46
46
  # plate itself is embossed, not typeset; the width distinction is an artefact of
47
47
  # the statute's typography, and recording both is what keeps that honest.
48
48
  jurisdiction: jp
@@ -71,7 +71,7 @@ maximal_munch_note: >-
71
71
  no mark is a prefix of another. Read exactly two syllables and stop.
72
72
 
73
73
  # ---------------------------------------------------------------------------
74
- # NAMING DRIFT, RECORDED (PRD-PLATES §9 "region-decode tables rot").
74
+ # NAMING DRIFT, RECORDED (the plates spec §9 "region-decode tables rot").
75
75
  # Two of the seventeen jurisdictions have been renamed since the notice's list
76
76
  # was last set, and the notice still prints the OLD full names. The two-syllable
77
77
  # MARKS are unaffected — 강원 and 전북 are what the plate shows either way — so
@@ -376,5 +376,5 @@ verification:
376
376
  Apéndice C also carries per-entity allocations for autobuses, remolques,
377
377
  convertidores, motocicletas (three grammars), demostración, ecológicos,
378
378
  ambulancias, bomberos, protección civil and escoltas. They are sourced at
379
- exactly the same quality and are omitted for scope (PRD-PLATES §2.5).
379
+ exactly the same quality and are omitted for scope (the plates spec §2.5).
380
380
  Extending this file needs no new sourcing, only transcription.
@@ -33,7 +33,7 @@
33
33
  # Called once per code, 2026-08-03 00:47:43 to 00:49:21 (+08).
34
34
  # 28 of 32 returned a reading.
35
35
  # The second endpoint is the closest thing Malaysia has to the registry
36
- # corpora PRD-PLATES §5.2 uses elsewhere: it is the authority stating, on the
36
+ # corpora the plates spec §5.2 uses elsewhere: it is the authority stating, on the
37
37
  # record and to the minute, what it is issuing. Those readings are the evidence
38
38
  # behind BOTH standard series in plates/my.yml and are reproduced per row as
39
39
  # `observed_2026_08_03`.
@@ -52,7 +52,7 @@
52
52
  # each colliding pair — so Sibu, Sri Aman and Limbang, which are real Sarawak
53
53
  # divisions with real plates on the road, have no row in the live list at all.
54
54
  # Both captures are recorded below and neither is silently preferred
55
- # (PRD-PLATES §5.3: record disagreements, never average them). The practical
55
+ # (the plates spec §5.3: record disagreements, never average them). The practical
56
56
  # reading is that the JPJ code is a QUERY KEY for a counter, not a bijection
57
57
  # with a place, and a decode consumer must treat the mapping as MANY-TO-ONE in
58
58
  # both directions.
@@ -133,7 +133,7 @@ areas:
133
133
  codes:
134
134
  - { code: SA, area: "Kota Kinabalu (West Coast)", observed_2026_08_03: "SJT 4199", form: prefix, evidence: agency-api, note: "queried as SA, issuing SJ-series — the drift is explicit here" }
135
135
  - { code: SB, area: Beaufort, observed_2026_08_03: "SB 1644 L", form: suffix, evidence: agency-api }
136
- - { code: SD, area: "Lahat Datu", observed_2026_08_03: "SPA 3076", form: prefix, evidence: agency-api, note: "JPJ spells it 'Lahat Datu'; the town is conventionally Lahad Datu. The authority's spelling is kept, per PRD-PLATES §5.3." }
136
+ - { code: SD, area: "Lahat Datu", observed_2026_08_03: "SPA 3076", form: prefix, evidence: agency-api, note: "JPJ spells it 'Lahat Datu'; the town is conventionally Lahad Datu. The authority's spelling is kept, per the plates spec §5.3." }
137
137
  - { code: SK, area: Kudat, observed_2026_08_03: "SK 4097 H", form: suffix, evidence: agency-api }
138
138
  - { code: SM, area: Sandakan, observed_2026_08_03: null, form: unknown, evidence: agency-api, note: "one of TWO codes JPJ maps to Sandakan; see the disagreement note in the header" }
139
139
  - { code: SS, area: Sandakan, observed_2026_08_03: "SMW 5063", form: prefix, evidence: agency-api, note: "queried as SS, issuing SM-series" }
@@ -210,7 +210,7 @@ diplomatic_dc:
210
210
  gap: >-
211
211
  THE COUNTRY-CODE TABLE IS NOT ON THIS PAGE and was not located anywhere.
212
212
  The number group above is the RANK group; the sending state's code is a
213
- separate printed group whose allocation is unsourced. PRD-PLATES puts
213
+ separate printed group whose allocation is unsourced. The plates spec puts
214
214
  diplomatic decode tables at L4 and this one is deliberately left there
215
215
  rather than guessed.
216
216
 
@@ -23,7 +23,7 @@
23
23
  # gazette printed. From the 2006 instrument's entry into force the operative
24
24
  # code is VI; VS is on the road on every trailer plated between 2005 and 2006
25
25
  # and on every earlier one issued under the same code. A parse API must accept
26
- # BOTH — which is exactly the "decode tables rot" hazard PRD-PLATES §9 names,
26
+ # BOTH — which is exactly the "decode tables rot" hazard the plates spec §9 names,
27
27
  # caught here inside a single fourteen-month window.
28
28
  #
29
29
  # WHAT THIS TABLE IS NOT: it is not a district-code table for cars. There has
@@ -32,7 +32,7 @@
32
32
  # the DIGIT BLOCK ALWAYS FOLLOWS THE CODE. In "B12ABC" the character after B
33
33
  # is a digit, so the code is one letter; in "BC12ABC" it is a letter, so the
34
34
  # code is two. The rule is mechanical and total, and it survives separator
35
- # stripping (PRD-PLATES §2.6), which is exactly when a decoder needs it most.
35
+ # stripping (the plates spec §2.6), which is exactly when a decoder needs it most.
36
36
  #
37
37
  # 3. THESE ARE NOT THE PRE-1992 CODES. The communist-era system used a different
38
38
  # territorial letter set built on the administrative regions of the day — the
@@ -1,6 +1,6 @@
1
1
  # plates/_decode/se-diplomatic.yml — Swedish beskickningsskylt country codes.
2
2
  #
3
- # WHY THIS IS A _decode FILE AND NOT AN INLINE TABLE (PRD-PLATES §2.4): 128
3
+ # WHY THIS IS A _decode FILE AND NOT AN INLINE TABLE (the plates spec §2.4): 128
4
4
  # rows is past the "small" threshold that put FZV Anlage 2 inline in de.yml,
5
5
  # and it is a CLOSED, PRIMARY list — Transportstyrelsen publishes the whole
6
6
  # thing, so it qualifies on the other limb of the rule ("a reference … if the
@@ -36,7 +36,7 @@
36
36
  # NOT A COMPLETE ARMS CATALOGUE. This file names the upravne enote whose seat
37
37
  # municipality supplies each shield; it does NOT carry the 58 blazons, their
38
38
  # artwork or their licensing. Municipal arms are protected independently of
39
- # copyright and PRD-PLATES §3 puts them in the placeholder slot
39
+ # copyright and the plates spec §3 puts them in the placeholder slot
40
40
  # (`design.emblem.rendered: placeholder` in plates/si.yml). Recorded gap:
41
41
  # a per-upravna-enota arms ledger.
42
42
  jurisdiction: si
@@ -27,7 +27,7 @@
27
27
  # The two never appear on the same plate.
28
28
  #
29
29
  # ---------------------------------------------------------------------------
30
- # THE SCRIPT PROBLEM — recorded, never folded away (PRD-PLATES §2.6).
30
+ # THE SCRIPT PROBLEM — recorded, never folded away (the plates spec §2.6).
31
31
  # ---------------------------------------------------------------------------
32
32
  script:
33
33
  printed: Cyrillic (Ukrainian)
@@ -1,4 +1,4 @@
1
- # The controlled vocabulary of plate classes (PRD-PLATES §2.3). A class is a
1
+ # The controlled vocabulary of plate classes (the plates spec §2.3). A class is a
2
2
  # LEGAL/ADMINISTRATIVE issuance category, not a design variant. A
3
3
  # jurisdiction's variant becomes its OWN SERIES iff format OR design OR
4
4
  # period differs from the standard series; a color-only variant of the same
@@ -1,6 +1,6 @@
1
1
  # plates/_meta/separators.yml — THE NORMATIVE SEPARATOR CHARACTER SET.
2
2
  #
3
- # PRD-PLATES §2.6 declares this contract in prose; this file is its
3
+ # the plates spec §2.6 declares this contract in prose; this file is its
4
4
  # machine-readable form, and `scripts/lint_plates.rb` enforces the dataset
5
5
  # against THIS file (single source of truth — the lint hardcodes nothing).
6
6
  #