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,404 @@
1
+ # plates/us-oh.yml — Ohio (PRD-PLATES gate L2, group midwest-a).
2
+ #
3
+ # WHAT OHIO IS FOR IN THIS DATASET: the state where the DISPLAY statute is
4
+ # unusually generous and the DESIGN statute is silent. ORC 4503.19 and 4503.21
5
+ # together settle, in primary law, that Ohio is a REAR-ONLY jurisdiction with a
6
+ # single inverted exception (commercial tractors display on the FRONT) — the
7
+ # same shape as Florida's truck-tractor rule and, like Florida's, a genuine
8
+ # outlier a naive front/rear classifier gets wrong. But nothing in Chapter 4503
9
+ # states a serial arrangement, a colour, or a plate dimension for the ordinary
10
+ # passenger plate. Ohio legislates DISPLAY and delegates DESIGN.
11
+ #
12
+ # SOURCING RULE APPLIED HERE (PRD-PLATES §4): edicts of government are public
13
+ # domain at every level, so every display, temporary-tag, county-sticker and
14
+ # government-plate claim below cites the Ohio Revised Code. The serial
15
+ # ARRANGEMENTS are a different matter and are flagged as such: no primary
16
+ # carrying them was obtained, so they are recorded with
17
+ # `period_evidence: secondary-first-issue` and `format.evidence: secondary`,
18
+ # never as statute-grade.
19
+ #
20
+ # FETCH-PROVENANCE NOTE (honest, and it applies to every file in this group):
21
+ # codes.ohio.gov — the official Ohio Revised Code host — refused every request
22
+ # from this environment (TCP reset), as did bmv.ohio.gov (an F5 rejection
23
+ # page). The statutory text quoted here was read from codes.findlaw.com, a
24
+ # third-party REPRODUCTION of the same edict. Both URLs are carried on every
25
+ # source line: the FindLaw URL is what was actually fetched, the codes.ohio.gov
26
+ # URL is the canonical citation a verifier should re-derive from. An edict does
27
+ # not change by being reprinted, but the provenance chain must say which copy
28
+ # was read.
29
+ #
30
+ # REGEX FORM (PRD-PLATES §2.6): every regex here is in PRINTED form — the
31
+ # separator is spelled where the plate shows it, and only `-` and ` ` are ever
32
+ # spelled, per plates/_meta/separators.yml.
33
+ #
34
+ # NOT HERE, DELIBERATELY (PRD-PLATES §2.5 + the L2 scope): individual specialty
35
+ # DESIGNS (L4); Ohio's commercial-truck (PBC 1234) and apportioned (PBC1234)
36
+ # series, which are outside the L2 core-class list; and any government-plate
37
+ # SERIES, because ORC 4503.16 gives the legend but no serial shape and none was
38
+ # sourced (recorded gap).
39
+ jurisdiction: us-oh
40
+ authority:
41
+ name: Ohio Bureau of Motor Vehicles (Ohio BMV), Ohio Department of Public Safety
42
+ url: "https://www.bmv.ohio.gov/"
43
+ binding: vehicle
44
+ statute_edition: "Ohio Revised Code Title XLV (Motor Vehicles), Chapter 4503, as reproduced by codes.findlaw.com and read 2026-08-02. The official host codes.ohio.gov was unreachable from this environment; no edition banner was therefore captured, and the edition is an UNVERIFIED currency claim."
45
+
46
+ # ---------------------------------------------------------------------------
47
+ # artwork_risk — required per jurisdiction by PRD-PLATES §4.
48
+ # ---------------------------------------------------------------------------
49
+ artwork_risk:
50
+ posture: unresearched-default-adverse
51
+ basis: >-
52
+ NOTHING FAVOURABLE WAS FOUND FOR OHIO, and that is the finding rather than a
53
+ gap in the search. The governing default is that 17 U.S.C. §105 does not
54
+ extend to the states, so a state work is copyrighted unless the state says
55
+ otherwise. Two surveys were checked for an Ohio carve-out and both are
56
+ silent: the Wikipedia survey of subnational copyright status covers
57
+ seventeen states and Ohio is NOT among them, and Commons' own
58
+ copyright-rules-by-territory page for the United States lists state PD tags
59
+ for CA, FL, GA, MA, ME, MN (Geological Survey), OK, WA (Redistricting
60
+ Commission) and one Alabama municipality — there is no {{PD-OHGov}}. No
61
+ Ohio statute, AG opinion or case establishing a public-domain rule for state
62
+ works was located. Ohio therefore sits at the default: TREAT THE ARTWORK AS
63
+ COPYRIGHTED. This is the opposite pole from Florida and must not be
64
+ softened by analogy to it.
65
+ emblem_rule: >-
66
+ PRD-PLATES §3's placeholder default applies with full force. The current
67
+ "Sunrise in Ohio" base is a full-bleed pictorial scene (skyline, hills,
68
+ river, wheat field, a child on a swing, a Wright Flyer) — the highest-risk
69
+ artwork category in the program, in a state with no PD posture. Render
70
+ `emblem: {present: true, rendered: placeholder}` and do not approximate the
71
+ scene beyond a neutral field. State-seal protection is independent of
72
+ copyright and is unresearched for Ohio.
73
+ photograph_caution: >-
74
+ The standing rule (PRD-PLATES §6): a CC licence on a Commons photograph of
75
+ an Ohio plate is the PHOTOGRAPHER's licence on the PHOTOGRAPH; the uploader
76
+ had no standing over the design. Because our renders are generated from
77
+ data and never derived from a photograph, those obligations never attach —
78
+ which is the whole argument for the own-SVG rule and is doing real work in
79
+ an adverse state like this one.
80
+ sources:
81
+ - "https://en.wikipedia.org/wiki/Copyright_status_of_works_by_subnational_governments_of_the_United_States # LOCATOR + NEGATIVE FINDING: seventeen states are covered and Ohio is not one of them"
82
+ - "https://commons.wikimedia.org/wiki/Commons:Copyright_rules_by_territory/United_States # the §105-does-not-reach-the-states rule, and the exhaustive list of state PD tags — no Ohio tag exists"
83
+
84
+ # ---------------------------------------------------------------------------
85
+ # The US standards chain, recorded once per US file. Voluntary, no federal
86
+ # mandate, and the delegation trap: AAMVA sends dimensions to SAE J686, whose
87
+ # own text is PAYWALLED and UNPINNED. Nothing here quotes J686.
88
+ # ---------------------------------------------------------------------------
89
+ us_standards:
90
+ no_federal_mandate: true
91
+ chain: "SAE J686 -> AAMVA License Plate Standard Edition 3 (September 2025) -> voluntary state adoption. AAMVA writes recommendations in the declarative present; read as RECOMMENDED PRACTICE, never as requirement."
92
+ aamva_edition_3:
93
+ dimensions_delegated: "AAMVA §3.1 sends plate dimensions and bolt holes to SAE J686. J686's own text was NOT obtained (paywalled); no J686 dimension is quoted anywhere in this dataset."
94
+ character_layout: "AAMVA §2.2: characters at least 2.5 in high, spaced at least 0.25 in apart, stroke weight 0.2-0.4 in, at least 1.25 in clear of top and bottom edges"
95
+ jurisdiction_name_layout: "AAMVA §2.1: jurisdiction name in the top centre between the bolt holes, at least 0.25 in above the plate number and 0.125 in from the top edge; jurisdiction characters 0.75-1.0 in"
96
+ stacked_characters: "AAMVA: 'If stacked characters are used, they are part of the official license plate number. No more than two characters are to be stacked.' Load-bearing in this GROUP — see the stacked-pair note on the Illinois and Wisconsin files."
97
+ replacement_cycle: "AAMVA §1.1 recommends a rolling or full replacement cycle 'not to exceed 7 to 10 years'. Ohio legislates NO replacement cycle at all (recorded gap) — contrast Michigan, which legislates a hard 10-year non-renewal, and Illinois, which runs a 10-year replating programme."
98
+ source: "https://www.aamva.org/getmedia/646bcc8a-219b-47d8-b5cd-726240473163/License-Plate-Standard-Edition-3_September-2025-Update.pdf"
99
+ folklore_caution: >-
100
+ The "1956 AMA standardization agreement" that supposedly fixed the 6x12 inch
101
+ plate is UNCITED in its Wikipedia source (a `citation needed` since 2017,
102
+ copied verbatim across articles — circular). It is NOT relied on here. Ohio
103
+ has no statutory plate dimension at all, so this file records no dimension
104
+ for the Ohio plate rather than importing the folklore number.
105
+
106
+ # ---------------------------------------------------------------------------
107
+ # Display rules — Ohio's best-sourced layer, entirely from statute.
108
+ # ---------------------------------------------------------------------------
109
+ display_rules:
110
+ default: "ONE plate, REAR. ORC 4503.19: 'The owner shall display the license plate and, when required, the validation sticker on the rear of the vehicle.'"
111
+ front_plate_required_when:
112
+ - "COMMERCIAL TRACTOR: 'However, a commercial tractor shall display the license plate on the front' (ORC 4503.19; repeated in ORC 4503.21) — front-only, the inverse of the state default and the same outlier shape as Florida's truck-tractor rule"
113
+ mounting: "ORC 4503.21: the plate must be displayed 'in plain view on the rear of the motor vehicle' and 'shall be securely fastened so as not to swing, and shall not be covered by any material that obstructs its visibility'. NOTE: unlike Florida (100 ft) and Illinois/Michigan (100 ft), Ohio's statute states NO legibility distance."
114
+ temporary_display: "ORC 4503.21: a temporary motor vehicle license registration is displayed 'in plain view from the rear of the vehicle either in the rear window or on an external rear surface'"
115
+ county_sticker: "ORC 4503.19 requires issuance of 'a county identification sticker, which shall be attached to the license plate' identifying the owner's county of residence. This is a STICKER, not a serial field — Ohio geography is on the plate but never in the plate string."
116
+ school_bus: "ORC 4503.19: 'The registrar or deputy registrar shall not issue a license plate for a school bus' — school buses are outside the ordinary plate system entirely"
117
+ penalty: "ORC 4503.19 and ORC 4503.21: 'Whoever violates this section is guilty of a minor misdemeanor.'"
118
+ front_plate_history: "Ohio required front plates until 1 July 2020 and has been rear-only since. The DATE is LOCATOR-GRADE (Wikipedia); what IS primary is that the current statutory text reads rear-only, which corroborates the change without dating it."
119
+ sources:
120
+ - "https://codes.findlaw.com/oh/title-xlv-motor-vehicles-aeronautics-watercraft/oh-rev-code-sect-4503-19.html # FETCHED. ORC 4503.19: rear display, commercial-tractor front exception, county identification sticker, school-bus exclusion, $7.50 per set of two / $6.50 single replacement, minor misdemeanor"
121
+ - "https://codes.ohio.gov/ohio-revised-code/section-4503.19 # CANONICAL citation for the same edict — NOT fetched this pass (host refused the connection)"
122
+ - "https://codes.findlaw.com/oh/title-xlv-motor-vehicles-aeronautics-watercraft/oh-rev-code-sect-4503-21.html # FETCHED. ORC 4503.21: plain view on the rear, commercial tractor front, no-swing/no-obstruction, temporary-tag rear-window display, minor misdemeanor"
123
+ - "https://codes.ohio.gov/ohio-revised-code/section-4503.21 # CANONICAL, not fetched"
124
+ - "https://en.wikipedia.org/wiki/Vehicle_registration_plates_of_Ohio # LOCATOR ONLY (PRD-PLATES §4): 'Only rear plates have been required for all classes of vehicles, except commercial tractors, since July 1, 2020.' The DATE is not asserted as sourced."
125
+
126
+ series:
127
+
128
+ # =========================================================================
129
+ # STANDARD ISSUE — current and one back. Same serial arrangement across
130
+ # both, which is why the ids are dated: the BASE changed, the format did not.
131
+ # =========================================================================
132
+ - id: us-oh-standard-2021
133
+ class: standard
134
+ categories: [car, van, truck, bus]
135
+ period: { start: 2021 }
136
+ period_evidence: secondary-first-issue
137
+ matching: strict
138
+ format:
139
+ pattern: "LLL 9999"
140
+ regex: '\A[A-Z]{3} ?\d{4}\z'
141
+ evidence: secondary
142
+ charset:
143
+ notes: >-
144
+ NO OHIO STATUTE CONSTRAINS THE ORDINARY SERIAL. ORC 4503.19 speaks of
145
+ "a license plate" and never of its composition; the only place Chapter
146
+ 4503 states a character grammar is ORC 4503.182, for TEMPORARY tags
147
+ (seven positions — see us-oh-temporary). No letter exclusions are
148
+ stated anywhere and none were observed. Consequently this file carries
149
+ NO `regex_statutory` for the standard series: there is no statutory
150
+ outer bound to record, and inventing one would be worse than the gap.
151
+ progression: "sequential three-letter blocks with a four-digit counter; observed range JDA 1000 -> JDZ 9999, then JRQ 1000 -> KRA 6695 as of 2025-05-23 (secondary)"
152
+ design:
153
+ background: { finish: retroreflective }
154
+ colour_note: >-
155
+ Dark blue screened serial on a full-bleed sunrise scene. NO HEX IS
156
+ RECORDED. Ohio's statute states no colour, the BMV site was unreachable,
157
+ and a hex invented from a photograph would be a fabricated fact wearing
158
+ a data field's clothes. Colour is a recorded gap, not an estimate.
159
+ legend_top: "OHIO"
160
+ legend_bottom: "Birthplace of Aviation"
161
+ graphic: { present: true, rendered: placeholder, description: "pictorial sunrise scene — skyline, hills, river, wheat field, a child on a swing and a Wright Flyer, with a red banner; observed via a Wikipedia locator only, never from a statutory drawing" }
162
+ emblem: { present: true, rendered: placeholder }
163
+ flat_vs_embossed: "reported as Ohio's first FLAT (screened, non-embossed) passenger base — secondary, and a real render-layer input if confirmed"
164
+ county_sticker: { present: true, position: "bottom centre", content: "county name, or on request the county number" }
165
+ region_encoding: "none in the serial. Ohio's county appears on a STICKER attached to the plate (ORC 4503.19), and the county-number scheme was replaced by county-NAME stickers on standard passenger plates in 2018 (secondary). A parse API must never try to decode Ohio geography out of the string."
166
+ sources:
167
+ - "https://codes.findlaw.com/oh/title-xlv-motor-vehicles-aeronautics-watercraft/oh-rev-code-sect-4503-19.html # FETCHED. ORC 4503.19: the county identification sticker attached to the plate; rear display; the absence of any serial grammar"
168
+ - "https://codes.ohio.gov/ohio-revised-code/section-4503.19 # CANONICAL, not fetched"
169
+ - "https://en.wikipedia.org/wiki/Vehicle_registration_plates_of_Ohio # LOCATOR ONLY: 'Sunrise in Ohio' first issued 2021-12-29; serial format ABC 1234; ranges JDA 1000-JDZ 9999 and JRQ 1000-KRA 6695 (2025-05-23); the 2018 return to county-NAME stickers"
170
+ notes: >-
171
+ OHIO STANDARD ISSUE, CURRENT BASE ("Sunrise in Ohio"). PERIOD CAVEAT, and
172
+ it is the important line in this entry: `start: 2021` rests on a Wikipedia
173
+ first-issue date of 29 December 2021 and on nothing else. No Ohio primary
174
+ dating a base introduction was obtained — Ohio does not legislate base
175
+ changes, the BMV host refused connections, and collector-site era tables
176
+ are exactly what PRD-PLATES §9 warns about. The year is therefore carried
177
+ with `period_evidence: secondary-first-issue`, which is a first-class
178
+ admission and not a footnote: a verifier must re-derive it before this
179
+ claim enters the five-nines ledger. The FORMAT is on the same footing.
180
+ What IS statute-grade here is only the county sticker and the display
181
+ rules.
182
+
183
+ - id: us-oh-standard-2013
184
+ class: standard
185
+ categories: [car, van, truck, bus]
186
+ period: { start: 2013, end: 2021 }
187
+ period_evidence: secondary-first-issue
188
+ matching: strict
189
+ format:
190
+ pattern: "LLL 9999"
191
+ regex: '\A[A-Z]{3} ?\d{4}\z'
192
+ evidence: secondary
193
+ charset: { notes: "identical grammar to the current base — the 2021 change was a BASE change, not a format change" }
194
+ design:
195
+ background: { finish: retroreflective }
196
+ colour_note: "dark blue serial on a word-cloud background with a red triangle; no hex recorded, for the reason given on the current base"
197
+ legend_top: "OHIO"
198
+ legend_bottom: "Birthplace of Aviation"
199
+ graphic: { present: true, rendered: placeholder, description: "'Ohio Pride' word-cloud field; secondary only" }
200
+ emblem: { present: true, rendered: placeholder }
201
+ region_encoding: "county sticker; no serial encoding"
202
+ sources:
203
+ - "https://en.wikipedia.org/wiki/Vehicle_registration_plates_of_Ohio # LOCATOR ONLY: 'Ohio Pride' base, 2013-04-15 to 2021-12-28, serial format ABC 1234, 46 slogan variants"
204
+ - "https://codes.findlaw.com/oh/title-xlv-motor-vehicles-aeronautics-watercraft/oh-rev-code-sect-4503-19.html # FETCHED. The statutory frame this base was issued under is unchanged, which is why no format difference is recorded"
205
+ notes: >-
206
+ ONE SERIES BACK ("Ohio Pride", 2013-2021). Carried because L2 asks for the
207
+ previous standard base, and it earns its place by demonstrating something a
208
+ format-only dataset would miss: TWO CONSECUTIVE OHIO BASES SHARE ONE
209
+ SERIAL GRAMMAR. A regex match on `ABC 1234` therefore dates an Ohio plate
210
+ not at all — the discriminator is the base artwork and the serial BLOCK,
211
+ not the shape. Both this period and the boundary date are
212
+ secondary-first-issue and overlap the current base's start year by
213
+ construction; the transition is recorded as adjacent, not as parallel
214
+ issuance.
215
+
216
+ # =========================================================================
217
+ # CORE DISTINCT CLASSES (L2 scope): motorcycle, trailer, dealer, temporary.
218
+ # Government is a RECORDED GAP — see the file header.
219
+ # =========================================================================
220
+ - id: us-oh-motorcycle-2015
221
+ class: motorcycle
222
+ categories: [motorcycle]
223
+ period: { start: 2015 }
224
+ period_evidence: secondary-first-issue
225
+ matching: strict
226
+ format:
227
+ pattern: "LLL99"
228
+ regex: '\A[A-Z]{3}\d{2}\z'
229
+ evidence: secondary
230
+ charset: { notes: "five positions, no printed separator observed; the reduced plate size is departmental, not statutory" }
231
+ progression: "observed from AAA01 (secondary)"
232
+ design:
233
+ background: { finish: retroreflective }
234
+ emblem: { present: true, rendered: placeholder }
235
+ size_note: "reduced motorcycle size; NO dimension recorded — Ohio legislates none and AAMVA delegates dimensions to the unpinned SAE J686"
236
+ region_encoding: none
237
+ sources:
238
+ - "https://en.wikipedia.org/wiki/Vehicle_registration_plates_of_Ohio # LOCATOR ONLY: motorcycle series 2015-present, format ABC12, from AAA01"
239
+ - "https://codes.findlaw.com/oh/title-xlv-motor-vehicles-aeronautics-watercraft/oh-rev-code-sect-4503-19.html # FETCHED. ORC 4503.19 governs issuance and rear display for motorcycles as for other vehicles; no motorcycle-specific grammar exists"
240
+ notes: >-
241
+ MOTORCYCLE. Its own series rather than a flag on the standard plate
242
+ because the FORMAT differs (five positions against seven) and the plate
243
+ size differs. Everything except the display rule is secondary; recorded as
244
+ such rather than omitted, because a plates dataset with no US motorcycle
245
+ coverage is less useful than one with flagged coverage.
246
+
247
+ - id: us-oh-trailer-2021
248
+ class: trailer
249
+ categories: [trailer]
250
+ period: { start: 2021 }
251
+ period_evidence: secondary-first-issue
252
+ matching: strict
253
+ format:
254
+ pattern: "ULL 9999"
255
+ regex: '\AU[A-Z]{2} ?\d{4}\z'
256
+ evidence: secondary
257
+ charset:
258
+ notes: >-
259
+ The leading U is an OBSERVED BLOCK ALLOCATION, not a statutory prefix:
260
+ the non-commercial trailer series is reported running from UAA 1000,
261
+ i.e. Ohio reserved the U-block for trailers. It is spelled as a literal
262
+ here because that is what the current series prints, but a verifier
263
+ should treat it as a range fact that will expire when the block does.
264
+ design:
265
+ background: { finish: retroreflective }
266
+ emblem: { present: true, rendered: placeholder }
267
+ region_encoding: none
268
+ sources:
269
+ - "https://en.wikipedia.org/wiki/Vehicle_registration_plates_of_Ohio # LOCATOR ONLY: non-commercial trailer 2021-present, format UBC 1234, from UAA 1000"
270
+ - "https://codes.findlaw.com/oh/title-xlv-motor-vehicles-aeronautics-watercraft/oh-rev-code-sect-4503-21.html # FETCHED. ORC 4503.21 display duty applies to the trailer plate as to any other"
271
+ notes: >-
272
+ NON-COMMERCIAL TRAILER. Separately serialized, hence its own series under
273
+ PRD-PLATES §2.3. The interesting modelling point is the U-BLOCK: Ohio
274
+ distinguishes the class by a letter block inside a shared grammar rather
275
+ than by a distinct grammar, so `[A-Z]{3} ?\d{4}` alone cannot tell a
276
+ trailer plate from a passenger plate — only the block can, and blocks
277
+ exhaust. A parse API must rank, not decide, on this evidence.
278
+
279
+ - id: us-oh-dealer-2021
280
+ class: dealer
281
+ categories: [car, van, truck, bus, motorcycle, trailer]
282
+ period: { start: 2021 }
283
+ period_evidence: secondary-first-issue
284
+ matching: strict
285
+ format:
286
+ pattern: "999 L9LL"
287
+ regex: '\A\d{3} ?[A-Z]\d[A-Z]{2}\z'
288
+ evidence: secondary-weak
289
+ charset:
290
+ notes: >-
291
+ FLAGGED AS THE WEAKEST FORMAT CLAIM IN THIS FILE. The arrangement
292
+ "123 A1BC" comes from a single secondary table and is unusual enough
293
+ (a letter-digit-letter-letter tail) that it may be a transcription of a
294
+ STACKED pair rather than a linear serial. No Ohio primary was
295
+ obtained. A verifier should either confirm it against a BMV source or
296
+ delete this series; it is carried, flagged, rather than silently
297
+ dropped, because dealer plates are inside the L2 core-class list.
298
+ design:
299
+ background: { finish: retroreflective }
300
+ legend_bottom: "Dealer"
301
+ emblem: { present: true, rendered: placeholder }
302
+ binding: business
303
+ region_encoding: none
304
+ sources:
305
+ - "https://en.wikipedia.org/wiki/Vehicle_registration_plates_of_Ohio # LOCATOR ONLY, and the sole source for this format: dealer series 2021-present, format 123 A1BC"
306
+ - "https://codes.findlaw.com/oh/title-xlv-motor-vehicles-aeronautics-watercraft/oh-rev-code-sect-4503-19.html # FETCHED. ORC 4503.19 is the issuance frame; it carries no dealer-plate grammar"
307
+ notes: >-
308
+ DEALER PLATES. `binding: business` for the same reason as Germany's rote
309
+ Kennzeichen and Florida's dealer plate: the plate follows the dealership,
310
+ not a vehicle. The format is the one entry in this file I would expect a
311
+ verifier to change.
312
+
313
+ - id: us-oh-temporary
314
+ class: temporary
315
+ categories: [car, van, truck, bus, motorcycle, trailer]
316
+ period: { start: 2026 }
317
+ period_evidence: instrument-in-force-upper-bound
318
+ matching: strict
319
+ format:
320
+ pattern: "LLLLLLL"
321
+ regex: '\A[A-Z0-9]{7}\z'
322
+ evidence: statutory
323
+ charset:
324
+ notes: >-
325
+ ORC 4503.182, verbatim: temporary registrations 'shall bear a
326
+ distinctive combination of SEVEN letters, numerals, or letters and
327
+ numerals, and shall incorporate a security feature that, to the
328
+ greatest degree possible, prevents tampering with any of the
329
+ information that is entered upon it when it is issued.' THIS IS THE
330
+ ONLY STATUTORY SERIAL GRAMMAR IN THE WHOLE OF OHIO'S PLATE LAW, which
331
+ is why the temporary tag — normally the least interesting class — is
332
+ the best-sourced series in this file. Seven positions exactly, the
333
+ full alphanumeric alphabet, no exclusions stated.
334
+ design:
335
+ material: "paper/card; ORC 4503.21 requires display 'in plain view from the rear of the vehicle either in the rear window or on an external rear surface'"
336
+ background: { finish: none }
337
+ emblem: { present: false }
338
+ security_feature: "required by ORC 4503.182 — anti-tamper, unspecified in kind"
339
+ validity: "FORTY-FIVE DAYS. ORC 4503.182: 'A temporary motor vehicle license registration issued under division (A) of this section is valid for a period of forty-five days from date of issuance and is not transferable or renewable.'"
340
+ region_encoding: none
341
+ sources:
342
+ - "https://codes.findlaw.com/oh/title-xlv-motor-vehicles-aeronautics-watercraft/oh-rev-code-sect-4503-182.html # FETCHED. ORC 4503.182: the seven-character grammar, the 45-day validity, non-transferable and non-renewable, the anti-tamper security feature, and the use restriction"
343
+ - "https://codes.ohio.gov/ohio-revised-code/section-4503.182 # CANONICAL, not fetched"
344
+ - "https://codes.findlaw.com/oh/title-xlv-motor-vehicles-aeronautics-watercraft/oh-rev-code-sect-4503-21.html # FETCHED. ORC 4503.21: where the temporary registration is displayed"
345
+ notes: >-
346
+ TEMPORARY REGISTRATION. `period.start: 2026` is an INSTRUMENT-IN-FORCE
347
+ UPPER BOUND — the statute is in force in the edition read and says nothing
348
+ about when the seven-character grammar began; Ohio has issued temporary
349
+ tags since long before. Recorded as an upper bound rather than invented,
350
+ exactly as the Florida pilot does. Two facts here are worth carrying
351
+ forward: paper temporary tags with a MANDATED CHARACTER COUNT are rare in
352
+ US law, and the 45-day window is longer than Michigan's 30 — temporary
353
+ validity is a genuine per-state variable, not a constant.
354
+
355
+ # =========================================================================
356
+ # SPECIALTY — PROGRAM INDEX ONLY (PRD-PLATES §2.5). No individual designs.
357
+ # =========================================================================
358
+ - id: us-oh-specialty-index
359
+ class: specialty
360
+ categories: [car, van, truck, motorcycle]
361
+ period: { start: 2026 }
362
+ period_evidence: instrument-in-force-upper-bound
363
+ matching: strict
364
+ format:
365
+ pattern: "LLL 9999"
366
+ regex: '\A[A-Z]{3} ?\d{4}\z'
367
+ evidence: secondary
368
+ charset: { notes: "specialty plates carry ORDINARY serials on an alternative design; no separate grammar is stated in law or observed" }
369
+ design:
370
+ background: { finish: retroreflective }
371
+ note: "one design per authorised programme; the designs themselves are L4 scope (PRD-PLATES §2.5) and none is described here"
372
+ emblem: { present: true, rendered: placeholder }
373
+ program_index:
374
+ count_official: null
375
+ count_status: RECORDED-GAP
376
+ count_note: >-
377
+ NO COUNT IS RECORDED, AND THE REASON IS PART OF THE RECORD. Ohio's own
378
+ plate catalogue lives at bmv.ohio.gov, which returned an F5 rejection
379
+ page to every request from this environment; no official figure was
380
+ obtained, and no secondary figure was found either (the Wikipedia
381
+ article states only that 'Ohio state law authorizes the Bureau of Motor
382
+ Vehicles to issue a number of specialty passenger plates, as defined in
383
+ Ohio Rev. Code chapter 4503' — a count-free sentence). Recording `null`
384
+ with a stated cause is the honest move; a guessed order of magnitude
385
+ would be indistinguishable from a fact once it is in YAML.
386
+ official_list_url: "https://www.bmv.ohio.gov/rs-license-plates.aspx"
387
+ official_list_fetch_status: "BLOCKED — F5/ASM rejection page ('The requested URL was rejected') on every attempt from this environment, 2026-08-02"
388
+ statutory_basis: "Ohio Revised Code Chapter 4503 authorises the individual specialty plates one section at a time (the sections in the 4503.4x-4503.9x range), rather than by a single generic authorisation with a petition threshold. That is the structural contrast with Illinois (2,000 applications, 625 ILCS 5/3-600) and Wisconsin (500 signatures, Wis. Stat. 341.14): OHIO'S SPECIALTY CATALOGUE IS A LIST OF STATUTES, so its true size is countable from the code itself — a tractable follow-up that needs codes.ohio.gov to be reachable."
389
+ region_encoding: none
390
+ sources:
391
+ - "https://en.wikipedia.org/wiki/Vehicle_registration_plates_of_Ohio # LOCATOR ONLY: 'Ohio state law authorizes the Bureau of Motor Vehicles to issue a number of specialty passenger plates, as defined in Ohio Rev. Code chapter 4503' — no number given"
392
+ - "https://codes.findlaw.com/oh/title-xlv-motor-vehicles-aeronautics-watercraft/oh-rev-code-sect-4503-14.html # FETCHED. ORC 4503.14 is a worked example of the per-plate statutory pattern: it authorises plates bearing 'the official call letters of the applicant as assigned by the federal communications commission' for licensed amateur-radio and broadcast operators"
393
+ notes: >-
394
+ THE OHIO SPECIALTY PROGRAM INDEX — one entry standing for the whole
395
+ programme, per PRD-PLATES §2.5. The count is a declared gap. The finding
396
+ worth carrying forward is STRUCTURAL rather than numeric: Ohio does not
397
+ have a generic specialty-plate mechanism with a petition threshold the way
398
+ Illinois and Wisconsin do; it authorises plates individually in statute.
399
+ That makes the Ohio catalogue enumerable from a public-domain edict rather
400
+ than from an agency page — a better long-run source than any brochure, and
401
+ one that also explains why the amateur-radio call-sign plate (ORC 4503.14)
402
+ is a SPECIALTY plate whose serial is not assigned by the state at all but
403
+ by the FCC. That is a genuinely unusual serial provenance and the only
404
+ Ohio plate whose characters are governed by federal allocation.