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,457 @@
1
+ # plates/us-al.yml — Alabama (PRD-PLATES gate L2, group southeast-b).
2
+ #
3
+ # WHAT MAKES ALABAMA WORTH READING FIRST IN THIS GROUP: it is the only state in
4
+ # the group whose issuing agency publishes an actual DESIGN SPECIFICATION —
5
+ # "State of Alabama License Plate Design Specifications", 4 pp, dated April 8,
6
+ # 2021, served from revenue.alabama.gov. That document is the single richest
7
+ # per-state renderable-geometry source found in this pass: plate sizes for
8
+ # passenger AND motorcycle, the safe design rectangle, the header typeface and
9
+ # point size, minimum character height, the SEVEN-character cap on standard
10
+ # plates and the SIX-character cap on distinctive plates, the mandated black
11
+ # character colour, and a statutory legend ("Heart of Dixie") that every plate
12
+ # must carry. Almost none of that is inferable from a photograph, and no
13
+ # competitor dataset has any of it.
14
+ #
15
+ # SOURCING RULE APPLIED HERE, AND ITS LIMIT: PRD-PLATES §4 prefers the statute
16
+ # over the brochure. Alabama's Code (Title 32, Chapter 6) is served only through
17
+ # ALISON, a JavaScript application that returns no extractable text, and every
18
+ # third-party mirror tried (Justia, FindLaw, Casetext, LawServer) answers 403 or
19
+ # 410 to a plain fetch. So the top of the source hierarchy in this file is the
20
+ # DEPARTMENT's own published specification and its own plate catalogue — both
21
+ # primary agency documents — with the Alabama Department of Archives and History
22
+ # supplying the county-code table. The statutory layer is a RECORDED GAP, named
23
+ # in each series' notes rather than papered over.
24
+ #
25
+ # REGEX FORM (PRD-PLATES §2.6): every regex here is written in PRINTED form. The
26
+ # optional space before the weight-class letter is spelled ` ?` because Alabama
27
+ # prints the county code as a visually separate group on most plates and the
28
+ # department's spec is silent on grouping; the cap, not the gap, is the claim.
29
+ jurisdiction: us-al
30
+ authority:
31
+ name: Alabama Department of Revenue, Motor Vehicle Division (ALDOR MVD)
32
+ url: "https://www.revenue.alabama.gov/division/motor-vehicle/"
33
+ binding: vehicle
34
+ statute_edition: >-
35
+ NOT OBTAINED. The Code of Alabama is published through ALISON
36
+ (alison.legislature.state.al.us), which serves a JavaScript shell with no
37
+ extractable statutory text, and every mirror attempted returned 403/410. The
38
+ Alabama Administrative Code host (admincode.legislature.state.al.us) is the
39
+ same shape. Every legal claim in this file is therefore sourced to a
40
+ DEPARTMENTAL instrument, and the statutory chapter is a named gap.
41
+
42
+ # ---------------------------------------------------------------------------
43
+ # artwork_risk — required per jurisdiction by PRD-PLATES §4.
44
+ # ---------------------------------------------------------------------------
45
+ artwork_risk:
46
+ posture: unresearched
47
+ basis: >-
48
+ NO DETERMINATION EITHER WAY WAS FOUND, and this is recorded as unresearched
49
+ rather than guessed. Alabama does not appear in the per-state posture table
50
+ of the pinned US/world dossier (which covers FL, CA, NC, NJ, MA, GA as
51
+ favourable and NY, AZ, WA, PA as adverse), and no Commons {{PD-ALGov}} tag
52
+ was located. Under the dossier's core rule — 17 U.S.C. §105 does not reach
53
+ the states, so the DEFAULT for a US state plate design is copyrighted unless
54
+ that state says otherwise — Alabama must be treated as default-copyrighted
55
+ until researched. The one adjacent data point actually fetched cuts the
56
+ other way from a clearance: ALDOR's own design specification instructs
57
+ sponsors that "If the logo or design includes copyright protected elements,
58
+ written permission to have the design appear on an Alabama license plate
59
+ must be provided to the Department" — evidence that the department actively
60
+ polices THIRD-PARTY copyright in plate artwork, and no evidence at all about
61
+ the state's posture toward its own.
62
+ edict_carve_out: >-
63
+ Independent of the above: the design specification is an agency instrument,
64
+ and Alabama's plate FACTS (sizes, character caps, colours-as-values, legends)
65
+ are facts, which are uncopyrightable at every level. Nothing in this file
66
+ reproduces artwork.
67
+ emblem_rule: >-
68
+ PRD-PLATES §3 placeholder default applies without exception here, and applies
69
+ harder than it does in Florida because the posture is unknown rather than
70
+ favourable. The sunrise-beach graphic and the HEART OF DIXIE heart device
71
+ render as `emblem: {present: true, rendered: placeholder}`. State-seal misuse
72
+ statutes are a separate regime from copyright and are unresearched for
73
+ Alabama.
74
+ sources:
75
+ - "https://www.revenue.alabama.gov/wp-content/uploads/2022/02/License-Plate-Design-Specifications-040821.pdf # ALDOR requires sponsors to furnish written permission for copyright-protected elements — the department's own copyright-awareness, and the only Alabama IP evidence obtained"
76
+ - "https://en.wikipedia.org/wiki/Copyright_status_of_works_by_subnational_governments_of_the_United_States # LOCATOR ONLY, via the pinned dossier: the source that establishes the default-copyrighted rule for states and lists the exceptions — Alabama is not among them"
77
+
78
+ # ---------------------------------------------------------------------------
79
+ # The US standards chain, plus the Alabama-specific wrinkle that makes this
80
+ # state's record unusual: Alabama delegates reflectivity to a DIFFERENT SAE
81
+ # standard than AAMVA delegates dimensions to.
82
+ # ---------------------------------------------------------------------------
83
+ us_standards:
84
+ no_federal_mandate: true
85
+ chain: "SAE J686 -> AAMVA License Plate Standard Edition 3 (September 2025) -> voluntary state adoption. AAMVA writes recommendations in the declarative present and has no enforcement power."
86
+ aamva_edition_3:
87
+ dimensions_delegated: "AAMVA §3.1 sends plate dimensions and bolt holes to SAE J686. J686's own text is PAYWALLED and was NOT obtained; nothing in this file quotes it. Alabama's own 6x12 in figure comes from ALDOR's specification, not from J686."
88
+ 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."
89
+ jurisdiction_name_layout: "AAMVA §2.1: jurisdiction name in the top centre between the bolt holes, jurisdiction characters 0.75-1.0 in."
90
+ stacked_characters: "AAMVA: stacked characters are part of the official plate number; no more than two may be stacked. Relevant to Alabama's non-passenger types, which stack a weight code beneath the class letter."
91
+ replacement_cycle: "AAMVA §1.1 recommends a rolling or full replacement cycle not to exceed 7 to 10 years. NO Alabama replacement cycle was obtained (recorded gap) — contrast Florida, which legislated 10 years."
92
+ source: "https://www.aamva.org/getmedia/646bcc8a-219b-47d8-b5cd-726240473163/License-Plate-Standard-Edition-3_September-2025-Update.pdf"
93
+ alabama_divergence: >-
94
+ A GENUINELY INTERESTING FINDING, and the reason this block is not boilerplate.
95
+ ALDOR's specification does NOT route reflectivity through AAMVA. It states, in
96
+ the department's own words, that plates "shall be manufactured in such a manner
97
+ as to meet the minimum federal performance standards as set out in Table I of
98
+ the Society of Automotive Engineers Standard J594e, 'Reflex Reflectors,' of
99
+ Federal Standard 108." So the US standards chain is not one chain: AAMVA points
100
+ at SAE J686 for GEOMETRY, and Alabama points at SAE J594e via FMVSS 108 for
101
+ REFLECTIVITY. Recorded because the sentence above is ALABAMA's text — quoting
102
+ the state's own delegation is not quoting SAE, and no SAE text appears anywhere
103
+ in this dataset (the standing rule).
104
+ digital_manufacture: >-
105
+ "The State of Alabama began utilizing digital license plate manufacturing
106
+ technology in September 2006." A dated, agency-sourced manufacturing boundary,
107
+ which is why Alabama plates since 2006 carry SCREENED rather than embossed
108
+ serials and why full-colour graphic bases are possible at all.
109
+ folklore_caution: >-
110
+ The "1956 AMA/AAMVA/NSC standardization agreement" that supposedly fixed the
111
+ 6x12 inch plate is repeated in the lead of every state article read for this
112
+ group. THE STATUS OF THAT CLAIM HAS CHANGED SINCE THE PINNED DOSSIER and the
113
+ change is worth recording precisely: the dossier found it flagged `citation
114
+ needed` since 2017; the articles now attach a single citation — Garrish,
115
+ Christopher, "Reconsidering the Standard Plate Size", *Plates* (Automobile
116
+ License Plate Collectors Association), vol. 62 no. 5, October 2016. That is a
117
+ hobbyist membership magazine, it was not obtainable, and its title on its face
118
+ suggests it REVISES rather than confirms the received account. Status
119
+ downgraded from "uncited" to "cited to an unobtainable enthusiast periodical
120
+ whose title implies it disputes the claim" — still not a sourced fact, and
121
+ Alabama's 6x12 in figure is instead cited to ALDOR's own specification.
122
+ sources:
123
+ - "https://www.revenue.alabama.gov/wp-content/uploads/2022/02/License-Plate-Design-Specifications-040821.pdf # the J594e/FMVSS 108 reflectivity delegation, the September 2006 digital-manufacture date, and the 6x12 in / 4x7 in sizes"
124
+
125
+ display_rules:
126
+ status: NOT OBTAINED
127
+ note: >-
128
+ Alabama's plate-display statute was not obtained, for the ALISON reason given
129
+ at the head of this file. The Wikipedia US aggregate places Alabama among the
130
+ rear-only states, but that table is a LOCATOR and its own references are
131
+ per-state statutes; none was fetched for Alabama. No display claim is made
132
+ here. This is the single largest gap in the Alabama record and is the first
133
+ thing a verifier with statute access should close.
134
+
135
+ series:
136
+
137
+ # =========================================================================
138
+ # THE CURRENT STANDARD-ISSUE BASE.
139
+ # =========================================================================
140
+ - id: us-al-standard-2022
141
+ class: standard
142
+ categories: [car, van, truck, bus, motorcycle, motorhome]
143
+ period: { start: 2022 }
144
+ period_evidence: locator-dated-agency-corroborated
145
+ matching: strict
146
+ format:
147
+ pattern: "9L9999L"
148
+ regex: '\A(?:\d ?[A-Z][A-Z0-9]{5}|\d{2} ?[A-Z][A-Z0-9]{4})\z'
149
+ regex_statutory: '\A[A-Z0-9](?: ?[A-Z0-9]){0,6}\z'
150
+ charset:
151
+ notes: >-
152
+ THE SOURCED CONSTRAINT IS A LENGTH CAP, NOT AN ALPHABET. ALDOR's design
153
+ specification, verbatim: "A maximum of seven (7) alphanumeric characters
154
+ may be displayed on standard license plates. A maximum of six (6)
155
+ alphanumeric spaces may be displayed on distinctive license plates."
156
+ That seven-character cap is what `regex_statutory` encodes. NO letter
157
+ exclusion is stated anywhere in the specification.
158
+ excluded_reported: ["I", "O", "Q"]
159
+ excluded_evidence: >-
160
+ REPORTED, NOT SOURCED. The I/O/Q exclusion is a Wikipedia LOCATOR claim
161
+ and no departmental instrument confirming it was found, so it is NOT
162
+ encoded as a `regex_strict`. Recorded here so a future pass can close it
163
+ with one citation rather than rediscover it. (Contrast Kentucky in this
164
+ same group, where the exclusion IS agency-stated and therefore IS encoded.)
165
+ progression: >-
166
+ Reported by the same locator: "The last 4-5 characters can be numbers or
167
+ letters. Each progresses 0 to 9, then A to Y, from right to left." An
168
+ odometer-style mixed-radix progression rather than a letter-block scheme —
169
+ which, if true, is why Alabama shows eight different-looking arrangements
170
+ inside ONE series rather than eight series. Not asserted as sourced.
171
+ pattern_note: >-
172
+ `regex` encodes the SOURCED SHAPE: a county code of one or two digits
173
+ (Alabama Department of Archives and History), followed by a class letter,
174
+ padded to exactly seven alphanumeric characters (ALDOR specification). It
175
+ is deliberately wider than the eight arrangements a locator reports
176
+ (1A2345B, 1A23BCD, 1A23B4C, 10A123B, 10A12B3, 10A1B23, 10A1BC2, 10A2BCD,
177
+ 10ABCDE) because that list is not agency-sourced, and deliberately
178
+ narrower than the seven-character cap in `regex_statutory` because the
179
+ county prefix IS agency-sourced. `matching: strict` under the PRD-PLATES
180
+ §2.7 test: this is a real well-formedness claim for an Alabama passenger
181
+ plate, not a shape hit.
182
+ design:
183
+ plate: { w: 12, h: 6, unit: in, w_mm: 304.8, h_mm: 152.4 }
184
+ plate_variants:
185
+ - { for: motorcycle, w: 7, h: 4, unit: in, source_note: "ALDOR spec: 'Motorcycle license plates are 4\" X 7\"'. Recorded as a size variant rather than a series because ALDOR's own catalogue places motorcycles INSIDE the Standard Passenger category; no separate motorcycle serial grammar was obtained (recorded gap)." }
186
+ design_rectangle: { w: 11.44, h: 5.44, unit: in, note: "ALDOR spec: 'Designs for use in the United States must fit into a 5.44 X 11.44\" rectangle, with radius corners sized to match the debossing rim in the blanking press. The resulting .28\" margin is needed to ensure acceptable finished license plates.' This is a RENDERABLE constraint and no competitor carries it." }
187
+ bolt_holes: { diameter: 0.3125, unit: in, source_note: "ALDOR spec, stated in the context of bottom-legend placement" }
188
+ serial_area: { w: 8.75, h: 2.875, unit: in, note: "ALDOR spec: the serial area 'should be free of graphics'" }
189
+ character_min_height: { value: 2.75, unit: in, note: "ALDOR spec: 'no smaller than two and three-fourths inches in height' — TIGHTER than AAMVA §2.2's 2.5 in recommendation. Alabama exceeds the voluntary standard." }
190
+ character_spacing: "at least equal to the stroke width (ALDOR spec)"
191
+ foreground: "#000000"
192
+ foreground_basis: >-
193
+ SOURCED, and unusually so. ALDOR spec: "All license plate numbers will be
194
+ printed in black to ensure a minimum contrast ratio of 4-to-1 between
195
+ different background colors and the alphanumeric characters to ensure that
196
+ the background is four (4) times brighter than the alphanumeric characters."
197
+ A stated hue AND a stated photometric ratio — this is the best-sourced
198
+ foreground colour anywhere in the dataset so far, better even than Florida,
199
+ whose statute names no colour at all.
200
+ background: { finish: retroreflective, hex_basis: unsourced }
201
+ background_note: >-
202
+ NO HEX IS RECORDED. The current base is a full-colour sunrise-beach graphic,
203
+ so no single background value is meaningful, and ALDOR's "White is the
204
+ optimum background color ... and is required for quantity class 1 (generic)
205
+ license plate designs" applies to GENERIC distinctive plates, not to this
206
+ full-design standard base. Recording a hex here would be inventing one.
207
+ colour_process: "four process colours (CMYK), no spot/PMS colours, 3M reflective sheeting, ~55 LPI line screen, printable palette capped near 32,768 colours at 300x300 dpi (ALDOR spec)"
208
+ legend_top: "ALABAMA"
209
+ legend_top_typography: "capitalised, placed between the bolt holes, 80 point, URW BaskerTwid or similar (ALDOR spec explicitly offers 'Ex. Times New Roman' as the substitute) — a named typeface with a named fallback, which is rare and which §6's font-licensing rule can act on directly"
210
+ legend_bottom_reported: "www.alabama.travel"
211
+ heart_of_dixie_rule: >-
212
+ ALDOR spec, verbatim: "Every license plate shall display a conventionalized
213
+ representation of a heart and the words 'Heart of Dixie'. Sponsoring
214
+ organizations may request that the 'Heart of Dixie' language not be
215
+ reflected on the license plate." A MANDATORY legend with a sponsor-level
216
+ opt-out — structurally the same modelling wrinkle as Florida's
217
+ county-name legend with a county-commission opt-out, and the second
218
+ instance in the dataset of a legend that belongs to the requester rather
219
+ than to the series.
220
+ emblem: { present: true, rendered: placeholder, description: "sunrise beach graphic plus the Heart of Dixie heart device at lower right — described from a locator, NOT from a departmental drawing" }
221
+ rear_differs: false
222
+ region_encoding:
223
+ mechanism: "leading one or two digits of the serial = county of issuance"
224
+ table: >-
225
+ Codes 1, 2 and 3 were assigned in 1941 to Jefferson, Mobile and Montgomery
226
+ (the three most populous counties of the time) and codes 4 through 67 to the
227
+ remaining counties in ALPHABETICAL order; code 70 denotes replacement plates.
228
+ 68 code rows were counted in the Archives table.
229
+ decode_trap: >-
230
+ THE TRAP A PARSE API MUST NOT FALL INTO: the codes were frozen in 1941 and
231
+ were never renumbered. Montgomery is still code 3 although it is now the
232
+ seventh most populous county, and Madison — now second — carries 47. The
233
+ code is a 1941 population ranking, not a current one, and any consumer that
234
+ infers size or importance from a low Alabama county code will be wrong.
235
+ status: "mechanism + rationale recorded; the full 67-row decode table is L4 scope and belongs in plates/_decode/us-al-county.yml when it lands"
236
+ source: "https://web.archive.org/web/20090430071153/http://www.archives.alabama.gov/auto-tags.html"
237
+ sources:
238
+ - "https://www.revenue.alabama.gov/wp-content/uploads/2022/02/License-Plate-Design-Specifications-040821.pdf # ALDOR 'License Plate Design Specifications', April 8 2021: 6x12 in passenger / 4x7 in motorcycle; the 5.44x11.44 in design rectangle and .28 in margin; 0.3125 in bolt holes; the 2.875x8.75 in graphics-free serial area; 2.75 in minimum character height; the ALABAMA header at 80 pt in URW BaskerTwid; the SEVEN-character standard cap and SIX-character distinctive cap; black characters at a 4:1 contrast ratio; the mandatory Heart of Dixie legend and its sponsor opt-out; 3M sheeting and the CMYK-only rule; the J594e/FMVSS 108 reflectivity delegation; September 2006 digital manufacture"
239
+ - "https://web.archive.org/web/20090430071153/http://www.archives.alabama.gov/auto-tags.html # Alabama Department of Archives and History, 'Alabama Automobile Tags Numerical by County': 'Alabama license plates first featured county codes in 1941. As of 2008, these codes continued to be used on passenger and some non-passenger types.' Full code-to-county table, 68 rows, including 1 Jefferson / 2 Mobile / 3 Montgomery and 70 Replacement. Live URL is dead; this is the Wayback capture"
240
+ - "https://www.revenue.alabama.gov/license-plates/ # ALDOR's own plate catalogue: the Standard Passenger entry, its eligibility ('Private passenger automobiles, motorcycles, pickup trucks (not exceeding 12,000 pounds), motor homes of any weight'), and its code-section hooks 40-12-242 and 40-12-273"
241
+ - "https://en.wikipedia.org/wiki/Vehicle_registration_plates_of_Alabama # LOCATOR ONLY (PRD-PLATES §4): the January 3, 2022 base start, the sunrise-beach/www.alabama.travel design description, the eight serial arrangements, the right-to-left 0-9-then-A-Y progression, and the I/O/Q exclusion. None is asserted as sourced here"
242
+ notes: >-
243
+ ALABAMA STANDARD ISSUE, CURRENT BASE. THE ID IS DATED BUT THE DATE IS THE
244
+ WEAKEST CLAIM IN THE ENTRY, and that inversion is deliberate rather than
245
+ careless: the DESIGN facts here are agency-sourced to an unusual depth while
246
+ the PERIOD rests on a locator reporting January 3, 2022, with the same locator
247
+ conceding that "some appeared as early as October 2021". No ALDOR memo, press
248
+ release or catalogue entry announcing the 2022 base was located — ALDOR's memo
249
+ series does announce new plates with exact effective dates, but the three
250
+ memos reachable in this pass all concern DISTINCTIVE plates (Mental Health
251
+ Matters, April 1 2026; Protect Wildlife, July 1 2026; Alabama Is Aviation,
252
+ August 1 2026), not standard bases. A verifier should look for the equivalent
253
+ 2021 memo; the id is dated on the assumption it will be found, and if the true
254
+ start proves to be 2021 the id becomes a former-id alias under the
255
+ PRD-QUALITY I-5/I-6 contract rather than being edited in place.
256
+ WHY ONE SERIES AND NOT EIGHT: Alabama's eight reported arrangements are all
257
+ seven characters, all county-prefixed, and all on one physical base. They are
258
+ the surface of a single right-to-left mixed-radix counter, not eight issuance
259
+ systems, so they are one series with one regex — the opposite call from
260
+ Tennessee in this same group, where the two standard options genuinely differ
261
+ in arrangement and are therefore two series.
262
+
263
+ # =========================================================================
264
+ # ONE SERIES BACK — the L2 requirement.
265
+ # =========================================================================
266
+ - id: us-al-standard-2014
267
+ class: standard
268
+ categories: [car, van, truck, bus, motorcycle, motorhome]
269
+ period: { start: 2014, end: 2022 }
270
+ period_evidence: locator-dated
271
+ matching: strict
272
+ format:
273
+ pattern: "9L9999L"
274
+ regex: '\A(?:\d ?[A-Z][A-Z0-9]{5}|\d{2} ?[A-Z][A-Z0-9]{4})\z'
275
+ regex_statutory: '\A[A-Z0-9](?: ?[A-Z0-9]){0,6}\z'
276
+ charset: { notes: "same seven-character departmental cap and same county prefix as the successor base — the 2022 change was a GRAPHIC change, not a format change" }
277
+ design:
278
+ plate: { w: 12, h: 6, unit: in }
279
+ foreground: "#000000"
280
+ background: { finish: retroreflective, hex_basis: unsourced }
281
+ graphic_reported: "black screened serial over a lake-and-forest graphic"
282
+ emblem: { present: true, rendered: placeholder }
283
+ region_encoding: "county code in the leading one or two digits, unchanged — see us-al-standard-2022"
284
+ sources:
285
+ - "https://en.wikipedia.org/wiki/Vehicle_registration_plates_of_Alabama # LOCATOR ONLY: 'January 2, 2014 - January 2, 2022', lake-and-forest graphic, and the note that the letter-number-letter arrangement appeared in Madison and Shelby counties after 47ZZ999 and 58ZZ999 respectively were exhausted"
286
+ - "https://www.revenue.alabama.gov/wp-content/uploads/2022/02/License-Plate-Design-Specifications-040821.pdf # the design specification is dated April 8, 2021 and therefore governs the tail of THIS base as well as its successor — the same seven-character cap applies"
287
+ notes: >-
288
+ THE PREVIOUS ALABAMA BASE (lake and forest), 2014 to 2022. Recorded because
289
+ L2 asks for one series back, and worth recording for one substantive reason
290
+ beyond completeness: the county-exhaustion note. When Madison County ran out
291
+ of 47ZZ999 and Shelby out of 58ZZ999, Alabama did not issue a new county code
292
+ — it changed the ARRANGEMENT of the remaining characters within the same
293
+ county code. That is direct evidence for the one-series reading of the
294
+ current base's eight arrangements, and it is also the mechanism by which a
295
+ fixed 1941 county-code space survives population growth. Both period bounds
296
+ are locator-grade; the design specification bounds the format but says
297
+ nothing about dates.
298
+
299
+ # =========================================================================
300
+ # DEALER — separately serialized, and notably NOT county-coded.
301
+ # =========================================================================
302
+ - id: us-al-dealer
303
+ class: dealer
304
+ categories: [car, van, truck, motorcycle]
305
+ period: { start: 2021 }
306
+ period_evidence: instrument-in-force-upper-bound
307
+ matching: strict
308
+ format:
309
+ pattern: "99999"
310
+ regex: '\A\d{5}\z'
311
+ charset: { notes: "purely numeric and five wide as reported; the ALDOR seven-character cap bounds it but does not describe it" }
312
+ design:
313
+ plate: { w: 12, h: 6, unit: in }
314
+ background: { finish: retroreflective }
315
+ legend_bottom: "Dealer"
316
+ heart_of_dixie_rule: "the mandatory Heart of Dixie device applies to 'every license plate' per the ALDOR specification, dealer plates included"
317
+ binding: business
318
+ validity: "annual"
319
+ region_encoding: none
320
+ sources:
321
+ - "https://www.revenue.alabama.gov/license-plates/ # ALDOR's catalogue carries 'Dealer & Manufacturer' as one of its fourteen plate categories, establishing that Alabama serializes dealer plates separately"
322
+ - "https://en.wikipedia.org/wiki/Vehicle_registration_plates_of_Alabama # LOCATOR ONLY: the five-digit numeric serial and the 'Dealer' legend, for Dealer - Passenger and both Dealer Transit types; first-issue date recorded as Unknown even by the locator"
323
+ - "https://www.revenue.alabama.gov/wp-content/uploads/2022/02/License-Plate-Design-Specifications-040821.pdf # the Heart of Dixie requirement that reaches 'every license plate'"
324
+ notes: >-
325
+ ALABAMA DEALER PLATES. `binding: business` for the standing reason — the plate
326
+ follows the dealership, not a vehicle. Two things are worth carrying forward.
327
+ First, the dealer serial is NOT county-coded, which makes it the clean
328
+ counter-example inside Alabama to the "leading digits are a county" rule and a
329
+ trap for any decoder that applies the county table indiscriminately. Second,
330
+ the period is an upper bound from the design specification's date and nothing
331
+ better: even the locator records the first-issue date as unknown. The five-digit
332
+ width is locator-grade and is flagged as such rather than dressed up.
333
+
334
+ # =========================================================================
335
+ # MOTORCYCLE — a genuine size series, and the reason it is separate here.
336
+ # =========================================================================
337
+ - id: us-al-motorcycle
338
+ class: motorcycle
339
+ categories: [motorcycle]
340
+ period: { start: 2014 }
341
+ period_evidence: locator-dated
342
+ matching: strict
343
+ format:
344
+ pattern: "999999M"
345
+ regex: '\A\d{6}M\z'
346
+ charset: { notes: "six numerals followed by a LITERAL M; the trailing M is a class marker inside the serial, not a separator and not a decorative device" }
347
+ design:
348
+ plate: { w: 7, h: 4, unit: in, source_note: "ALDOR spec: 'Motorcycle license plates are 4\" X 7\"'" }
349
+ foreground: "#000000"
350
+ background: { finish: retroreflective, hex_basis: unsourced }
351
+ emblem: { present: true, rendered: placeholder }
352
+ region_encoding: none
353
+ sources:
354
+ - "https://www.revenue.alabama.gov/wp-content/uploads/2022/02/License-Plate-Design-Specifications-040821.pdf # the 4x7 in motorcycle plate size, and the instruction that the logo maximum is 'adjusted accordingly for motorcycle plate'"
355
+ - "https://en.wikipedia.org/wiki/Vehicle_registration_plates_of_Alabama # LOCATOR ONLY: the 123456M arrangement and a January 2014 first issue for the design shown"
356
+ notes: >-
357
+ ALABAMA MOTORCYCLE PLATES. Its own series because the DESIGN differs — 4x7 in
358
+ against 12x6 in — which is exactly the PRD-PLATES §2.3 test, and because the
359
+ serial is not county-coded. Note the tension the dataset now records honestly
360
+ in two places: ALDOR's catalogue puts motorcycles inside the Standard Passenger
361
+ CATEGORY for fee and eligibility purposes, while the physical plate is a
362
+ different size with a different serial. Both facts are true; the standard series
363
+ carries the size as a variant and cross-refers here, and this entry carries the
364
+ distinct serial. The M suffix is the only sourced-adjacent discriminator, and it
365
+ is locator-grade.
366
+
367
+ # =========================================================================
368
+ # DISTINCTIVE (SPECIALTY) — THE PROGRAM INDEX, per PRD-PLATES §2.5.
369
+ # Count and official links only; no individual designs.
370
+ # =========================================================================
371
+ - id: us-al-distinctive-index
372
+ class: specialty
373
+ categories: [car, van, truck, motorcycle]
374
+ period: { start: 2021 }
375
+ period_evidence: instrument-in-force-upper-bound
376
+ matching: recall-only
377
+ format:
378
+ pattern: "999999"
379
+ regex: '\A[A-Z0-9]{1,6}\z'
380
+ charset:
381
+ notes: >-
382
+ The SIX-character cap is agency-sourced and is the whole of what this
383
+ index claims: ALDOR, verbatim, "A maximum of six (6) alphanumeric spaces
384
+ may be displayed on distinctive license plates" — one character fewer than
385
+ a standard plate, because the design must reserve room for the sponsoring
386
+ organisation's artwork.
387
+ pattern_note: >-
388
+ `matching: recall-only` and it is the right call rather than a hedge. This
389
+ one entry stands for 398 catalogued plates whose individual arrangements are
390
+ not modelled at this gate (PRD-PLATES §2.5), so a match here says only
391
+ "this string could be an Alabama distinctive plate serial" and is emphatically
392
+ not a validity claim for any particular program. Per §2.7 a recall-only series
393
+ carries no `regex_strict`, and none is given.
394
+ design:
395
+ plate: { w: 12, h: 6, unit: in }
396
+ plate_variants: [{ for: motorcycle, w: 7, h: 4, unit: in }]
397
+ background: { finish: retroreflective }
398
+ generic_class_rule: >-
399
+ ALDOR distinguishes QUANTITY CLASS 1 (generic) from QUANTITY CLASS 2 (full
400
+ design) and specifies them differently: white background is REQUIRED for
401
+ class 1; the class 1 logo sits on the LEFT and may not exceed 3.22 x 2.3 in
402
+ on a passenger plate "to allow space for up to six (6) alphanumeric license
403
+ plate characters"; the class 1 Heart of Dixie device goes in the lower right
404
+ corner, while a class 2 design may place it anywhere. Design elements must
405
+ clear the serial by at least 0.25 in.
406
+ emblem: { present: true, rendered: placeholder }
407
+ note: "one design per authorised program; the designs themselves are L4 scope and none is described here"
408
+ program_index:
409
+ count_official: 398
410
+ count_official_basis: >-
411
+ Counted from ALDOR's own catalogue, which states its own total: "Showing 50
412
+ of 398 Plates". This is a HARDER number than most states publish — Florida
413
+ says "over 100", Kentucky says "over 150", Tennessee's arts commission says
414
+ "over 200"; Alabama publishes an exact figure because the catalogue is
415
+ database-backed.
416
+ count_caveat: >-
417
+ 398 is the count of CATALOGUE ENTRIES across all fourteen categories, not the
418
+ count of specialty PROGRAMS. The catalogue separately lists passenger,
419
+ motorcycle, personalized-passenger and personalized-motorcycle rows for the
420
+ same organisation, so the program count is materially lower than 398 and was
421
+ not derived. Recorded as what it is rather than divided by a guess.
422
+ categories_official: ["Collegiate", "Dealer & Manufacturer", "Disability Access Parking", "Distinctive", "Generic Distinctive", "Generic Race", "Government Plates", "Military", "Motorcycle", "Original Vintage Plates", "Passenger", "Standard", "Temporary Tags", "Truck"]
423
+ official_list_url: "https://www.revenue.alabama.gov/license-plates/"
424
+ design_spec_url: "https://www.revenue.alabama.gov/wp-content/uploads/2022/02/License-Plate-Design-Specifications-040821.pdf"
425
+ sponsor_application_url: "https://mydmv.revenue.alabama.gov/TAP/?link=SponsoringOrg"
426
+ churn_evidence: >-
427
+ ALDOR publishes a numbered MEMO series to plate-issuing officials announcing
428
+ each new plate with an exact availability date. Three were fetched in this
429
+ pass: Mental Health Matters, available for issuance beginning April 1, 2026;
430
+ Protect Wildlife, beginning July 1, 2026; Alabama Is Aviation (MVD Memo
431
+ 2026-004), beginning August 1, 2026. That is roughly one new plate a quarter
432
+ from ONE year's memos, which is the churn rate the index has to live with.
433
+ precommitment_mechanism: >-
434
+ A structural fact no other state in this group has: Alabama orders initial
435
+ stock against a PRE-COMMITMENT REPORT of county-level demand before a
436
+ distinctive plate is manufactured, and issues personalized copies on demand
437
+ through ALVIN. So an Alabama distinctive plate has a measurable demand
438
+ signal attached to it at birth, and the pre-commitment portal is public.
439
+ precommitment_url: "https://mydmv.revenue.alabama.gov/TAP/?link=PrecomPlt"
440
+ region_encoding: none
441
+ sources:
442
+ - "https://www.revenue.alabama.gov/license-plates/ # ALDOR's own plate catalogue: 'Showing 50 of 398 Plates' and the fourteen-category taxonomy"
443
+ - "https://www.revenue.alabama.gov/wp-content/uploads/2022/02/License-Plate-Design-Specifications-040821.pdf # the six-character distinctive cap, the quantity class 1 vs class 2 rules, the 3.22x2.3 in logo maximum, the white-background requirement for class 1, the 0.25 in clearance rule"
444
+ - "https://www.revenue.alabama.gov/memo-new-license-plate-mvd-memo-2026-004/ # MVD Memo 2026-004: 'Alabama Is Aviation, will be available for issuance beginning August 1, 2026'; the pre-commitment report and ALVIN ordering mechanism"
445
+ - "https://www.revenue.alabama.gov/memo-new-license-plate-memo-2026-001/ # Memo 2026-001: Mental Health Matters, beginning April 1, 2026"
446
+ - "https://www.revenue.alabama.gov/memo-new-license-plate/ # Protect Wildlife, beginning July 1, 2026"
447
+ notes: >-
448
+ THE ALABAMA DISTINCTIVE-PLATE INDEX — one entry standing for the whole program,
449
+ which is what PRD-PLATES §2.5 asks for at this gate. Two things worth carrying
450
+ forward. First, Alabama is the best-instrumented specialty program found in this
451
+ group: an exact published count, a fourteen-category taxonomy, a dated memo
452
+ series for new issues, and a public pre-commitment portal. Second, the SIX
453
+ versus SEVEN character split is the most consequential single fact here for a
454
+ parse API — an Alabama serial of seven characters cannot be a distinctive plate,
455
+ and that is a sourced discriminator, not a heuristic. It is also why the
456
+ distinctive index is recall-only while the standard series is strict: the cap
457
+ tells you what a distinctive serial cannot be, never what it is.