vehicles 0.6.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 (186) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop_todo.yml +164 -0
  3. data/CHANGELOG.md +274 -0
  4. data/README.md +55 -10
  5. data/data/PROVENANCE-vehicles.md +12 -0
  6. data/data/plates/PROVENANCE.md +5 -4
  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/fr-departements.yml +191 -0
  14. data/data/plates/_decode/gb-age-identifiers.yml +170 -0
  15. data/data/plates/_decode/gb-memory-tags.yml +202 -0
  16. data/data/plates/_decode/gr-prefectures.yml +1408 -0
  17. data/data/plates/_decode/hr-cities.yml +315 -0
  18. data/data/plates/_decode/ie-counties.yml +227 -0
  19. data/data/plates/_decode/in-state-codes.yml +169 -0
  20. data/data/plates/_decode/is-districts-1938.yml +116 -0
  21. data/data/plates/_decode/it-provinces.yml +348 -0
  22. data/data/plates/_decode/jp-office-marks.yml +960 -0
  23. data/data/plates/_decode/jp-use-marks.yml +205 -0
  24. data/data/plates/_decode/kr-authority-marks.yml +146 -0
  25. data/data/plates/_decode/kr-use-syllables.yml +194 -0
  26. data/data/plates/_decode/lu-series-order.yml +638 -0
  27. data/data/plates/_decode/mx-entity-series.yml +380 -0
  28. data/data/plates/_decode/my-index-marks.yml +271 -0
  29. data/data/plates/_decode/no-counties-1913.yml +148 -0
  30. data/data/plates/_decode/no-districts.yml +901 -0
  31. data/data/plates/_decode/pl-powiats.yml +567 -0
  32. data/data/plates/_decode/pt-trailer-services.yml +96 -0
  33. data/data/plates/_decode/ro-counties.yml +213 -0
  34. data/data/plates/_decode/se-diplomatic.yml +220 -0
  35. data/data/plates/_decode/si-regions.yml +123 -0
  36. data/data/plates/_decode/sk-districts.yml +314 -0
  37. data/data/plates/_decode/th-registration-elements.yml +208 -0
  38. data/data/plates/_decode/ua-regions.yml +393 -0
  39. data/data/plates/_decode/za-licence-marks.yml +215 -0
  40. data/data/plates/_meta/classes.yml +1 -0
  41. data/data/plates/_meta/separators.yml +102 -0
  42. data/data/plates/ad.yml +961 -0
  43. data/data/plates/ar.yml +762 -0
  44. data/data/plates/at.yml +1424 -0
  45. data/data/plates/au-act.yml +472 -0
  46. data/data/plates/au-nsw.yml +282 -0
  47. data/data/plates/au-nt.yml +431 -0
  48. data/data/plates/au-qld.yml +272 -0
  49. data/data/plates/au-sa.yml +248 -0
  50. data/data/plates/au-tas.yml +302 -0
  51. data/data/plates/au-vic.yml +215 -0
  52. data/data/plates/au-wa.yml +309 -0
  53. data/data/plates/be.yml +1840 -0
  54. data/data/plates/br.yml +1152 -0
  55. data/data/plates/ca-ab.yml +430 -0
  56. data/data/plates/ca-bc.yml +697 -0
  57. data/data/plates/ca-mb.yml +499 -0
  58. data/data/plates/ca-nb.yml +537 -0
  59. data/data/plates/ca-nl.yml +743 -0
  60. data/data/plates/ca-ns.yml +808 -0
  61. data/data/plates/ca-nt.yml +610 -0
  62. data/data/plates/ca-nu.yml +280 -0
  63. data/data/plates/ca-on.yml +881 -0
  64. data/data/plates/ca-pe.yml +592 -0
  65. data/data/plates/ca-qc.yml +1036 -0
  66. data/data/plates/ca-sk.yml +256 -0
  67. data/data/plates/ca-yt.yml +656 -0
  68. data/data/plates/ch.yml +1273 -0
  69. data/data/plates/cn.yml +1431 -0
  70. data/data/plates/cy.yml +688 -0
  71. data/data/plates/cz.yml +1179 -0
  72. data/data/plates/de.yml +553 -118
  73. data/data/plates/dk.yml +1647 -0
  74. data/data/plates/ee.yml +1275 -0
  75. data/data/plates/es.yml +228 -32
  76. data/data/plates/fi.yml +1271 -0
  77. data/data/plates/fr.yml +1265 -0
  78. data/data/plates/gb.yml +1188 -0
  79. data/data/plates/gr.yml +721 -0
  80. data/data/plates/hr.yml +860 -0
  81. data/data/plates/hu.yml +959 -0
  82. data/data/plates/ie.yml +775 -0
  83. data/data/plates/in.yml +1172 -0
  84. data/data/plates/is.yml +667 -0
  85. data/data/plates/it.yml +1317 -0
  86. data/data/plates/jp.yml +3650 -0
  87. data/data/plates/kr.yml +1375 -0
  88. data/data/plates/li.yml +1010 -0
  89. data/data/plates/lt.yml +879 -0
  90. data/data/plates/lu.yml +842 -0
  91. data/data/plates/lv.yml +924 -0
  92. data/data/plates/mc.yml +1024 -0
  93. data/data/plates/mt.yml +854 -0
  94. data/data/plates/mx.yml +1372 -0
  95. data/data/plates/my.yml +685 -0
  96. data/data/plates/nl.yml +44 -0
  97. data/data/plates/no.yml +1018 -0
  98. data/data/plates/nz.yml +1699 -0
  99. data/data/plates/pl.yml +1296 -0
  100. data/data/plates/pt.yml +847 -0
  101. data/data/plates/ro.yml +785 -0
  102. data/data/plates/se.yml +1091 -0
  103. data/data/plates/si.yml +1105 -0
  104. data/data/plates/sk.yml +1439 -0
  105. data/data/plates/sm.yml +1119 -0
  106. data/data/plates/th.yml +1150 -0
  107. data/data/plates/ua.yml +1672 -0
  108. data/data/plates/us-ak.yml +763 -0
  109. data/data/plates/us-al.yml +457 -0
  110. data/data/plates/us-ar.yml +427 -0
  111. data/data/plates/us-as.yml +454 -0
  112. data/data/plates/us-az.yml +430 -0
  113. data/data/plates/us-ca.yml +892 -0
  114. data/data/plates/us-co.yml +452 -0
  115. data/data/plates/us-ct.yml +427 -0
  116. data/data/plates/us-dc.yml +614 -0
  117. data/data/plates/us-de.yml +551 -0
  118. data/data/plates/us-fl.yml +319 -96
  119. data/data/plates/us-ga.yml +644 -0
  120. data/data/plates/us-gu.yml +658 -0
  121. data/data/plates/us-hi.yml +585 -0
  122. data/data/plates/us-ia.yml +438 -0
  123. data/data/plates/us-id.yml +531 -0
  124. data/data/plates/us-il.yml +516 -0
  125. data/data/plates/us-in.yml +324 -0
  126. data/data/plates/us-ks.yml +351 -0
  127. data/data/plates/us-ky.yml +770 -0
  128. data/data/plates/us-la.yml +568 -0
  129. data/data/plates/us-ma.yml +379 -0
  130. data/data/plates/us-md.yml +536 -0
  131. data/data/plates/us-me.yml +445 -0
  132. data/data/plates/us-mi.yml +408 -0
  133. data/data/plates/us-mn.yml +411 -0
  134. data/data/plates/us-mo.yml +356 -0
  135. data/data/plates/us-mp.yml +402 -0
  136. data/data/plates/us-ms.yml +432 -0
  137. data/data/plates/us-mt.yml +619 -0
  138. data/data/plates/us-nc.yml +602 -0
  139. data/data/plates/us-nd.yml +419 -0
  140. data/data/plates/us-ne.yml +483 -0
  141. data/data/plates/us-nh.yml +394 -0
  142. data/data/plates/us-nj.yml +547 -0
  143. data/data/plates/us-nm.yml +574 -0
  144. data/data/plates/us-nv.yml +655 -0
  145. data/data/plates/us-ny.yml +592 -0
  146. data/data/plates/us-oh.yml +404 -0
  147. data/data/plates/us-ok.yml +513 -0
  148. data/data/plates/us-or.yml +392 -0
  149. data/data/plates/us-pa.yml +506 -0
  150. data/data/plates/us-pr.yml +507 -0
  151. data/data/plates/us-ri.yml +445 -0
  152. data/data/plates/us-sc.yml +605 -0
  153. data/data/plates/us-sd.yml +428 -0
  154. data/data/plates/us-tn.yml +471 -0
  155. data/data/plates/us-tx.yml +535 -0
  156. data/data/plates/us-ut.yml +384 -0
  157. data/data/plates/us-va.yml +567 -0
  158. data/data/plates/us-vi.yml +489 -0
  159. data/data/plates/us-vt.yml +458 -0
  160. data/data/plates/us-wa.yml +484 -0
  161. data/data/plates/us-wi.yml +509 -0
  162. data/data/plates/us-wv.yml +446 -0
  163. data/data/plates/us-wy.yml +523 -0
  164. data/data/plates/va.yml +604 -0
  165. data/data/plates/za.yml +1141 -0
  166. data/data/vehicles.json +160653 -105090
  167. data/lib/vehicles/configuration.rb +17 -3
  168. data/lib/vehicles/dataset.rb +73 -18
  169. data/lib/vehicles/fuzzy.rb +115 -0
  170. data/lib/vehicles/http.rb +48 -0
  171. data/lib/vehicles/make.rb +36 -6
  172. data/lib/vehicles/mcp_server.rb +5 -5
  173. data/lib/vehicles/model.rb +21 -2
  174. data/lib/vehicles/plates/series.rb +172 -18
  175. data/lib/vehicles/plates/template_fill.rb +188 -0
  176. data/lib/vehicles/plates/templates.rb +162 -0
  177. data/lib/vehicles/plates.rb +12 -0
  178. data/lib/vehicles/providers/hosted_provider.rb +28 -55
  179. data/lib/vehicles/validators/vehicle_make_validator.rb +3 -1
  180. data/lib/vehicles/validators/vehicle_model_validator.rb +1 -1
  181. data/lib/vehicles/version.rb +1 -1
  182. data/lib/vehicles.rb +32 -16
  183. data/rakelib/data_refresh.rake +109 -0
  184. data/rakelib/plates_refresh.rake +29 -0
  185. data/sig/vehicles.rbs +18 -0
  186. metadata +164 -2
@@ -0,0 +1,446 @@
1
+ # plates/us-wv.yml — West Virginia (PRD-PLATES gate L2, group southeast-a).
2
+ #
3
+ # THE WEST VIRGINIA FINDING: WV Code §17A-3-14 WAS GUTTED, AND THE GUTTING IS
4
+ # THE STORY. The section's own heading still promises "Registration plates
5
+ # generally; DESCRIPTION OF PLATES; issuance of special numbers and plates;
6
+ # registration fees; special application fees; exemptions; commissioner to
7
+ # promulgate forms..." — but the operative text no longer describes a plate,
8
+ # sets a fee, or lists a special plate. What survives is four sentences: one
9
+ # plate per vehicle, a registration number "in a configuration determined by
10
+ # the commissioner", reflectorized material, and legibility at 100 feet. A
11
+ # researcher reading only the heading would expect a colour table; the body
12
+ # has none. Recorded here because it is exactly the trap PRD-PLATES §5.3 warns
13
+ # about, and because it means every WEST VIRGINIA FORMAT AND COLOUR CLAIM IS
14
+ # NON-STATUTORY BY CONSTRUCTION.
15
+ #
16
+ # EVIDENCE GRADES — same four used across group southeast-a, defined in
17
+ # us-va.yml: statutory-date, official-agency-date,
18
+ # instrument-in-force-upper-bound, secondary-locator-unverified.
19
+ #
20
+ # WHAT WEST VIRGINIA DOES PUBLISH, AND IT IS BETTER THAN THE STATUTE: the DMV
21
+ # maintains an official MOTOR VEHICLE CLASSIFICATIONS page listing eleven
22
+ # registration classes by letter with their definitions. That page is the real
23
+ # spine of this file and is cited per claim below.
24
+ jurisdiction: us-wv
25
+ authority:
26
+ name: West Virginia Division of Motor Vehicles (DMV)
27
+ url: "https://transportation.wv.gov/DMV/Vehicle-Services/License-Plates/Pages/default.aspx"
28
+ binding: vehicle
29
+ statute_edition: "West Virginia Code, Chapter 17A (Motor Vehicle Administration, Registration, Certificate of Title, and Antitheft Provisions), Article 3 — as served by code.wvlegislature.gov and read 2026-08-01"
30
+
31
+ # ---------------------------------------------------------------------------
32
+ # artwork_risk — required per jurisdiction by PRD-PLATES §4.
33
+ # ---------------------------------------------------------------------------
34
+ artwork_risk:
35
+ posture: unresearched
36
+ basis: >-
37
+ HONESTLY UNRESEARCHED, NOT SILENTLY ASSUMED. West Virginia does not appear
38
+ in the per-state survey of subnational copyright postures — it is neither
39
+ listed as favourable (like Florida, California, Georgia, North Carolina,
40
+ New Jersey, Massachusetts) nor as adverse (like Arizona, New York,
41
+ Pennsylvania, Washington) nor as judicially resolved (like South
42
+ Carolina). Wikimedia Commons has no {{PD-WVGov}} template (HTTP 404,
43
+ checked 2026-08-01). No West Virginia public-records statute, Attorney
44
+ General opinion or agency policy bearing on copyright in state works was
45
+ located in this pass. Under the governing default — 17 U.S.C. §105 does
46
+ not reach the states, so a state work is copyrighted unless that state
47
+ says otherwise — West Virginia must be TREATED as default-copyrighted for
48
+ operational purposes, but that is an application of the default, not a
49
+ finding about West Virginia, and this field says so rather than dressing
50
+ the default up as research.
51
+ research_lead: >-
52
+ The specific instrument to pin next is West Virginia's Freedom of
53
+ Information Act, W. Va. Code §29B-1-1 et seq., and any state-purchasing or
54
+ state-publications provision in Chapter 5A (Department of Administration).
55
+ Neither was read. Also unresearched, and separate from copyright: West
56
+ Virginia's state-seal misuse law, which would bind the STATE SEAL
57
+ independently of any copyright answer.
58
+ emblem_rule: >-
59
+ PRD-PLATES §3's placeholder default applies with extra force here, because
60
+ the posture is unknown rather than merely adverse. The current base carries
61
+ a gold-on-dark-blue "West Virginia" bar and, on the 2023 design, a STATE
62
+ OUTLINE used as the serial separator — a state-shape graphic sitting
63
+ inside the serial field. Render `emblem: {present: true, rendered:
64
+ placeholder}` and do not approximate the outline until the posture is
65
+ resolved.
66
+ photograph_caution: "Commons photographs of West Virginia plates carry the photographer's licence on the photograph, not a licence to the design. Our renders are generated, never derived from a photograph, so those obligations never attach."
67
+ sources:
68
+ - "https://en.wikipedia.org/wiki/Copyright_status_of_works_by_subnational_governments_of_the_United_States # LOCATOR: the per-state survey in which West Virginia does not appear at all — the negative result"
69
+ - "https://commons.wikimedia.org/wiki/Template:PD-WVGov # HTTP 404 — no West Virginia public-domain tag exists on Commons (checked 2026-08-01)"
70
+ - "https://commons.wikimedia.org/wiki/Commons:Copyright_rules_by_territory/United_States # the governing default: 'Other states: copyrighted'"
71
+
72
+ us_standards:
73
+ no_federal_mandate: true
74
+ chain: "SAE J686 -> AAMVA License Plate Standard Edition 3 (September 2025) -> voluntary state adoption; recommendations phrased in the declarative present, read as RECOMMENDED PRACTICE."
75
+ aamva_edition_3:
76
+ dimensions_delegated: "AAMVA §3.1 delegates dimensions and bolt holes to SAE J686; J686's text is paywalled and was NOT obtained. No J686 dimension is quoted."
77
+ retroreflectivity: "AAMVA §3.3: readable in daylight and at night from at least 75 feet; materials per ASTM D4956-19 and ISO 7591:1982 clause 3."
78
+ legibility_comparison: >-
79
+ WEST VIRGINIA LEGISLATES A LONGER SIGHT LINE THAN AAMVA RECOMMENDS.
80
+ §17A-3-14(b)(2) requires registration numbers "plainly readable from 100
81
+ feet during daylight"; AAMVA §3.3 asks for readability "from distances of
82
+ at least 75 feet" in daylight AND at night. The two are not in conflict —
83
+ AAMVA's is a floor and covers night as well — but a state statute setting
84
+ a 100-foot daylight bar is a citable, comparable number, and North
85
+ Carolina's § 20-63(c) sets exactly the same one. Two states of this group
86
+ independently legislate 100 feet.
87
+ replacement_cycle: "AAMVA §1.1 recommends a cycle not to exceed 7 to 10 years. WEST VIRGINIA'S CODE SETS NO CYCLE; the DMV instead offers free replacement of a worn, faded or illegible plate at renewal ($10.50 at any other time) — replacement on CONDITION rather than on a CLOCK, which is a third model alongside Florida/South Carolina's legislated 10 years and Virginia's silence."
88
+ source: "https://www.aamva.org/getmedia/646bcc8a-219b-47d8-b5cd-726240473163/License-Plate-Standard-Edition-3_September-2025-Update.pdf"
89
+ folklore_caution: "The '1956 AMA standardization agreement' remains COMMONLY REPEATED AND NOT PRIMARY-SOURCED; see the fuller note in us-va.yml, including the ALPCA magazine citation that has since been attached to it and that this pass could not obtain. West Virginia's plate dimensions are not in the WV Code, so this file makes no West Virginia dimension claim."
90
+
91
+ display_rules:
92
+ default: "ONE plate. §17A-3-14(a): 'The division, upon registering a vehicle, shall issue to the owner ONE registration plate with a registration number consisting of a combination of letters, numerals, symbols, or characters in a configuration determined by the commissioner.' West Virginia is therefore a single-plate state as a matter of statute, not of practice."
93
+ position: "rear (the conventional single-plate position). §17A-3-15 governs display and was fetched but its operative text was not extracted in this pass — the POSITION claim is therefore recorded as convention, not as sourced (recorded gap)."
94
+ legibility: "§17A-3-14(b)(2): registration numbers 'shall be plainly readable from 100 feet during daylight'"
95
+ material: "§17A-3-14(b)(1): 'Plates must incorporate reflectorized material.'"
96
+ commissioner_powers: "§17A-3-14(b)(3): the commissioner 'may assign any additional feature to facilitate reciprocal agreements, facilitate interstate travel, promote highway safety, or promote the efficient operation of the division' — an open-ended design power that is the legal basis for anything on a West Virginia plate that the Code does not mention, which is everything"
97
+ suspension: "§17A-3-14(c): the commissioner may suspend the registration of any owner who displays a damaged or illegible plate or otherwise fails to comply with §17A-3-19"
98
+ sources:
99
+ - "https://code.wvlegislature.gov/17A-3-14/ # §17A-3-14(a) one plate and the commissioner-determined configuration; (b)(1) reflectorized material; (b)(2) 100-foot daylight legibility; (b)(3) the additional-feature power; (c) suspension for a damaged or illegible plate"
100
+ - "https://transportation.wv.gov/DMV/Vehicle-Services/License-Plates/Pages/default.aspx # DMV: a worn, faded or otherwise illegible plate is replaced free at renewal, $10.50 at any other time"
101
+
102
+ # ---------------------------------------------------------------------------
103
+ # WEST VIRGINIA'S REGISTRATION CLASS LETTERS — the official taxonomy, from the
104
+ # DMV's own Motor Vehicle Classifications page. This is the spine of the file:
105
+ # WV organises plates by class letter, and the class letter is how the DMV
106
+ # itself talks about them ("plates available for Class A motor vehicles").
107
+ # ---------------------------------------------------------------------------
108
+ registration_classes:
109
+ source: "https://transportation.wv.gov/DMV/Vehicle-Services/Pages/Classifications.aspx"
110
+ A: "Cars and Trucks — passenger cars and trucks with a gross weight of 10,000 pounds or less"
111
+ B: "Trucks — trucks, truck tractors or road tractors with a gross weight of 10,001 pounds or more"
112
+ C: "Trailers and Semi Trailers — all trailers and semitrailers except house trailers, trailers or semitrailers designed to be drawn by Class A motor vehicles, and having a gross weight of more than 2,000 pounds"
113
+ G: "Motorcycles (3 wheels or less) — every motorcycle including motor-driven cycles and mopeds, having a saddle and no more than three wheels"
114
+ H: "Buses — every motor vehicle designed for carrying more than seven passengers or transportation of persons for compensation, excluding taxicabs"
115
+ J: "Taxi Cabs — motor vehicles used for the transportation of persons for compensation"
116
+ M: "Mobile Equipment — self-propelled vehicles not designed or used primarily for transportation over the highway (farm equipment, implements of husbandry, well-drillers, cranes, wood-sawing equipment)"
117
+ R: "Travel Trailers — any vehicle designed to provide temporary living quarters for recreation, travel or camping use"
118
+ T: "Trailers — trailers, boat trailers or semitrailers designed to be drawn by Class A vehicles with a gross weight of less than 2,000 pounds"
119
+ V: "Antique Motor Vehicles — at least 25 years old"
120
+ X: "Farm Trucks — used exclusively for the transportation of farm products and supplies by a farmer"
121
+ note: >-
122
+ Eleven classes, and note the pair that a naive trailer model would collapse:
123
+ CLASS C and CLASS T are both trailers, split at 2,000 pounds and at whether
124
+ a Class A vehicle tows them. A dataset with one `trailer` class per state
125
+ cannot express that; ours records it here and models the common case.
126
+
127
+ series:
128
+
129
+ # =========================================================================
130
+ # CURRENT STANDARD ISSUE — Class A.
131
+ # =========================================================================
132
+ - id: us-wv-standard-2023
133
+ class: standard
134
+ categories: [car, van, truck]
135
+ period: { start: 2023 }
136
+ period_evidence: secondary-locator-unverified
137
+ matching: strict
138
+ format:
139
+ pattern: "999 999L"
140
+ regex: '\A[0-9OND]\d{2} ?\d{3}[A-Z]\z'
141
+ regex_strict: '\A[1-9OND]\d{2} ?\d{3}[A-Z]\z'
142
+ format_evidence: secondary-locator-unverified
143
+ charset:
144
+ notes: >-
145
+ THE FIRST CHARACTER IS NOT PART OF THE SERIAL IN THE ORDINARY SENSE —
146
+ IT IS THE MONTH OF EXPIRATION. West Virginia has encoded the
147
+ expiration month in the leading character of its plate number since
148
+ the 1970-75 base, and the reported system is: 1 through 9 = January
149
+ through September, O = October, N = November, D = December. That is
150
+ why `regex_strict` excludes a leading 0 (there is no month zero) and
151
+ why the loose `regex` tolerates it: the pattern DSL has only 9 and L,
152
+ so a position that accepts nine digits and three specific letters
153
+ cannot be spelled in `pattern` and must be carried by the twins.
154
+ NOTE THE LOOKALIKE HAZARD THIS CREATES: 'O' as a month code sits in
155
+ the same position a digit otherwise occupies, so O-versus-0 is not a
156
+ cosmetic OCR problem in West Virginia, it is a semantic one — "O12
157
+ 345A" expires in October and "012 345A" is not a valid plate at all.
158
+ progression: "not published; the series letter and the block allocation for this base were not obtained (recorded gap)"
159
+ separator_note: "the gap between the two three-character groups is spelled as an optional space because the plate prints a gap there; on this base the physical separator is reported to be a STATE-OUTLINE graphic rather than a printed glyph, which under PRD-PLATES §2.6 is a design element (design.emblem), never a serial character and never something a consumer may strip as punctuation"
160
+ design:
161
+ plate: { w: 12, h: 6, unit: in, dimension_evidence: convention-not-sourced }
162
+ plate_dimension_note: "no West Virginia dimension is sourced — §17A-3-14 states none. 12 x 6 in is the North American convention (AAMVA -> SAE J686, voluntary), recorded as convention and not as a West Virginia claim."
163
+ background: { color: "#FFFFFF", finish: retroreflective, hex_basis: observed }
164
+ foreground: "#1F3160"
165
+ colour_note: "NO COLOUR IS IN THE WV CODE. §17A-3-14(b) requires only reflectorized material and 100-foot daylight legibility. The reflective-white ground with an embossed dark-blue serial, a dark blue bar at the top carrying 'West Virginia' in gold, and a thin gold stripe below it, are all `hex_basis: observed` from a locator description. Treat both hexes as approximations."
166
+ legend_top: "West Virginia"
167
+ legend_bottom: null
168
+ separator_graphic: { present: true, description: "state outline used as the separator between the serial groups", rendered: placeholder }
169
+ emblem: { present: true, rendered: placeholder }
170
+ band: { side: top, color: "#1F3160", content: "West Virginia in gold" }
171
+ rear_differs: false
172
+ region_encoding: none
173
+ serial_encoding:
174
+ kind: expiration-month
175
+ mechanism: "the FIRST character of the plate number encodes the month of expiration: 1-9 = January-September, O = October, N = November, D = December"
176
+ evidence: secondary-locator-unverified
177
+ note: >-
178
+ THIS IS THE MOST VALUABLE FACT IN THE WEST VIRGINIA FILE AND THE ONE
179
+ MOST WORTH VERIFYING. It is a TIME encoding in the serial — the
180
+ temporal analogue of Germany's geographic prefix and of the Dutch
181
+ sidecode's era inference — and it is reported to have run continuously
182
+ from the 1970-75 base to today, across at least six base designs. If
183
+ true, a West Virginia plate string alone yields the registration's
184
+ expiry month, which is a parse-API capability no competitor offers for
185
+ any US state. It is recorded as `secondary-locator-unverified` because
186
+ the only source located is an encyclopedia table; the WV DMV does not
187
+ publish it and §17A-3-14 does not mention it. VERIFY BEFORE SHIPPING
188
+ ANY DECODE THAT DEPENDS ON IT.
189
+ sources:
190
+ - "https://code.wvlegislature.gov/17A-3-14/ # §17A-3-14(a): one plate, registration number 'consisting of a combination of letters, numerals, symbols, or characters in a configuration determined by the commissioner' — the statutory basis for there being no statutory format; (b)(1) reflectorized; (b)(2) 100-foot legibility"
191
+ - "https://transportation.wv.gov/DMV/Vehicle-Services/Pages/Classifications.aspx # WV DMV: Class A = passenger cars and trucks of 10,000 lb or less, the class this base serves"
192
+ - "https://en.wikipedia.org/wiki/Vehicle_registration_plates_of_West_Virginia # LOCATOR ONLY (PRD-PLATES §4): the July 2023 start, the state-outline separator, the gold-on-blue top bar, the serial arrangement, and the month-code system reported as continuing 'today'. None asserted as sourced."
193
+ notes: >-
194
+ WEST VIRGINIA CURRENT STANDARD ISSUE (CLASS A). Everything structural
195
+ here — one plate, commissioner-set configuration, reflectorization,
196
+ 100-foot legibility — is statutory and cited. Everything visual and every
197
+ date is locator-grade and marked. The month-code encoding is carried in
198
+ its own `serial_encoding` block rather than buried in a note, because it
199
+ is the one West Virginia fact a parse API would actually monetise, and
200
+ because putting it somewhere prominent is what will get it verified. The
201
+ series id is dated 2023 to the reported base change; if that date falls,
202
+ the id keeps its append-only guarantee and gains a former-id alias under
203
+ the PRD-QUALITY I-5/I-6 contract.
204
+
205
+ # =========================================================================
206
+ # ONE SERIES BACK.
207
+ # =========================================================================
208
+ - id: us-wv-standard-wildwonderful-2006
209
+ class: standard
210
+ categories: [car, van, truck]
211
+ period: { start: 2006, end: 2023 }
212
+ period_evidence: secondary-locator-unverified
213
+ matching: strict
214
+ format:
215
+ pattern: "9LL 999"
216
+ regex: '\A[0-9OND](?:[A-Z] ?\d{4}|[A-Z]{2} ?\d{3}|\d[A-Z] ?\d{3})\z'
217
+ regex_strict: '\A[1-9OND](?:[A-Z] ?\d{4}|[A-Z]{2} ?\d{3}|\d[A-Z] ?\d{3})\z'
218
+ format_evidence: secondary-locator-unverified
219
+ charset:
220
+ notes: >-
221
+ THREE ARRANGEMENTS, ONE BASE — and the regex is their union, which is
222
+ still `strict` because the union is exactly what West Virginia issued
223
+ on this base and no wider (PRD-PLATES §2.7: narrower or equal is
224
+ strict; only a DELIBERATELY over-broad regex is recall-only). The
225
+ three reported arrangements, after the leading month character: one
226
+ letter plus four digits; two letters plus three digits; one digit,
227
+ one letter, three digits. The third was reportedly introduced in
228
+ October 2015 as the two-letter series began to exhaust — a state
229
+ adding a serial SHAPE mid-base rather than changing the base, which
230
+ is precisely why `format` cannot be assumed constant across a design
231
+ period.
232
+ progression: "reported: series reset to A for all months from the January 1995 base, two-letter series progressing in standard order (AA-AZ, BA-BZ ...), with series S and SA-SZ reserved for optional Scenic plates"
233
+ design:
234
+ plate: { w: 12, h: 6, unit: in, dimension_evidence: convention-not-sourced }
235
+ background: { color: "#FFFFFF", finish: retroreflective, hex_basis: observed }
236
+ foreground: "#1F3160"
237
+ legend_top: "West Virginia"
238
+ legend_bottom: "Wild, Wonderful"
239
+ legend_note: "dark blue bar at the top carrying 'West Virginia' in gold with a thin gold stripe beneath; 'Wild, Wonderful' at the bottom. The immediately preceding variant (December 2000 - early 2006) additionally carried 'www.callwva.com' between the state name and the serial, cutting the gold stripe — a URL on a state plate, and a good reminder that plate designs date themselves in ways serial ranges do not."
240
+ emblem: { present: true, rendered: placeholder }
241
+ rear_differs: false
242
+ region_encoding: none
243
+ serial_encoding:
244
+ kind: expiration-month
245
+ mechanism: "same leading-character month code as us-wv-standard-2023: 1-9 = January-September, O/N/D = October/November/December"
246
+ evidence: secondary-locator-unverified
247
+ sources:
248
+ - "https://code.wvlegislature.gov/17A-3-14/ # the same statutory frame governed this base; West Virginia's plate law did not change at the boundary"
249
+ - "https://en.wikipedia.org/wiki/Vehicle_registration_plates_of_West_Virginia # LOCATOR ONLY: the early-2006 to July-2023 span, 'Wild, Wonderful', the three serial arrangements, the October 2015 introduction of the number-letter series, and the S/SA-SZ Scenic reservation"
250
+ notes: >-
251
+ THE PREVIOUS WEST VIRGINIA STANDARD BASE. It earns its place in an L2
252
+ pass for one reason beyond being the predecessor: it demonstrates, within
253
+ a single unchanged design, that a US state will ADD A SERIAL ARRANGEMENT
254
+ mid-base when a block exhausts. Any consumer that treats "one base = one
255
+ regex" will silently reject West Virginia plates issued after October
256
+ 2015 on a base first issued in 2006. The 2023 overlap year is the honest
257
+ shape of a rollout, with old stock issuing on.
258
+
259
+ # =========================================================================
260
+ # CORE CLASSES. West Virginia serializes by CLASS LETTER; the class list is
261
+ # official, the serial arrangements are not published. Each is recall-only.
262
+ # =========================================================================
263
+ - id: us-wv-motorcycle
264
+ class: motorcycle
265
+ categories: [motorcycle, moped]
266
+ period: { start: 2026 }
267
+ period_evidence: instrument-in-force-upper-bound
268
+ matching: recall-only
269
+ format:
270
+ pattern: "LLLLLLL"
271
+ regex: '\A[A-Z0-9](?: ?[A-Z0-9]){0,6}\z'
272
+ charset: { notes: "deliberately over-broad, hence recall-only. West Virginia publishes no Class G serial specification and §17A-3-14 imposes no alphabet or length — the seven-character bound is a DATASET-CHOSEN recall bound following the North American convention, not a legal claim." }
273
+ design:
274
+ plate: { unit: in, dimension_note: "reduced-size motorcycle plate; no West Virginia dimension is sourced" }
275
+ background: { finish: retroreflective }
276
+ emblem: { present: true, rendered: placeholder }
277
+ eligibility: "CLASS G: 'Every motorcycle including; motor driven cycles mopeds, having saddle, and no more than three wheels' (WV DMV Motor Vehicle Classifications)"
278
+ region_encoding: none
279
+ sources:
280
+ - "https://transportation.wv.gov/DMV/Vehicle-Services/Pages/Classifications.aspx # WV DMV: Class G definition, including motor-driven cycles and mopeds and the three-wheel bound"
281
+ - "https://code.wvlegislature.gov/17A-3-14/ # §17A-3-14(a): one plate per registered vehicle, configuration determined by the commissioner — the same rule applies to Class G"
282
+ notes: >-
283
+ WEST VIRGINIA CLASS G. Worth noting what West Virginia puts in ONE class
284
+ that other jurisdictions split across three: motorcycles, motor-driven
285
+ cycles and MOPEDS all register as Class G, bounded by "no more than three
286
+ wheels" rather than by engine displacement. The Netherlands gives mopeds
287
+ their own sidecodes and their own plate colour; West Virginia does not
288
+ distinguish them at all. Our `categories` records both kinds against the
289
+ one series, which is the honest mapping.
290
+
291
+ - id: us-wv-trailer
292
+ class: trailer
293
+ categories: [trailer]
294
+ period: { start: 2026 }
295
+ period_evidence: instrument-in-force-upper-bound
296
+ matching: recall-only
297
+ format:
298
+ pattern: "LLLLLLL"
299
+ regex: '\A[A-Z0-9](?: ?[A-Z0-9]){0,6}\z'
300
+ charset: { notes: "recall-only; no Class C or Class T serial specification is published" }
301
+ design:
302
+ plate: { unit: in }
303
+ background: { finish: retroreflective }
304
+ eligibility: "TWO CLASSES, SPLIT AT 2,000 POUNDS. Class C: all trailers and semitrailers EXCEPT house trailers and trailers/semitrailers designed to be drawn by Class A motor vehicles, having a gross weight of more than 2,000 lb. Class T: trailers, boat trailers or semitrailers designed to be drawn by Class A vehicles with a gross weight of LESS than 2,000 lb. Class R is a third, separate class for travel trailers (temporary living quarters). (WV DMV Motor Vehicle Classifications)"
305
+ region_encoding: none
306
+ sources:
307
+ - "https://transportation.wv.gov/DMV/Vehicle-Services/Pages/Classifications.aspx # WV DMV: the Class C / Class T / Class R trailer split and its 2,000-pound and tow-vehicle criteria"
308
+ notes: >-
309
+ WEST VIRGINIA TRAILERS, MODELLED AS ONE SERIES OVER THREE OFFICIAL
310
+ CLASSES — and flagged as a simplification rather than pretending the
311
+ state agrees with us. West Virginia splits trailers three ways (C, T, R)
312
+ on weight, tow vehicle and habitability. Whether each carries a distinct
313
+ serial series is exactly the fact not published, so collapsing them is
314
+ the conservative choice: one recall-only series, the official split
315
+ recorded verbatim, and the question flagged for the verifier.
316
+
317
+ - id: us-wv-antique
318
+ class: historic
319
+ categories: [car, van, truck, motorcycle]
320
+ period: { start: 2026 }
321
+ period_evidence: instrument-in-force-upper-bound
322
+ matching: recall-only
323
+ format:
324
+ pattern: "LLLLLLL"
325
+ regex: '\A[A-Z0-9](?: ?[A-Z0-9]){0,6}\z'
326
+ charset: { notes: "recall-only; no Class V serial specification is published" }
327
+ design:
328
+ plate: { unit: in }
329
+ background: { finish: retroreflective }
330
+ eligibility: "CLASS V: 'Antique motor vehicles are at least 25 years old' (WV DMV Motor Vehicle Classifications) — a ROLLING threshold"
331
+ region_encoding: none
332
+ sources:
333
+ - "https://transportation.wv.gov/DMV/Vehicle-Services/Pages/Classifications.aspx # WV DMV: Class V, antique motor vehicles at least 25 years old"
334
+ notes: >-
335
+ WEST VIRGINIA CLASS V, INCLUDED BECAUSE IT SHARPENS A CROSS-STATE
336
+ COMPARISON THE DATASET IS ALREADY MAKING. Florida runs TWO historic
337
+ regimes: Horseless Carriage on a FIXED cutoff (model year 1945 or
338
+ earlier, which never moves) and Antique on a ROLLING 30 years. West
339
+ Virginia runs one, rolling, at 25 years — the shortest rolling threshold
340
+ in this group. Rolling thresholds silently change eligibility every year
341
+ and are the ones that need re-auditing; fixed ones never do. Recording
342
+ the threshold TYPE, not just the number, is what makes that auditable.
343
+
344
+ - id: us-wv-government-official
345
+ class: government
346
+ categories: [car, van, truck, bus]
347
+ period: { start: 2026 }
348
+ period_evidence: instrument-in-force-upper-bound
349
+ matching: recall-only
350
+ format:
351
+ pattern: "LLLLLLL"
352
+ regex: '\A[A-Z0-9](?: ?[A-Z0-9]){0,6}\z'
353
+ charset: { notes: "recall-only; the special plates for government officials are authorised by a dedicated Code section whose text was not extracted in this pass" }
354
+ design:
355
+ plate: { unit: in }
356
+ background: { finish: retroreflective }
357
+ emblem: { present: true, rendered: placeholder }
358
+ region_encoding: none
359
+ sources:
360
+ - "https://code.wvlegislature.gov/17A-3-14/ # the section navigation on this page identifies the adjacent section by its official title: '§17A-3-14a. Special registration plates for government officials'"
361
+ notes: >-
362
+ WEST VIRGINIA GOVERNMENT-OFFICIAL PLATES. THE CITATION HERE IS A SECTION
363
+ TITLE, NOT A SECTION TEXT, AND THAT IS STATED RATHER THAN GLOSSED:
364
+ §17A-3-14a is named "Special registration plates for government
365
+ officials" in the Code's own navigation, which sources the EXISTENCE of a
366
+ distinct government-official series and nothing else. Eligibility, design
367
+ and serial arrangement are all recorded gaps. This entry exists so that a
368
+ consumer knows the series is real and a verifier knows exactly which
369
+ section to open; it deliberately claims no more than the title supports.
370
+
371
+ # =========================================================================
372
+ # PERSONALIZED + SPECIALTY INDEX.
373
+ # =========================================================================
374
+ - id: us-wv-personalized
375
+ class: personalized
376
+ categories: [car, van, truck, motorcycle, trailer]
377
+ period: { start: 2026 }
378
+ period_evidence: instrument-in-force-upper-bound
379
+ matching: recall-only
380
+ format:
381
+ pattern: "LLLLLLL"
382
+ regex: '\A[A-Z0-9](?: ?[A-Z0-9]){0,6}\z'
383
+ charset: { notes: "recall-only; West Virginia's personalized character limit and permitted character set were not obtained (recorded gap). Given that Virginia officially permits an ampersand and North Carolina officially permits ? & $ @, West Virginia's permitted set should be checked for non-alphanumeric glyphs before any strict regex is written." }
384
+ design:
385
+ plate: { unit: in }
386
+ background: { finish: retroreflective }
387
+ region_encoding: none
388
+ sources:
389
+ - "https://transportation.wv.gov/DMV/Vehicle-Services/License-Plates/Pages/Ordering-Info.aspx # WV DMV 'Personalized Plate Ordering Information': ordering, fees and the personalized plate availability search"
390
+ - "https://code.wvlegislature.gov/17A-3-14/ # §17A-3-14(a): the commissioner determines the configuration, which is the authority a personalized combination is issued under"
391
+ notes: >-
392
+ WEST VIRGINIA PERSONALIZED. Modelled as its own series because the serial
393
+ source differs — owner-chosen rather than division-assigned. Kept
394
+ deliberately thin: the ordering page was located but its character rules
395
+ were not extracted, and inventing a limit would be worse than recording
396
+ the gap. The cross-state lead is stated in `charset.notes` because two of
397
+ the five states in this group turned out to permit glyphs inside a
398
+ serial, and the right move is to check the other three rather than
399
+ assume.
400
+
401
+ - id: us-wv-specialty-index
402
+ class: specialty
403
+ categories: [car, van, truck, motorcycle, trailer]
404
+ period: { start: 2026 }
405
+ period_evidence: instrument-in-force-upper-bound
406
+ matching: recall-only
407
+ format:
408
+ pattern: "LLLLLLL"
409
+ regex: '\A[A-Z0-9](?: ?[A-Z0-9]){0,6}\z'
410
+ charset: { notes: "specialty serials are not uniform across programmes; the index makes no arrangement claim and is deliberately recall-only" }
411
+ design:
412
+ plate: { unit: in }
413
+ background: { finish: retroreflective }
414
+ note: "one design per authorised programme; the designs themselves are L4 scope (PRD-PLATES §2.5) and none is described here"
415
+ emblem: { present: true, rendered: placeholder }
416
+ program_index:
417
+ count_official: null
418
+ count_status: >-
419
+ NO OFFICIAL COUNT IS PUBLISHED, AND NONE IS INVENTED HERE. The WV DMV
420
+ presents its "License Plate Collection (Special Plates)" as four
421
+ picture galleries with no totals. A naive count of plate images on the
422
+ four category pages gives Associations & Organizations 42, Colleges &
423
+ Universities 23, General Interest 35, Military 53 — but those counts
424
+ include page chrome and navigation images and are NOT asserted as a
425
+ programme count. This is the weakest specialty index in group
426
+ southeast-a and is recorded as such rather than padded: contrast
427
+ Virginia's exactly reconciled 340.
428
+ official_categories: ["Associations & Organizations", "Colleges & Universities", "General Interest", "Military"]
429
+ official_list_url: "https://transportation.wv.gov/DMV/Vehicle-Services/License-Plates/Special-Plates/Pages/default.aspx"
430
+ official_poster_pdf: "https://transportation.wv.gov/DMV/DMVFormSearch/PLATE-POSTERS.pdf"
431
+ scope_note: "the DMV states that the four galleries show 'plates available for CLASS A motor vehicles' — i.e. the specialty programme is scoped to passenger cars and trucks of 10,000 lb or less, which is a scoping fact most state specialty indexes do not make explicit"
432
+ eligibility_note: "the DMV states that some plates have specific qualifications and that many MILITARY plates require certification from the West Virginia Department of Veterans Assistance — the same proof-before-purchase pattern Florida calls a 'special requirement' subtype"
433
+ per_plate_application_forms: "individual programmes are ordered on numbered DMV-54 forms (observed examples: DMV-54_hoopshospital.pdf, DMV-54_PIA_WV-American-Legion-Riders.pdf), so a per-programme enumeration is mechanically derivable from the DMV form index — the right route to a real count in an L4 pass"
434
+ region_encoding: none
435
+ sources:
436
+ - "https://transportation.wv.gov/DMV/Vehicle-Services/License-Plates/Special-Plates/Pages/default.aspx # WV DMV: the four categories, the Class A scoping, the qualification/certification requirements, the Department of Veterans Assistance rule, and the plate-collection posters"
437
+ - "https://transportation.wv.gov/DMV/DMVFormSearch/PLATE-POSTERS.pdf # the official plate-collection posters (linked, not parsed in this pass)"
438
+ notes: >-
439
+ THE WEST VIRGINIA SPECIALTY PROGRAM INDEX — and the honest report is that
440
+ it is thin. West Virginia publishes galleries, not a list, and no count.
441
+ Rather than borrow a number from an enthusiast site, this entry records
442
+ the four official categories, the Class A scoping, the certification
443
+ rule, and the ONE mechanical route to a real count that was actually
444
+ observed: each programme has its own numbered DMV-54 application form, so
445
+ enumerating the DMV form index yields a programme list from a first-party
446
+ source. That is the L4 instruction for this state.