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,430 @@
1
+ # plates/us-az.yml — Arizona (PRD-PLATES gate L2, mountain group).
2
+ #
3
+ # ARIZONA IS THE NAMED ADVERSE STATE, and this pass pins the evidence rather
4
+ # than repeating the assertion. The US research dossier recorded Arizona as
5
+ # "the most adverse posture found" but traced it only to a Wikipedia summary.
6
+ # The underlying instrument is the Arizona Secretary of State's own library
7
+ # policy, and its words are quoted verbatim in `artwork_risk` below, with the
8
+ # statutory hook (A.R.S. § 39-121.03) it points to. Read that section before
9
+ # rendering anything Arizonan.
10
+ #
11
+ # THE OTHER ARIZONA SURPRISE is structural: Arizona's statute delegates almost
12
+ # everything. § 28-2351 gives the director colour and design; § 28-2406 gives
13
+ # the department the number of positions on a personalized plate. There is NO
14
+ # statutory character cap of the Florida (seven) or Colorado (six) kind. What
15
+ # the 2022 amendment to § 28-2351 DOES prescribe is oddly specific and worth
16
+ # the whole file: the STATE NAME's typeface class and height, in law.
17
+ #
18
+ # WHY THE FORMAT SECTION READS AS IT DOES: since February 2021 Arizona's
19
+ # standard serial is SIX ALPHANUMERIC POSITIONS OF WHICH ONLY THE FOURTH IS
20
+ # GUARANTEED A DIGIT. The human-pattern DSL (9=digit, L=letter) has no
21
+ # alphanumeric token, so `pattern` shows one representative arrangement and the
22
+ # REGEX carries the real grammar. That divergence is stated in `pattern_note`
23
+ # rather than papered over — Arizona is the schema stressor for a mixed
24
+ # alphanumeric position, exactly as Japan is for composed fields.
25
+ #
26
+ # WHAT IS NOT HERE (PRD-PLATES §2.5): individual special-plate DESIGNS.
27
+ jurisdiction: us-az
28
+ authority:
29
+ name: Arizona Department of Transportation, Motor Vehicle Division (ADOT MVD)
30
+ url: "https://azdot.gov/motor-vehicles/vehicle-services/license-plates"
31
+ binding: owner
32
+ binding_note: >-
33
+ ARIZONA IS A PLATE-FOLLOWS-THE-OWNER STATE, which makes it the North American
34
+ cousin of Switzerland and the reason `binding:` exists as a field. ADOT's own
35
+ guidance is that the plate belongs to the vehicle owner and may be transferred
36
+ from one vehicle to another; § 28-2356 is titled "Transfer of license plates
37
+ to another vehicle; credit" and governs the transfer and the credit for
38
+ unexpired fees. A vehicle-keyed consumer that assumes an Arizona plate
39
+ identifies a VEHICLE across time will be wrong. (The ADOT page stating the
40
+ ownership rule could not be fetched in this pass — azdot.gov is behind a
41
+ Cloudflare challenge that returns 403 to every automated client tried — so the
42
+ claim rests on § 28-2356's existence plus a locator; recorded honestly.)
43
+ statute_edition: >-
44
+ Arizona Revised Statutes as served by the Arizona State Legislature at
45
+ azleg.gov, read in this pass. Title 28, Chapter 7, Article 11 (License Plates
46
+ Generally, §§ 28-2351 to 28-2356) and Article 12 (Special Plates, § 28-2401
47
+ onward).
48
+
49
+ # ---------------------------------------------------------------------------
50
+ # artwork_risk — required per jurisdiction by PRD-PLATES §4. THE FLAGGED ONE.
51
+ # ---------------------------------------------------------------------------
52
+ artwork_risk:
53
+ posture: copyright-expressly-asserted
54
+ basis: >-
55
+ Arizona expressly asserts copyright over state government works. The
56
+ assertion is made by the Arizona State Library, Archives and Public Records
57
+ — a division of the Arizona Secretary of State — in its published Website
58
+ Policies, under the heading "Copyright Policy", verbatim: "Arizona state
59
+ government works: Unlike federal works, state works are not in the public
60
+ domain and are protected by copyright. However, public records laws may
61
+ allow reproduction in some instances. Any user intending to obtain any
62
+ public records information on this website for a commercial purpose is
63
+ required under Arizona law to pay a commercial fee as established by the
64
+ Secretary of State's office. You must follow the procedures described in
65
+ A.R.S. § 39-121.03 in order to obtain permission to use public records for a
66
+ commercial purpose." The same page states the contrast case in its own
67
+ words — "Federal government works: Information in federal publications are
68
+ not protected by copyright (17 USC 105)" — so the state is drawing the
69
+ distinction deliberately, not by oversight.
70
+ fetch_note: >-
71
+ THE LIVE URL COULD NOT BE FETCHED. azlibrary.gov, azdot.gov and az.gov all
72
+ sit behind a Cloudflare interstitial that returns HTTP 403 to every
73
+ automated client attempted in this pass. The quotation above was read from
74
+ the Internet Archive capture of 15 September 2023, which is cited alongside
75
+ the live URL below. This is recorded because a claim this consequential
76
+ should carry its retrieval conditions, and because a future pass should
77
+ re-verify the live text before anything is rendered.
78
+ what_this_does_and_does_not_reach: >-
79
+ It does NOT reach the statutes. Edicts of government are uncopyrightable at
80
+ every level (PRD-PLATES §4), so §§ 28-2351, 28-2354, 28-2356 and 28-2406 —
81
+ every legal claim in this file — are public domain regardless of Arizona's
82
+ posture, and the ADOT-sourced facts are facts. What the posture reaches is
83
+ the DESIGN: the Four Peaks silhouette, the sunset gradient, the saguaro. In
84
+ Arizona those are the highest-risk act in the whole programme.
85
+ emblem_rule: >-
86
+ STRICTEST PATH, no exceptions. Render `graphic: {present: true, rendered:
87
+ placeholder}` for the desert scene and the saguaro; do not trace, do not
88
+ trace from a photograph, do not approximate the Four Peaks silhouette
89
+ closely enough to be substitutable, and do not embed any Arizona typeface
90
+ binary. Arizona state seal statutes are UNRESEARCHED — the standing gap
91
+ from the US dossier §4.5 — and the seal regime is independent of copyright,
92
+ so it would survive even a favourable copyright answer.
93
+ photograph_caution: >-
94
+ The Commons finding cuts the same way here as everywhere: a CC BY-SA tag on
95
+ an Arizona plate photograph is the PHOTOGRAPHER's licence on the PHOTOGRAPH,
96
+ and the uploader had no standing over the design. In Arizona that cuts
97
+ BOTH ways and the second direction matters more than usual — a permissive
98
+ tag on a photo is no permission at all against a state that has asserted
99
+ copyright in terms. Because our renders are generated from the statute and
100
+ never derived from a photograph, neither the photographer's obligations nor
101
+ the photograph itself is ever in the chain.
102
+ sources:
103
+ - "https://azlibrary.gov/website-policies # Arizona State Library, Archives and Public Records (Office of the Arizona Secretary of State), Copyright Policy: 'Arizona state government works: Unlike federal works, state works are not in the public domain and are protected by copyright.' LIVE URL 403s to automated clients; read via https://web.archive.org/web/20230915005643/https://azlibrary.gov/website-policies"
104
+ - "https://www.azleg.gov/ars/39/00121-03.htm # A.R.S. § 39-121.03, the commercial-purpose public-records procedure the copyright policy routes commercial users through. NOT FETCHED in this pass (azleg.gov returned a socket hang-up on this section twice); pinned as the target to read, and no content is attributed to it here."
105
+ - "https://en.wikipedia.org/wiki/Copyright_status_of_works_by_subnational_governments_of_the_United_States # LOCATOR ONLY (PRD-PLATES §4) — where the azlibrary.gov pointer was found. The policy itself is what is quoted."
106
+
107
+ # ---------------------------------------------------------------------------
108
+ # The US standards chain.
109
+ # ---------------------------------------------------------------------------
110
+ us_standards:
111
+ no_federal_mandate: true
112
+ chain: "SAE J686 -> AAMVA License Plate Standard Edition 3 (September 2025) -> voluntary state adoption."
113
+ aamva_edition_3:
114
+ dimensions_delegated: "AAMVA §3.1 sends dimensions and bolt holes to SAE J686, whose text is PAYWALLED and UNPINNED. No J686 dimension is quoted."
115
+ 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."
116
+ jurisdiction_name_layout: >-
117
+ AAMVA §2.1 recommends the jurisdiction name in the top centre between the
118
+ bolt holes, at least 0.25 in above the plate number and 0.125 in from the
119
+ top edge, with jurisdiction characters 0.75-1.0 in. ARIZONA IS THE ONE
120
+ STATE IN THIS GROUP THAT LEGISLATED ITS OWN VERSION OF THIS RULE, and it
121
+ lands INSIDE the AAMVA band: § 28-2351, post-24 September 2022, requires
122
+ the state name in capitals, in a SANS SERIF font, three-fourths of an inch
123
+ high. That is 0.75 in — the bottom of AAMVA's recommended range, in
124
+ Arizona law. A rare, checkable instance of voluntary adoption showing up
125
+ in statute.
126
+ stacked_characters: "AAMVA: stacked characters are part of the official plate number and no more than two may be stacked. Arizona's statute is silent; the normalisation decision belongs in the parse layer."
127
+ replacement_cycle: "AAMVA §1.1 recommends a cycle not to exceed 7 to 10 years. Arizona legislates none (recorded gap)."
128
+ source: "https://www.aamva.org/getmedia/646bcc8a-219b-47d8-b5cd-726240473163/License-Plate-Standard-Edition-3_September-2025-Update.pdf"
129
+ folklore_caution: >-
130
+ The "1956 AMA standardization agreement" is COMMONLY REPEATED, UNSOURCED
131
+ (US dossier headline finding 2). The Arizona article does not even offer the
132
+ ALPCA-magazine footnote the Utah, Nevada, Colorado and New Mexico articles
133
+ carry. Arizona's plate size is not in Title 28 at all — § 28-2351 states a
134
+ legibility distance, not a dimension (recorded gap).
135
+
136
+ display_rules:
137
+ default: >-
138
+ ONE plate, rear. § 28-2351: "The department shall provide to every owner one
139
+ license plate for each vehicle registered", with an additional plate
140
+ obtainable on request and payment of a fee. Rear-only has been the Arizona
141
+ rule since 1989 (locator-grade for the year).
142
+ wheelchair_carrier_rule: >-
143
+ § 28-2354(A)(3) carries a genuinely unusual attachment rule: for a vehicle
144
+ issued two special plates under § 28-2409, "one plate on the rear of the
145
+ vehicle and one plate on the operator's wheelchair carrier or wheelchair
146
+ lift when it is attached to the vehicle". A plate mounted on a removable
147
+ accessory rather than on the vehicle — the display model has to allow it.
148
+ legibility: "§ 28-2351: letters and numerals 'of sufficient size to be plainly readable during daylight from a distance of one hundred feet'"
149
+ contrast_and_state_name: >-
150
+ § 28-2351, as amended effective 24 September 2022: the background colour
151
+ must contrast significantly with the letters, numerals and state name, and
152
+ "The name of this state shall appear on the license plate in capital letters
153
+ in sans serif font and be three-fourths of an inch in height." This is the
154
+ most typographically prescriptive plate provision found in this group of
155
+ five states, and it prescribes a FONT CLASS rather than a font — consistent
156
+ with PRD-PLATES §6's finding that no surveyed jurisdiction mandates a
157
+ licensable typeface.
158
+ reflectivity: "§ 28-2351: 'The director shall coat the license plate with a reflective material that is consistent with the determination of the department regarding the color and design.'"
159
+ sources:
160
+ - "https://www.azleg.gov/ars/28/02351.htm # § 28-2351 License plate provided; design: one plate per vehicle, additional plate on request, director determines colour and design, reflective coating, 100-foot daylight legibility, and the post-2022 contrast rule and sans-serif three-quarter-inch state name"
161
+ - "https://www.azleg.gov/ars/28/02354.htm # § 28-2354 License plates; attachment; civil penalty — including the wheelchair-carrier placement in (A)(3)"
162
+ - "https://www.azleg.gov/ars/28/02356.htm # § 28-2356 Transfer of license plates to another vehicle; credit — the plate-follows-the-owner mechanism"
163
+
164
+ series:
165
+
166
+ # =========================================================================
167
+ # CURRENT STANDARD ISSUE — the "alphabet soup" generation.
168
+ # =========================================================================
169
+ - id: us-az-standard-2021
170
+ class: standard
171
+ categories: [car, van, truck, bus]
172
+ period: { start: 2021 }
173
+ period_evidence: corroboration-only
174
+ matching: strict
175
+ format:
176
+ pattern: "LLL 9LL"
177
+ regex: '\A[A-Z0-9]{3} ?\d[A-Z0-9]{2}\z'
178
+ charset:
179
+ notes: >-
180
+ NO STATUTORY CONSTRAINT EXISTS. § 28-2351 gives the director colour
181
+ and design and says nothing about serial length or alphabet;
182
+ § 28-2406 hands the department "the number of positions allowed" on a
183
+ personalized plate. Arizona is therefore the pure delegated case in
184
+ this group — contrast Florida's seven-character statutory cap and
185
+ Colorado's six. The grammar recorded here comes from ADOT's own
186
+ announcement of the 2020 change plus contemporaneous reporting, read
187
+ through a Wikipedia locator: six positions, every one of which may be
188
+ a letter OR a digit, EXCEPT the fourth, which is always a digit; each
189
+ position runs A-Z then 0-9.
190
+ pattern_note: >-
191
+ READ THIS BEFORE USING `pattern`. The human-pattern DSL has exactly two
192
+ tokens, 9 (digit) and L (letter), and Arizona's current serial has
193
+ FIVE POSITIONS THAT ARE NEITHER — they are alphanumeric. `pattern`
194
+ therefore shows ONE REPRESENTATIVE ARRANGEMENT ("ABC 1DE", which is the
195
+ arrangement the locator record itself uses as the exemplar) and the
196
+ REGEX carries the actual grammar. The round-trip still holds, because
197
+ every serial the pattern generates is inside the regex; what does not
198
+ hold is the usual reading that `pattern` describes the alphabet.
199
+ Arizona is the schema stressor for a mixed alphanumeric position and it
200
+ should be cited when `format.fields:` is next discussed.
201
+ progression: >-
202
+ NOT LEXICOGRAPHIC. ADOT introduced a new plate-coding system in June
203
+ 2020 replacing one dating from the mid-1980s; the resulting serials were
204
+ reported as "random" but in fact increment in a non-standard order
205
+ (locator records the 2021-onward order as CEA 1DB — that is, positions
206
+ advance in a fixed but non-left-to-right sequence). Consequence for the
207
+ parse API: an Arizona serial's alphabetical position tells you almost
208
+ nothing about its issue date, and any era inference built on ordinary
209
+ odometer logic will be wrong.
210
+ design:
211
+ plate: { w: 12, h: 6, unit: in, w_mm: 304.8, h_mm: 152.4 }
212
+ plate_dimension_note: "NOT IN TITLE 28. Arizona states a legibility distance, not a dimension. The 12x6 figure is the North American convention from the AAMVA/SAE chain and is not attributed to any Arizona instrument (recorded gap)."
213
+ background: { finish: retroreflective }
214
+ material: "reflective coating mandated by § 28-2351; the specific material is 'consistent with the determination of the department' and no departmental material spec was obtained (recorded gap)"
215
+ colour_note: >-
216
+ NO HEX IS CLAIMED. § 28-2351 mandates significant CONTRAST between
217
+ background and characters and leaves every hue to the director. The
218
+ design is described by a Wikipedia LOCATOR as a dark green serial on a
219
+ graphic desert scene — turquoise, white and orange gradient sky, a white
220
+ setting sun, purple mountains in the shape of Four Peaks, and cacti —
221
+ with "ARIZONA" screened in turquoise with white outlines at the top and
222
+ "GRAND CANYON STATE" in dark green below the serial. That is recorded as
223
+ a lead. Given the artwork posture above, an approximated render must be
224
+ deliberately unlike it, not faithfully like it.
225
+ legend_top: "ARIZONA"
226
+ legend_bottom: "GRAND CANYON STATE"
227
+ state_name_typography: "capital letters, sans serif font, three-fourths of an inch high (§ 28-2351, post-24 September 2022) — the only statutory typography in this group"
228
+ graphic: { present: true, rendered: placeholder, description: "desert scene with Four Peaks and saguaro; security threads at plate centre since the 2008 flat-printed generation — locator-grade" }
229
+ emblem: { present: false }
230
+ rear_differs: false
231
+ region_encoding: >-
232
+ NONE. Arizona used county coding historically (the Wikipedia article keeps
233
+ a county-coding section) but no modern Arizona serial encodes geography,
234
+ and the current alphanumeric grammar leaves no positional room for it.
235
+ sources:
236
+ - "https://www.azleg.gov/ars/28/02351.htm # § 28-2351: the absence of any statutory serial constraint, the director's design power, the reflective coating, the contrast rule and the sans-serif state-name height"
237
+ - "https://azdot.gov/adot-news/your-eyes-don%E2%80%99t-deceive-you-new-license-plate-numbers-are-different # ADOT's own June 2020 announcement of the new plate-numbering system. NOT FETCHED — azdot.gov 403s to automated clients behind Cloudflare; pinned as the primary to read on a browser-capable pass, and no wording is attributed to it here."
238
+ - "https://en.wikipedia.org/wiki/Vehicle_registration_plates_of_Arizona # LOCATOR ONLY (PRD-PLATES §4): the February 2021 arrangement change, the six-position alphanumeric grammar with a digit fixed in position four, the non-standard progression order, the AAA 0AA start and the design description. None is asserted as sourced."
239
+ notes: >-
240
+ ARIZONA STANDARD ISSUE, CURRENT GENERATION. THE BASE DESIGN IS OLDER THAN
241
+ THE SERIES: the desert scene dates to 1996 (flat-printed from January
242
+ 2008), and 2021 is a SERIAL-GRAMMAR boundary, not a redesign. The id is
243
+ dated because the grammar is what distinguishes the series, and
244
+ `period_evidence: corroboration-only` states plainly that February 2021
245
+ rests on a locator and contemporaneous press, not on an Arizona
246
+ instrument. WHY THIS SERIES IS INTERESTING BEYOND ARIZONA: it is the
247
+ cleanest US example of a state exhausting its serial space and answering
248
+ with an alphabet change rather than a redesign — 999 ZZZ ran out in
249
+ mid-January 2008, ABC1234 ran out by April 2020, and the answer both times
250
+ was more characters or a wider alphabet on the SAME plate.
251
+
252
+ # =========================================================================
253
+ # ONE SERIES BACK.
254
+ # =========================================================================
255
+ - id: us-az-standard-2008
256
+ class: standard
257
+ categories: [car, van, truck, bus]
258
+ period: { start: 2008, end: 2020 }
259
+ period_evidence: corroboration-only
260
+ matching: strict
261
+ format:
262
+ pattern: "LLL9999"
263
+ regex: '\A[A-Z]{3}\d{4}\z'
264
+ charset: { notes: "three letters then four numerals, printed with no separator; no statutory constraint applies, for the same reason as the current series" }
265
+ progression: "sequential from AAA0001 to approximately CWX9999; the CWL0001-CWX9999 block was assigned to rental cars from 2020 (locator-grade)"
266
+ design:
267
+ plate: { w: 12, h: 6, unit: in }
268
+ background: { finish: retroreflective }
269
+ colour_note: "the same 1996 desert-scene base as the current series, with the serial screened rather than embossed and security threads added at the plate centre. No hex claimed."
270
+ legend_top: "ARIZONA"
271
+ legend_bottom: "GRAND CANYON STATE"
272
+ graphic: { present: true, rendered: placeholder }
273
+ region_encoding: none
274
+ sources:
275
+ - "https://www.azleg.gov/ars/28/02351.htm # § 28-2351: the design power under which this arrangement was issued"
276
+ - "https://en.wikipedia.org/wiki/Vehicle_registration_plates_of_Arizona # LOCATOR ONLY: the January 2008 to April 2020 window, the exhaustion of 999 ZZZ in mid-January 2008 reported by The Arizona Republic, and the AAA0001-CWX9999 range"
277
+ notes: >-
278
+ THE PREVIOUS ARRANGEMENT. Recorded partly for its own sake and partly
279
+ because the exhaustion story is documented: contemporaneous reporting
280
+ (The Arizona Republic, 30 April 2008) attributes the seventh character to
281
+ ADOT running out of combinations "when it issued plate 999 ZZZ in
282
+ mid-January". A dated exhaustion event is the most useful kind of era
283
+ evidence a plates dataset can hold, and it is why this series' boundary is
284
+ better attested than most in this group even though it remains
285
+ corroboration-grade.
286
+
287
+ # =========================================================================
288
+ # THE 2020-21 TRANSITIONAL GENERATION — seven positions, recorded because it
289
+ # is short, real, and still on the road.
290
+ # =========================================================================
291
+ - id: us-az-standard-2020-transitional
292
+ class: standard
293
+ categories: [car, van, truck, bus]
294
+ period: { start: 2020, end: 2021 }
295
+ period_evidence: corroboration-only
296
+ matching: recall-only
297
+ format:
298
+ pattern: "LLL9LLL"
299
+ regex: '\A[A-Z0-9]{3}\d[A-Z0-9]{3}\z'
300
+ charset:
301
+ notes: >-
302
+ SEVEN positions, printed without a separator, with the fourth always a
303
+ digit and every other position alphanumeric — the same rule as the
304
+ current six-position grammar, one character longer. The locator record
305
+ says sixty-four arrangements were theoretically available and only
306
+ eight were used; those eight are not individually sourced here, which
307
+ is exactly why this series is `recall-only`: the regex is the union of
308
+ all seven-position strings with a digit in position four, which is
309
+ deliberately wider than the eight arrangements Arizona actually issued.
310
+ design:
311
+ plate: { w: 12, h: 6, unit: in }
312
+ background: { finish: retroreflective }
313
+ colour_note: "the same 1996 desert-scene base; no hex claimed"
314
+ legend_top: "ARIZONA"
315
+ legend_bottom: "GRAND CANYON STATE"
316
+ graphic: { present: true, rendered: placeholder }
317
+ region_encoding: none
318
+ sources:
319
+ - "https://en.wikipedia.org/wiki/Vehicle_registration_plates_of_Arizona # LOCATOR ONLY: the April 2020 to January 2021 window, the AAA0AAA-SXA6DTA range, the sixty-four-available/eight-used arrangement count, and the ADOT coding-system change behind it"
320
+ - "https://www.azleg.gov/ars/28/02351.htm # § 28-2351: the delegated design power that made an arrangement change possible without legislation"
321
+ notes: >-
322
+ A NINE-MONTH SERIES, KEPT ON PURPOSE. It is the smallest series in this
323
+ group and it earns its place three ways: it is the reason the current
324
+ six-position grammar exists at all; it is still lawfully on the road, so a
325
+ parser meeting a seven-character Arizona serial with a digit in position
326
+ four is not looking at an error; and it is the clearest `recall-only` case
327
+ in the mountain group — a regex written as a union because the members of
328
+ the union were not individually sourced. Contrast us-az-standard-2021,
329
+ whose regex IS the grammar and is therefore strict.
330
+
331
+ # =========================================================================
332
+ # PERSONALIZED.
333
+ # =========================================================================
334
+ - id: us-az-personalized
335
+ class: personalized
336
+ categories: [car, van, truck, motorcycle]
337
+ period: { start: 2026 }
338
+ period_evidence: instrument-in-force-upper-bound
339
+ matching: recall-only
340
+ format:
341
+ pattern: "LLLLLLL"
342
+ regex: '\A[A-Z0-9]+\z'
343
+ charset:
344
+ notes: >-
345
+ § 28-2406, verbatim on the only point it addresses: "The department
346
+ shall determine the number of positions allowed on the personalized
347
+ special plates." The statute sets NO cap and NO alphabet. The
348
+ departmental determination was not obtained (azdot.gov is unfetchable
349
+ from here), so the regex MAKES NO WIDTH CLAIM — an unbounded
350
+ quantifier, on the same reasoning as us-fl-horseless-carriage's
351
+ '\A\d+\z'. Recording a guessed maximum would be worse than recording
352
+ none.
353
+ refusal_criteria: >-
354
+ § 28-2406: the department may refuse, suspend, cancel or revoke
355
+ combinations "that carry connotations that are offensive to good taste
356
+ and decency", combinations that are misleading, and duplicates of
357
+ existing plates. The applicant requests; the department decides.
358
+ design:
359
+ plate: { w: 12, h: 6, unit: in }
360
+ background: { finish: retroreflective }
361
+ note: "personalized configurations are offered on the standard base and on special plate designs; which designs accept personalization was not obtained (recorded gap)"
362
+ region_encoding: none
363
+ sources:
364
+ - "https://www.azleg.gov/ars/28/02406.htm # § 28-2406 Personalized special plates: the department determines the number of positions; the good-taste-and-decency, misleading and duplicate refusal grounds; the refuse/suspend/cancel/revoke powers"
365
+ notes: >-
366
+ PERSONALIZED PLATES, and a deliberate demonstration of the
367
+ no-width-claim discipline. Every other state in this group states a
368
+ personalized character range somewhere — Colorado two to seven in statute,
369
+ New Mexico one to eight on the MVD's own page — and Arizona states none at
370
+ any level this pass could reach. The regex says so. PERIOD CAVEAT:
371
+ `start: 2026` is the statute edition read and is an upper bound; Arizona
372
+ has issued personalized plates for decades.
373
+
374
+ # =========================================================================
375
+ # SPECIALTY — THE PROGRAM INDEX, per PRD-PLATES §2.5.
376
+ # =========================================================================
377
+ - id: us-az-special-plate-index
378
+ class: specialty
379
+ categories: [car, van, truck, motorcycle]
380
+ period: { start: 2026 }
381
+ period_evidence: instrument-in-force-upper-bound
382
+ matching: recall-only
383
+ format:
384
+ pattern: "LLL 9LL"
385
+ regex: '\A[A-Z0-9]+(?: [A-Z0-9]+)?\z'
386
+ charset: { notes: "special plates carry ordinary serials on an alternative design; because no statutory cap exists and no departmental determination was obtained, no width claim is made and the regex is an explicit recall bound" }
387
+ design:
388
+ plate: { w: 12, h: 6, unit: in }
389
+ background: { finish: retroreflective }
390
+ note: "one design per authorised programme; the designs themselves are L4 scope (PRD-PLATES §2.5) and none is described here"
391
+ emblem: { present: true, rendered: placeholder }
392
+ program_index:
393
+ count: unresearched
394
+ count_note: >-
395
+ NO COUNT IS ASSERTED. Arizona's specialty catalogue lives on azdot.gov,
396
+ which returned HTTP 403 behind a Cloudflare challenge to every automated
397
+ client attempted, and has no Internet Archive capture under the paths
398
+ tried. Rather than launder a figure out of a collector site or an
399
+ encyclopedia, the count is recorded as UNRESEARCHED with the official
400
+ URLs pinned for a browser-capable pass. This is the same discipline that
401
+ made Florida's contested "over 100 vs over 120" worth recording: an
402
+ honest absence beats a sourced-looking number.
403
+ official_list_url: "https://azdot.gov/motor-vehicles/vehicle-services/license-plates"
404
+ statutory_frame: >-
405
+ Arizona authorises special plates BY STATUTE, in Title 28, Chapter 7,
406
+ Article 12 (§ 28-2401 onward), which is why the catalogue can eventually
407
+ be enumerated from the code rather than from a web page. § 28-2401
408
+ supplies the article's definitions — "special plates" means "plates
409
+ issued pursuant to this article", and "immediate family member" means "a
410
+ spouse or a parent, child, brother or sister whether by adoption or
411
+ blood", the latter mattering because several Arizona special plates pass
412
+ to family. § 28-2402 governs special plate fees; § 28-2403 governs
413
+ transfers and makes a violation a criminal classification; § 28-2406 is
414
+ the personalized-plate section modelled separately above.
415
+ fees_note: "§ 28-2402 (Special plate fees) and § 28-2353 (Special license plate replacement fee) were identified but their figures were not extracted in this pass (recorded gap)."
416
+ region_encoding: none
417
+ sources:
418
+ - "https://www.azleg.gov/arsDetail/?title=28 # the Title 28 section index from which Article 11 (28-2351 to 28-2356) and Article 12 (28-2401 onward) were read"
419
+ - "https://www.azleg.gov/ars/28/02401.htm # § 28-2401 Definitions: 'special plates' means plates issued pursuant to this article; the immediate-family-member definition"
420
+ - "https://azdot.gov/motor-vehicles/vehicle-services/license-plates # ADOT MVD's own plate index — PINNED BUT NOT FETCHED (403, Cloudflare). No claim in this entry rests on it."
421
+ notes: >-
422
+ THE SPECIAL-PLATE PROGRAM INDEX — one entry for the whole programme, per
423
+ PRD-PLATES §2.5. IT IS DELIBERATELY THIN, and the thinness is the finding:
424
+ Arizona is the only state in the mountain group whose issuing agency could
425
+ not be reached at all. Everything in this file that is stated as fact came
426
+ from azleg.gov (the legislature) or from an archived Secretary of State
427
+ policy page; everything ADOT would have supplied — the specialty count,
428
+ the personalized character limit, the departmental colour and material
429
+ specifications, the plate-belongs-to-the-owner statement — is recorded as
430
+ a gap with its URL pinned. A future pass with a browser should start here.