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,438 @@
1
+ # plates/us-ia.yml — Iowa (PRD-PLATES gate L2, group midwest-b).
2
+ #
3
+ # IOWA PUTS THE COUNTY ON EVERY PLATE, BY STATUTE, AND IT IS NOT A CODE. Iowa
4
+ # Code § 321.166(2): "Every registration plate issued by the county treasurer
5
+ # shall display the name of the county". That is a mandatory geographic legend on
6
+ # essentially every Iowa plate — a stronger rule than Florida's, where the county
7
+ # name is a county-level opt-out — but it encodes nothing in the SERIAL. So Iowa
8
+ # is the clearest case in this dataset of geography that is READABLE but not
9
+ # DECODABLE: you can see the county on the plate and you cannot recover it from
10
+ # the plate number. `region_encoding` below says exactly that.
11
+ #
12
+ # IOWA ALSO SPELLS THREE SERIAL AFFIXES INTO STATUTE, which is unusual and
13
+ # genuinely useful, because each is a sourced literal a parser can key on:
14
+ # * "DV" PRECEDES the number on disabled-veteran plates (§ 321.166(6));
15
+ # * "D" appears on dealer plates, at serial character size (§ 321.166(3));
16
+ # * "special" appears on special truck plates (§ 321.166(2)).
17
+ # Those are specified as their own series below.
18
+ #
19
+ # AND IOWA LEGISLATES THAT EACH NEW SERIES MUST LOOK DIFFERENT FROM THE LAST:
20
+ # § 321.166(5), "When a new series of registration plates is issued to replace a
21
+ # current series, the new registration plates shall be of a distinctively
22
+ # different color from the series which is replaced." Kansas legislates the same
23
+ # idea (K.S.A. 8-147(d)). Two neighbouring states have independently made their
24
+ # own series boundaries visually detectable, which is a gift to this dataset.
25
+ jurisdiction: us-ia
26
+ authority:
27
+ name: Iowa Department of Transportation, Motor Vehicle Division (plates issued through the county treasurers)
28
+ url: "https://www.legis.iowa.gov/docs/code/321.166.pdf"
29
+ binding: vehicle
30
+ statute_edition: "Iowa Code 2026, Chapter 321 (Motor Vehicles and Law of the Road), §§ 321.34 and 321.166 as published by the Iowa Legislature; and Iowa Administrative Code 761 ch. 401 (Special Registration Plates), whose rule 401.3 carries [ARC 8937C, IAB 2/19/25, effective 3/26/25]"
31
+
32
+ # ---------------------------------------------------------------------------
33
+ # artwork_risk — required per jurisdiction by PRD-PLATES §4.
34
+ # ---------------------------------------------------------------------------
35
+ artwork_risk:
36
+ posture: unresearched
37
+ basis: >-
38
+ IOWA WAS NOT LOCATED IN ANY COPYRIGHT SURVEY READ FOR THIS PASS. The Wikipedia survey
39
+ of subnational-government copyright status carries per-state sections for seventeen
40
+ states and NO section for Iowa; no {{PD-IAGov}} tag was found on Commons. The
41
+ dossier's default therefore governs: 17 U.S.C. § 105 does not reach the states, so an
42
+ Iowa plate design is presumed COPYRIGHTED unless Iowa says otherwise, and Iowa has not
43
+ been shown to say otherwise. Recorded as unresearched, not adverse — absence of a
44
+ fetched source is weak evidence either way.
45
+ edict_carve_out: >-
46
+ Iowa's carve-out is unusually wide because Iowa legislates unusually much of its plate.
47
+ The size ceiling, the character height and stroke limits, the 100-foot daylight
48
+ readability rule, the county-name legend, the contrast rule, the distinct-colour rule
49
+ for new series, the DV prefix, the dealer D and the 'special' truck legend are ALL in
50
+ the Iowa Code, and the minimum and maximum character counts are in the Iowa
51
+ Administrative Code. Edicts of government are uncopyrightable at every level
52
+ ({{PD-US-GovEdict}}), so nearly the whole factual layer of this file is affirmatively
53
+ clean regardless of Iowa's posture on artwork.
54
+ emblem_rule: >-
55
+ PRD-PLATES §3's placeholder default applies to the current Iowa base graphic and to
56
+ the 'processed emblem' and 'organization decal' that § 321.166(9) provides space for
57
+ on special plates. The organization decals carry an ADDITIONAL layer: § 321.34(13)
58
+ decals are designed by nonprofit organizations and approved by the department, so they
59
+ are third-party artwork licensed into a state program rather than state work at all,
60
+ and a clean state posture would not clear them. Render
61
+ `emblem: {present: true, rendered: placeholder}`. Iowa state-seal misuse statutes are
62
+ unresearched.
63
+ sources:
64
+ - "https://en.wikipedia.org/wiki/Copyright_status_of_works_by_subnational_governments_of_the_United_States # LOCATOR ONLY (PRD-PLATES §4): read to establish that Iowa has NO section in the survey — a negative result, recorded as such"
65
+ - "https://www.legis.iowa.gov/docs/code/321.166.pdf # Iowa Code § 321.166, the statutory plate specification itself — an edict of government, PD"
66
+
67
+ us_standards:
68
+ no_federal_mandate: true
69
+ chain: "SAE J686 -> AAMVA License Plate Standard Edition 3 (September 2025) -> voluntary state adoption. AAMVA has no enforcement power; its declarative present is RECOMMENDED PRACTICE."
70
+ dimensions_delegated: >-
71
+ AAMVA §3.1 sends dimensions and bolt holes to SAE J686, whose text is PAYWALLED and
72
+ UNPINNED, and no J686 dimension is quoted here. IOWA IS THE ONE STATE IN GROUP
73
+ MIDWEST-B THAT DOES NOT NEED IT: § 321.166(1)(a) states a size ceiling in law — plates
74
+ 'of a size NOT TO EXCEED six inches by twelve inches' — so Iowa's dimension is sourced
75
+ to an Iowa edict and owes nothing to the standards chain or to the uncited 1956 story.
76
+ geometry_available: >-
77
+ AAMVA §2.1 and §2.2 supply the renderable layout geometry generally. For Iowa the
78
+ CHARACTER geometry is in statute and is stricter in kind: § 321.166(3) caps character
79
+ height at four inches and stroke width at five-eighths of an inch, where AAMVA §2.2
80
+ sets a 2.5-inch character-height FLOOR. The two are compatible — AAMVA's minimum sits
81
+ below Iowa's maximum — but note they are opposite instruments, a floor and a ceiling.
82
+ retroreflectivity: "AAMVA §3.3: legible day and night from at least 75 feet; ASTM D4956-19 and ISO 7591:1982 clause 3; entrance angle 0.2 deg, observation angle -4 deg, minimum 45 cd/lx/m^2. Iowa's own statutory legibility rule is a 100-foot DAYLIGHT test (§ 321.166(4)), which is a different measurement, not a stricter version of the same one."
83
+ replacement_cycle_recommendation: "AAMVA §1.1 recommends a cycle 'not to exceed 7 to 10 years'. Iowa legislates NO replacement cycle in § 321.166 or § 321.34; instead § 321.34(2)(a) lets the department REASSIGN existing plates indefinitely and issue an annual validation sticker. Recorded gap as to any Iowa cycle."
84
+ source: "https://www.aamva.org/getmedia/646bcc8a-219b-47d8-b5cd-726240473163/License-Plate-Standard-Edition-3_September-2025-Update.pdf"
85
+ folklore_caution: >-
86
+ The '1956 AMA standardization agreement' said to have fixed the 6x12 inch plate is
87
+ UNCITED in its Wikipedia source (a `citation needed` since 2017, copied across
88
+ articles — circular). Recorded as COMMONLY REPEATED, UNSOURCED. Iowa is the state where
89
+ this matters least and is easiest to demonstrate: Iowa's six-by-twelve is cited below to
90
+ § 321.166(1)(a), which states it in law, so nothing in this file depends on the folklore.
91
+
92
+ # ---------------------------------------------------------------------------
93
+ # Display rules. Iowa is a TWO-PLATE state with a six-class single-plate list.
94
+ # ---------------------------------------------------------------------------
95
+ display_rules:
96
+ default: "TWO plates. Iowa Code § 321.34(1): the county treasurer 'shall issue to the owner one registration plate for a motorcycle, motorized bicycle, autocycle, truck tractor, trailer, or semitrailer and TWO registration plates for every other motor vehicle'."
97
+ single_plate_classes: ["motorcycle", "motorized bicycle", "autocycle", "truck tractor", "trailer", "semitrailer"]
98
+ validation_sticker: >-
99
+ § 321.34(2)(a): one validation sticker per set of plates, specifying the month and
100
+ year of expiration, 'displayed only on the rear registration plate, EXCEPT that the
101
+ sticker shall be displayed on the FRONT registration plate of a truck tractor' — the
102
+ truck-tractor inversion again, this time applied to the sticker rather than the plate.
103
+ A sticker for the upcoming year issued before the current year expires does not
104
+ invalidate the registration and need not be displayed until the vehicle would otherwise
105
+ be driving on an expired registration under § 321.39.
106
+ expiration_on_plate: "§ 321.166(7): the year and month of expiration, which may be abbreviated, shall be displayed on plates issued by the county treasurer; the department may prescribe a distinctive emblem or validation sticker to designate them. Not required on § 321.19 plates."
107
+ plate_retention_on_transfer: "§ 321.34(1): plates are assigned to the OWNER, not the vehicle — on transferring the vehicle the owner REMOVES the plates and either forwards them to a county treasurer or has them assigned to another vehicle within thirty days. Iowa is therefore closer to the Swiss owner-binding model than most US states, though the binding is still recorded as `vehicle` because registration itself is vehicle-keyed."
108
+ sources:
109
+ - "https://www.legis.iowa.gov/docs/code/321.34.pdf # Iowa Code § 321.34(1): one plate for six named classes and two for every other motor vehicle, plates assigned to the owner, removal on transfer and the thirty-day reassignment window; (2)(a) the validation sticker, its month-and-year content, rear display and the truck-tractor front-display exception, and the early-sticker rule"
110
+ - "https://www.legis.iowa.gov/docs/code/321.166.pdf # Iowa Code § 321.166(7): the year and month of expiration displayed on county-treasurer-issued plates"
111
+
112
+ series:
113
+
114
+ # =========================================================================
115
+ # THE STANDARD-ISSUE SERIES.
116
+ # =========================================================================
117
+ - id: us-ia-standard
118
+ class: standard
119
+ categories: [car, van, truck, bus]
120
+ period: { start: 2026 }
121
+ period_evidence: instrument-in-force-upper-bound
122
+ matching: recall-only
123
+ format:
124
+ pattern: "LLL999"
125
+ regex: '\A[A-Z0-9](?: ?[A-Z0-9]){1,6}\z'
126
+ charset:
127
+ min_characters: 2
128
+ min_characters_basis: "Iowa Admin. Code r. 761-401.3(1): 'Plates will be issued with a minimum of two characters.' A sourced FLOOR, which almost no state states."
129
+ notes: >-
130
+ § 321.166(2) is the statutory grammar and it is broad: 'Every registration plate
131
+ or pair of plates shall display a registration plate number which shall consist of
132
+ ALPHABETICAL OR NUMERICAL CHARACTERS OR A COMBINATION THEREOF and the name of this
133
+ state, which may be abbreviated.' No width and no arrangement are stated, and the
134
+ department is authorised to 'adopt rules to implement this subsection'. NO LETTER
135
+ EXCLUSIONS appear in § 321.166 or § 321.34 — whether Iowa skips I/O/Q was NOT
136
+ established (recorded gap).
137
+ pattern_note: >-
138
+ REPRESENTATIVE SHAPE ONLY, on the nl-export precedent. Iowa's serial ARRANGEMENT is
139
+ not stated in the Code, the implementing rules were not located, and the Iowa DOT
140
+ website returned HTTP 403 to every request in this pass. What IS sourced is a
141
+ two-character FLOOR (761-401.3(1)) and, for emblem plates, a five-character ceiling
142
+ (761-401.3(2)); the regex encodes the floor and stays wide above it, and
143
+ `matching: recall-only` says a hit is a shape hit only.
144
+ design:
145
+ plate: { w: 12, h: 6, unit: in, w_mm: 304.8, h_mm: 152.4 }
146
+ plate_dimension_note: >-
147
+ § 321.166(1)(a), verbatim: plates 'shall be of metal and of a size NOT TO EXCEED six
148
+ inches by twelve inches, except that the size of plates issued for use on autocycles,
149
+ motorized bicycles, motorcycles, motorcycle trailers, and trailers with an empty
150
+ weight of two thousand pounds or less shall be established by the department.' Note
151
+ this is a CEILING, unlike Florida's § 320.06(3)(a), which states minima for the same
152
+ two numbers. The reduced sizes are departmental and were not obtained (gap).
153
+ small_trailer_option: "§ 321.166(1)(b) and (8): trailers of 2,000 lb empty weight or less receive smaller plates by rule, but 'may, upon request, be licensed with regular-sized license plates'"
154
+ character_geometry: "§ 321.166(3): the registration plate number 'shall be displayed in characters which shall not exceed a height of four inches nor a stroke width exceeding five-eighths of an inch'. Sizes for autocycles, motorized bicycles, motorcycles, small trailers and motorcycle trailers are prescribed by the department."
155
+ legibility: "§ 321.166(4): the plate number, except on the small-vehicle classes, 'shall be of sufficient size to be readable from a distance of one hundred feet during daylight' — a DAYLIGHT test, where Minnesota's counterpart is a night test"
156
+ contrast_rule: "§ 321.166(5): 'There shall be a marked contrast between the color of the registration plates and the data which is required to be displayed on the registration plates.'"
157
+ series_colour_change_rule: >-
158
+ § 321.166(5), verbatim and consequential for this dataset: 'When a new series of
159
+ registration plates is issued to replace a current series, the new registration
160
+ plates shall be of a DISTINCTIVELY DIFFERENT COLOR from the series which is
161
+ replaced, except for collegiate registration plates issued under section 321.34,
162
+ subsection 7 or 7A.' Iowa has legislated that its series boundaries are visually
163
+ detectable — and then carved collegiate plates out of the rule, so collegiate plates
164
+ alone may span a boundary without changing colour.
165
+ legend_state: "Iowa (may be abbreviated, § 321.166(2))"
166
+ legend_county: "the name of the county — mandatory on every plate issued by a county treasurer (§ 321.166(2))"
167
+ colour_note: >-
168
+ NO HEX IS RECORDED. Iowa mandates CONTRAST and mandates CHANGE-ON-REISSUE but names
169
+ no colour value, the implementing rules were not located, and the Iowa DOT site
170
+ returned 403. Recorded gap rather than an eyedropped value.
171
+ emblem: { present: true, rendered: placeholder }
172
+ material: "metal (§ 321.166(1)(a))"
173
+ region_encoding:
174
+ geographic_legend: >-
175
+ PRESENT, MANDATORY AND NOT DECODABLE. § 321.166(2): 'Every registration plate issued
176
+ by the county treasurer shall display the name of the county, including any plate
177
+ issued pursuant to section 321.34' — with named exceptions for Pearl Harbor and
178
+ purple heart plates issued before 1 January 1997, and for collegiate, fire fighter
179
+ and medal of honor plates. So the county appears as PRINTED TEXT on essentially
180
+ every Iowa plate, and encodes nothing in the serial. There is no geographic decode
181
+ in an Iowa plate string.
182
+ contrast_with_florida: >-
183
+ Iowa's county legend is STRONGER than Florida's. Florida § 320.06(3)(a) lets a county
184
+ commission vote the county name off its plates in favour of the state motto or
185
+ 'Sunshine State'; Iowa gives the county no such opt-out and instead exempts specific
186
+ PLATE TYPES. The modelling consequence differs accordingly: in Florida the bottom
187
+ legend is a property of the selling county, in Iowa it is a property of the plate type.
188
+ contrast_with_neighbours: >-
189
+ Worth stating for the encyclopedia, because this group contains both designs: Iowa and
190
+ Kansas put the county on the plate as a LEGEND or letters, while Nebraska and (by
191
+ report) South Dakota put a county NUMBER into the serial itself. Only the latter is
192
+ machine-decodable from a plate string.
193
+ sources:
194
+ - "https://www.legis.iowa.gov/docs/code/321.166.pdf # Iowa Code § 321.166(1)(a)-(b): metal, the six-by-twelve CEILING, departmental sizes for small vehicles, the small-trailer regular-plate option; (2) the alphabetical-or-numerical-or-combination grammar, the abbreviable state name, the MANDATORY county name with its Pearl Harbor / purple heart / collegiate / fire fighter / medal of honor exceptions, the 'special' truck legend and the rulemaking authority; (3) four-inch character height and five-eighths-inch stroke ceilings and the dealer 'D'; (4) the 100-foot daylight readability rule; (5) marked contrast and the distinctively-different-colour rule for new series with its collegiate carve-out; (6) the DV prefix; (7) year and month of expiration; (8) small-trailer plates; (9) design consistency and emblem space for special plates; (10) no issuance fee on a special-plate redesign"
195
+ - "https://www.legis.iowa.gov/docs/iac/chapter/761.401.pdf # Iowa Admin. Code r. 761-401.3(1): the two-character minimum; 401.3(2): the five-character maximum for plates with a processed emblem and for § 321.34(13) plates. [ARC 8937C, IAB 2/19/25, effective 3/26/25]"
196
+ notes: >-
197
+ IOWA STANDARD ISSUE. THE ID IS DELIBERATELY UNDATED and the series is deliberately
198
+ `recall-only`: Iowa legislates its plate's PHYSICS in unusual detail — a size ceiling,
199
+ a character-height ceiling, a stroke ceiling, a daylight readability distance — and
200
+ leaves its GRAMMAR to rules this pass could not reach, with the Iowa DOT website
201
+ returning 403 to every request.
202
+ PERIOD CAVEAT: `start: 2026` is the Iowa Code edition read and is an UPPER BOUND on the
203
+ true start of the current base, not a claim about it. THE ONE SERIES BACK IS A
204
+ RECORDED GAP — but Iowa is the state where recovering it should be EASIEST, because
205
+ § 321.166(5) guarantees that each new series differs in colour from the one it
206
+ replaced, so the series history is in principle a colour sequence and a single
207
+ departmental source would unlock the whole chain.
208
+
209
+ # =========================================================================
210
+ # THE THREE STATUTORY SERIAL AFFIXES. Each is a sourced literal, which makes
211
+ # these the most confidently specified Iowa series in the file.
212
+ # =========================================================================
213
+ - id: us-ia-disabled-veteran
214
+ class: standard
215
+ categories: [car, van, truck]
216
+ period: { start: 2026 }
217
+ period_evidence: instrument-in-force-upper-bound
218
+ matching: strict
219
+ format:
220
+ pattern: "DV999"
221
+ regex: '\ADV ?[A-Z0-9]{1,5}\z'
222
+ charset:
223
+ prefix_literal: "DV"
224
+ notes: >-
225
+ § 321.166(6), verbatim: 'Registration plates issued to a disabled veteran under
226
+ the provisions of section 321.105 shall display the alphabetical characters "DV"
227
+ which shall PRECEDE the registration plate number.' A statutory literal PREFIX is
228
+ the single most parser-friendly fact a plate statute can contain, and Iowa states
229
+ it unambiguously. The number following DV is the ordinary registration plate
230
+ number, whose grammar is unsourced (see us-ia-standard).
231
+ pattern_note: "the DV prefix is a sourced literal and is fixed in the regex; the following number is left wide because Iowa's serial grammar is not sourced. The optional separator reflects that § 321.166 prescribes no spacing."
232
+ design:
233
+ note: "§ 321.166(6): the plates 'may also display a persons with disabilities parking sticker if issued to the disabled veteran by the department under section 321L.2'"
234
+ emblem: { present: true, rendered: placeholder }
235
+ colour_note: "no hex recorded; § 321.166 names no colour value"
236
+ region_encoding: "county name legend as on the standard series (§ 321.166(2))"
237
+ sources:
238
+ - "https://www.legis.iowa.gov/docs/code/321.166.pdf # Iowa Code § 321.166(6): the mandatory 'DV' prefix on disabled-veteran plates issued under § 321.105, and the optional persons-with-disabilities parking sticker under § 321L.2"
239
+ notes: >-
240
+ DISABLED VETERAN PLATES. Its own series because the statute mandates a FORMAT
241
+ difference — a literal prefix inside the plate number — which under PRD-PLATES §2.3 is
242
+ a series-making difference of a stronger kind than a mere legend change. CLASS
243
+ CAVEAT: recorded as `standard`, since _meta/classes.yml has no veteran or disability
244
+ class and this is an ordinary registration carrying a mandated prefix. Iowa's
245
+ eligibility criteria are in § 321.105, which was not read in this pass (gap).
246
+
247
+ - id: us-ia-dealer
248
+ class: dealer
249
+ categories: [car, van, truck, motorcycle, trailer]
250
+ period: { start: 2026 }
251
+ period_evidence: instrument-in-force-upper-bound
252
+ matching: recall-only
253
+ format:
254
+ pattern: "D9999"
255
+ regex: '\A[A-Z0-9](?: ?[A-Z0-9]){1,6}\z'
256
+ charset:
257
+ marker_literal: "D"
258
+ notes: >-
259
+ § 321.166(3), verbatim: 'Special plates issued to dealers shall display the
260
+ alphabetical character "D", which shall be of the SAME SIZE as the characters in
261
+ the registration plate.' Note what the statute does and does not say: it requires
262
+ the character D to appear, at serial character size, but — unlike the DV rule in
263
+ subsection (6) — it does NOT say the D precedes the number or forms part of it.
264
+ Its POSITION is therefore unsourced, which is why this series is `recall-only`
265
+ while the disabled-veteran series above is `strict`.
266
+ pattern_note: >-
267
+ REPRESENTATIVE SHAPE ONLY. The regex deliberately does NOT pin the D, because
268
+ pinning it to the front would assert a position the statute does not state. The
269
+ sourced fact — that a same-size D appears — is carried in
270
+ `charset.marker_literal` instead, where it cannot be mistaken for a grammar.
271
+ design:
272
+ note: "the D is required to be the same size as the serial characters, which distinguishes it from a small legend or emblem and is why it may well be part of the number"
273
+ emblem: { present: true, rendered: placeholder }
274
+ binding: business
275
+ region_encoding: "county name legend as on the standard series, since dealer plates are issued by the county treasurer (§ 321.166(2))"
276
+ sources:
277
+ - "https://www.legis.iowa.gov/docs/code/321.166.pdf # Iowa Code § 321.166(3): the dealer 'D' at the same size as the registration plate characters"
278
+ notes: >-
279
+ DEALER PLATES. `binding: business` on the standing reasoning that the plate follows the
280
+ trade rather than a vehicle. The interesting discipline point is the CONTRAST WITH THE
281
+ DV RULE two subsections away: Iowa's legislature said 'shall PRECEDE the registration
282
+ plate number' for DV and merely 'shall display the alphabetical character "D"' for
283
+ dealers, and this file honours that difference by pinning one and not the other. It
284
+ would have been easy, and wrong, to write both as prefixes.
285
+
286
+ - id: us-ia-special-truck
287
+ class: standard
288
+ categories: [truck]
289
+ period: { start: 2026 }
290
+ period_evidence: instrument-in-force-upper-bound
291
+ matching: recall-only
292
+ format:
293
+ pattern: "LLL999"
294
+ regex: '\A[A-Z0-9](?: ?[A-Z0-9]){1,6}\z'
295
+ pattern_note: "REPRESENTATIVE SHAPE ONLY; § 321.166(2) mandates a LEGEND on these plates and says nothing about their serial, so the standard series' unsourced grammar applies and `matching: recall-only` follows"
296
+ design:
297
+ legend: "special"
298
+ legend_rule: "§ 321.166(2), verbatim: 'Special truck registration plates shall display the word \"special\".'"
299
+ emblem: { present: true, rendered: placeholder }
300
+ colour_note: "no hex recorded; § 321.166 names no colour value"
301
+ region_encoding: "county name legend as on the standard series (§ 321.166(2))"
302
+ sources:
303
+ - "https://www.legis.iowa.gov/docs/code/321.166.pdf # Iowa Code § 321.166(2): the mandatory 'special' legend on special truck registration plates"
304
+ notes: >-
305
+ SPECIAL TRUCK PLATES. A statutory legend series on the Florida model — us-fl-restricted
306
+ and us-fl-wrecker are the same shape of record. CLASS CAVEAT: recorded as `standard`,
307
+ because the vocabulary has no commercial or farm-truck class and the legend carries the
308
+ meaning. What a 'special truck' IS under Iowa law is defined elsewhere in Chapter 321
309
+ and was not resolved in this pass (recorded gap) — the legend and its mandate are
310
+ sourced, the underlying vehicle class is not.
311
+
312
+ # =========================================================================
313
+ # BLACKOUT — statutory, and the Iowa half of a two-state Midwestern pattern.
314
+ # =========================================================================
315
+ - id: us-ia-blackout
316
+ class: specialty
317
+ categories: [car, van, truck, motorcycle]
318
+ period: { start: 2026 }
319
+ period_evidence: instrument-in-force-upper-bound
320
+ matching: recall-only
321
+ format:
322
+ pattern: "LLL999"
323
+ regex: '\A[A-Z0-9](?: ?[A-Z0-9]){1,6}\z'
324
+ pattern_note: "REPRESENTATIVE SHAPE ONLY; § 321.34(11C) authorises the plate and its design without stating a serial grammar, so the standard series' unsourced grammar applies"
325
+ design:
326
+ note: >-
327
+ THE DESIGN IS SOURCED ONLY BY ITS NAME AND BY AN EXEMPTION. § 321.34(11C) creates
328
+ 'Blackout plates' as a numbered special-plate subsection, and § 321.166(9) lists
329
+ blackout plates among the special plates EXEMPT from the rule that special plates
330
+ 'shall be consistent with the design and color of regular registration plates' —
331
+ which is the statutory way of saying the blackout plate is allowed to look
332
+ completely unlike an Iowa plate. Its actual colours are not stated in the Code and
333
+ the Iowa DOT site returned 403, so no hex is recorded here.
334
+ design_freedom_basis: "§ 321.166(9) exempts gold star, medal of honor, collegiate, fire fighter, natural resources, BLACKOUT and flying our colors plates from the design-and-colour-consistency requirement imposed on other special plates"
335
+ emblem: { present: false }
336
+ colour_note: >-
337
+ NO HEX RECORDED — and the contrast with North Dakota is the point. North Dakota
338
+ legislated its blackout plate's colours as VALUES (NDCC § 39-04-10.18(2): 'a solid
339
+ black background', 'white numbers and letters'), so us-nd-blackout carries
340
+ `hex_basis: statute`. Iowa legislated only that its blackout plate need not match
341
+ the regular design. Same plate concept, two states, and only one of them is
342
+ citable for a colour.
343
+ region_encoding: "county name legend as on the standard series, since these are county-treasurer-issued plates (§ 321.166(2))"
344
+ sources:
345
+ - "https://www.legis.iowa.gov/docs/code/321.34.pdf # Iowa Code § 321.34(11C): 'Blackout plates' as an authorised special registration plate subsection"
346
+ - "https://www.legis.iowa.gov/docs/code/321.166.pdf # Iowa Code § 321.166(9): blackout plates among those exempt from the design-and-colour-consistency requirement, i.e. the statutory licence for the design to differ"
347
+ notes: >-
348
+ BLACKOUT PLATES. Broken out as its own series because § 321.166(9) expressly frees it
349
+ from the design and colour of the regular plate, which is a design difference in the
350
+ §2.3 sense even though the Code never says what the design IS. Iowa and North Dakota
351
+ both run statutory blackout plates — a small Midwestern convergence worth recording
352
+ for the encyclopedia — and comparing the two is instructive about sourcing: one state
353
+ wrote the colours into law and the other wrote only a permission.
354
+
355
+ # =========================================================================
356
+ # SPECIALTY — THE PROGRAM INDEX, per PRD-PLATES §2.5. Counted from the statute.
357
+ # =========================================================================
358
+ - id: us-ia-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: recall-only
364
+ format:
365
+ pattern: "LLL99"
366
+ regex: '\A[A-Z0-9](?: ?[A-Z0-9]){1,6}\z'
367
+ charset:
368
+ max_characters_emblem_plates: 5
369
+ max_characters_basis: "Iowa Admin. Code r. 761-401.3(2): 'Plates with a processed emblem, and plates issued under Iowa Code section 321.34(13), are limited to five characters whether personalized or issued as a letter-number designated plate.' A sourced, emblem-conditional ceiling — the frame narrows because the emblem takes plate space."
370
+ min_characters: 2
371
+ pattern_note: "REPRESENTATIVE SHAPE ONLY; the index stands for many programs, and the sourced constraints are the two-character floor and the five-character emblem-plate ceiling rather than any arrangement"
372
+ design:
373
+ consistency_rule: >-
374
+ § 321.166(9): special plates other than the exempt list 'shall be CONSISTENT WITH THE
375
+ DESIGN AND COLOR of regular registration plates but shall provide a space on a
376
+ portion of the plate for the purpose of allowing the placement of a distinguishing
377
+ processed emblem or an organization decal.' So Iowa's default specialty plate is the
378
+ standard plate plus an emblem slot — which is why the emblem-plate character ceiling
379
+ exists and why most Iowa specialty designs are not free-form.
380
+ exempt_from_consistency: ["gold star", "medal of honor", "collegiate", "fire fighter", "natural resources", "blackout", "flying our colors"]
381
+ note: "one design per authorised program; the designs themselves are L4 scope (PRD-PLATES §2.5) and none is described here"
382
+ emblem: { present: true, rendered: placeholder }
383
+ program_index:
384
+ count_statutory: 30
385
+ count_basis: >-
386
+ COUNTED FROM THE STATUTE — the numbered subsections of Iowa Code § 321.34 that
387
+ authorise a plate type: radio operators (3), permanent (4), personalized (5), sample
388
+ (6), collegiate (7), medal of honor (8), ex-prisoner of war (8A), fire fighter (10),
389
+ emergency medical services (10A), natural resources (11), love our kids (11A),
390
+ motorcycle rider education (11B), blackout (11C), flying our colors (11D), persons
391
+ with disabilities (14), legion of merit (15), national guard (16), Pearl Harbor (17),
392
+ purple heart (18), United States armed forces retired (19), silver or bronze star
393
+ (20), distinguished service / navy / air force cross (20A), soldier's / navy and
394
+ marine corps / airman's medal (20B), Iowa heritage (21), education (22), breast
395
+ cancer awareness (23), gold star (24), civil war sesquicentennial (25), fallen peace
396
+ officers (26) and United States veteran (27).
397
+ count_caveat: >-
398
+ SUBSECTIONS ARE NOT DESIGNS, and in Iowa the gap is wide in both directions.
399
+ § 321.34(7) collegiate plates cover every participating institution under one
400
+ subsection, and § 321.34(13) is an open-ended NONPROFIT ORGANIZATION DECAL program
401
+ under which any qualifying organization may have a decal approved — so the number of
402
+ DESIGNS offered is materially greater than 30 and was not obtained. Conversely the
403
+ count includes subsections that are not really specialty designs at all (permanent
404
+ plates, sample plates). No Iowa DOT figure exists to reconcile against, because the
405
+ Iowa DOT site returned HTTP 403 on every request in this pass. Recorded, not
406
+ averaged (PRD-PLATES §5.3).
407
+ organization_decal_program: >-
408
+ § 321.34(13) with Iowa Admin. Code r. 761-401.4: a nonprofit organization meeting the
409
+ § 321.34(13)'a'/'b' criteria applies on Form 411346 for approval of a decal DESIGN,
410
+ and the department must notify approval or denial within 60 days; the department may
411
+ revoke an approved decal on finding a false statement, with notice. This is the
412
+ mechanism by which the Iowa catalogue grows without further legislation, and it is
413
+ the reason the design count is unbounded from the statute alone.
414
+ personalized_rules: >-
415
+ Iowa Admin. Code r. 761-401.5: personalized plates under § 321.34(5) are orderable
416
+ online; an application is rejected if the requested combination is already issued or
417
+ reserved for any other plate series; the department must not issue a combination it
418
+ determines falls into the rule's prohibited categories (the specific categories were
419
+ not extracted — gap); personalized plates are unavailable for the plate types listed
420
+ in 401.2(2)'a' onward.
421
+ fee_relief_on_redesign: "§ 321.166(10): if the department reissues a new design for a special plate, existing holders 'shall not be required to pay the issuance fee' — a rare statutory protection against redesign churn costs"
422
+ official_list_url: "https://www.legis.iowa.gov/docs/code/321.34.pdf"
423
+ iowa_dot_status: "the Iowa DOT plate pages (iowadot.gov) returned HTTP 403 on every request in this pass, via WebFetch and curl alike; recorded so a later run does not mistake it for unfetched-but-fine"
424
+ region_encoding: "county name legend, EXCEPT that § 321.166(2) exempts collegiate, fire fighter and medal of honor plates, and Pearl Harbor and purple heart plates issued before 1 January 1997 — so on those types the county is genuinely absent"
425
+ sources:
426
+ - "https://www.legis.iowa.gov/docs/code/321.34.pdf # Iowa Code § 321.34: the thirty numbered plate-authorising subsections counted above, including (11C) blackout and (13) the nonprofit organization decal program; (3) radio operator call-letter plates; (5) personalized plates"
427
+ - "https://www.legis.iowa.gov/docs/code/321.166.pdf # Iowa Code § 321.166(9): the design-and-colour consistency rule, the emblem/decal space requirement and the seven-type exemption list; (10) no issuance fee on a special-plate redesign; (2) the county-name exemptions for collegiate, fire fighter and medal of honor plates"
428
+ - "https://www.legis.iowa.gov/docs/iac/chapter/761.401.pdf # Iowa Admin. Code 761 ch. 401: r. 401.3 the two-character floor and five-character emblem-plate ceiling; r. 401.4 the nonprofit decal approval process, Form 411346, the 60-day decision and revocation; r. 401.5 personalized plate ordering, rejection and prohibition rules"
429
+ notes: >-
430
+ THE SPECIALTY PROGRAM INDEX — one entry standing for the whole program, per
431
+ PRD-PLATES §2.5, with no individual designs. Iowa counts cleanly from the statute the
432
+ way North Dakota does, and carries the same honest caveat in sharper form: the
433
+ open-ended § 321.34(13) decal program means the DESIGN count is unbounded from the
434
+ Code alone, while several counted subsections are not designs at all. The genuinely
435
+ novel Iowa facts for this dataset are structural rather than numeric — the default
436
+ specialty plate is the STANDARD plate plus an emblem slot (§ 321.166(9)), the emblem
437
+ slot COSTS characters (five-character ceiling, r. 761-401.3(2)), and a redesign cannot
438
+ be charged to existing holders (§ 321.166(10)).