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,324 @@
1
+ # plates/us-in.yml — Indiana (PRD-PLATES gate L2, group midwest-a).
2
+ #
3
+ # WHAT INDIANA IS FOR IN THIS DATASET: the cleanest DELEGATION case in the US
4
+ # so far, and the direct analogue of Germany's §9 FZV trap. Indiana's
5
+ # legislature does not describe its plates at all. IC 9-18.1-4-3 says, in
6
+ # terms, that the BUREAU 'shall adopt rules under IC 4-22-2 regarding the size,
7
+ # character, display, mounting, securing, content, issuance, replacement, and
8
+ # life cycle of license plates' — so the entire design and format layer lives in
9
+ # the Indiana Administrative Code, one level below the statute, and a researcher
10
+ # who reads only the statute will correctly conclude that Indiana law specifies
11
+ # nothing and incorrectly conclude that nothing is specified. The IAC rules
12
+ # themselves were NOT obtained in this pass (recorded gap, and the single
13
+ # highest-value follow-up for this state).
14
+ #
15
+ # WHAT INDIANA ALSO IS: the one state in this group with a class-encoding
16
+ # convention a parse API can actually use. Indiana prefixes the serial with a
17
+ # CLASS TOKEN — M for motorcycle, TR for trailer, TK for truck, TC for semi
18
+ # tractor, SP for permanent semi-trailer — rather than distinguishing classes by
19
+ # design alone. That makes Indiana serials self-describing in a way Ohio's and
20
+ # Michigan's are not.
21
+ #
22
+ # FETCH-PROVENANCE NOTE: iga.in.gov (the official Indiana Code host) served only
23
+ # a JavaScript shell to this environment, and www.in.gov/bmv served 404s and
24
+ # timeouts on every plate sub-path tried. Statutory text below was read from
25
+ # codes.findlaw.com, a third-party REPRODUCTION of the same edict; the canonical
26
+ # iga.in.gov citation is carried alongside every FindLaw URL and was NOT fetched.
27
+ #
28
+ # NOT HERE, DELIBERATELY (PRD-PLATES §2.5 + L2 scope): individual specialty
29
+ # DESIGNS (L4); Indiana's truck (TK), semi-tractor (TC) and permanent
30
+ # semi-trailer (SP) series, which are outside the L2 core-class list and are
31
+ # recorded only as evidence of the class-token convention; and DEALER,
32
+ # TEMPORARY and GOVERNMENT series, for which no format was obtained from any
33
+ # source (recorded gaps — see the dossier).
34
+ jurisdiction: us-in
35
+ authority:
36
+ name: Indiana Bureau of Motor Vehicles (Indiana BMV)
37
+ url: "https://www.in.gov/bmv/"
38
+ binding: vehicle
39
+ statute_edition: "Indiana Code Title 9 (Motor Vehicles), Articles 18.1 and 18.5, as reproduced by codes.findlaw.com and read 2026-08-02. FindLaw's own banner warns it 'may not reflect the most recent version of the law'; the currency of this text is therefore UNVERIFIED."
40
+
41
+ # ---------------------------------------------------------------------------
42
+ # artwork_risk — required per jurisdiction by PRD-PLATES §4.
43
+ # ---------------------------------------------------------------------------
44
+ artwork_risk:
45
+ posture: unresearched-default-adverse
46
+ basis: >-
47
+ Indiana is the one state in this group that APPEARS in the subnational
48
+ copyright survey — and reading it carefully makes Indiana WORSE, not better,
49
+ than a first glance suggests. IC 5-14-3-3 bars a public agency from entering
50
+ a contract that 'require[s] the public to obtain a license or pay copyright
51
+ royalties for obtaining the right to inspect and copy the records unless
52
+ otherwise provided by applicable statute'. Two limits gut it for our
53
+ purposes. First, it is a rule about CONTRACTS FOR ACCESS to records, not a
54
+ declaration that state works are public domain — it constrains how an agency
55
+ may charge, not whether copyright subsists. Second, the survey's own gloss is
56
+ that the provision reaches 'public agencies (not state agencies as defined in
57
+ Indiana Code 4-13-1-1)' — and the BMV is a STATE agency, so the carve-out
58
+ plausibly does not reach it at all. No {{PD-INGov}} tag exists on Commons.
59
+ Indiana therefore sits at the federal default: 17 U.S.C. §105 does not extend
60
+ to the states, so TREAT THE ARTWORK AS COPYRIGHTED. Recorded as
61
+ unresearched-default-adverse with the near-miss stated, because a future
62
+ researcher will find IC 5-14-3-3 and be tempted by it.
63
+ emblem_rule: >-
64
+ PRD-PLATES §3's placeholder default applies. The current base is a pictorial
65
+ country scene with a covered bridge; render
66
+ `emblem: {present: true, rendered: placeholder}` and approximate nothing.
67
+ State-seal protection is independent of copyright and is unresearched for
68
+ Indiana.
69
+ photograph_caution: >-
70
+ Standing rule: a CC tag on a Commons photograph of an Indiana plate is the
71
+ PHOTOGRAPHER's licence on the PHOTOGRAPH, not a licence on the design. Our
72
+ renders are generated from this file and never derived from a photograph, so
73
+ those obligations never attach.
74
+ sources:
75
+ - "https://codes.findlaw.com/in/title-5-state-and-local-administration/in-code-sect-5-14-3-3.html # FETCHED. IC 5-14-3-3: no contract may 'require the public to obtain a license or pay copyright royalties for obtaining the right to inspect and copy the records unless otherwise provided by applicable statute'"
76
+ - "https://en.wikipedia.org/wiki/Copyright_status_of_works_by_subnational_governments_of_the_United_States # LOCATOR: the Indiana entry, including the 'not state agencies as defined in Indiana Code 4-13-1-1' qualifier that limits it"
77
+ - "https://commons.wikimedia.org/wiki/Commons:Copyright_rules_by_territory/United_States # the §105-does-not-reach-the-states rule and the complete state PD-tag list — no Indiana tag"
78
+
79
+ us_standards:
80
+ no_federal_mandate: true
81
+ chain: "SAE J686 -> AAMVA License Plate Standard Edition 3 (September 2025) -> voluntary state adoption. Recommendations in the declarative present; read as RECOMMENDED PRACTICE."
82
+ aamva_edition_3:
83
+ dimensions_delegated: "AAMVA §3.1 sends dimensions and bolt holes to SAE J686, whose text is paywalled and was NOT obtained. No J686 dimension is quoted anywhere in this dataset."
84
+ 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"
85
+ jurisdiction_name_layout: "AAMVA §2.1: jurisdiction name top centre between the bolt holes, at least 0.25 in above the plate number, 0.125 in from the top edge; characters 0.75-1.0 in"
86
+ stacked_characters: "AAMVA: stacked characters are part of the official plate number, at most two stacked"
87
+ replacement_cycle: "AAMVA §1.1 recommends a cycle 'not to exceed 7 to 10 years'. INDIANA SITS AT THE BOTTOM OF THAT RANGE: registrants are reported to receive new plates on a rolling SEVEN-YEAR basis bearing the same number as before (secondary). If confirmed, Indiana and Florida bracket AAMVA's recommendation exactly — 7 against Florida's legislated 10."
88
+ source: "https://www.aamva.org/getmedia/646bcc8a-219b-47d8-b5cd-726240473163/License-Plate-Standard-Edition-3_September-2025-Update.pdf"
89
+ folklore_caution: >-
90
+ The "1956 AMA standardization agreement" is UNCITED in its Wikipedia source
91
+ and is not relied on here. Note the trap it sets for Indiana specifically:
92
+ the Indiana article cites an ALPCA page for 'standard plate size
93
+ documentation', which is precisely the circular enthusiast sourcing PRD-PLATES
94
+ §4 warns about. No Indiana plate dimension is recorded in this file.
95
+
96
+ display_rules:
97
+ default: "ONE plate, REAR. IC 9-18.1-4-4 requires the plate 'upon the rear of the vehicle' for all vehicles except the enumerated front-display classes."
98
+ front_plate_required_when:
99
+ - "TRACTOR, DUMP TRUCK, or TRUCK WITH A REAR-MOUNTED FORKLIFT: the plate goes 'upon the front of the vehicle' (IC 9-18.1-4-4). Note this is not merely a truck-tractor rule like Ohio's and Florida's — Indiana extends front display to dump trucks and forklift-carrying trucks, i.e. to vehicles whose rear is habitually obstructed by equipment. The RATIONALE is visible in the class list."
100
+ mounting: "IC 9-18.1-4-4: 'securely fastened, in a horizontal and upright position', 'at a height of at least twelve (12) inches from the ground', 'clearly visible', 'maintained free from foreign materials and in a condition to be clearly legible', and 'not obstructed or obscured by tires, bumpers, accessories, or other opaque objects'"
101
+ validation_sticker: "IC 9-18.1-4-4: on renewal the sticker must be 'securely affixed in the upper right corner of the license plate' and must 'cover the previous registration expiration year'. Indiana therefore STACKS stickers over one another — a render-layer fact and an OCR hazard."
102
+ penalty: "IC 9-18.1-4-4: 'A person that violates this section commits a Class C infraction.'"
103
+ rear_only_history: "Indiana is reported rear-only since 1956 (secondary). The statute corroborates the current state of affairs but dates nothing."
104
+ sources:
105
+ - "https://codes.findlaw.com/in/title-9-motor-vehicles/in-code-sect-9-18-1-4-4.html # FETCHED. IC 9-18.1-4-4: front display for tractors, dump trucks and rear-mounted-forklift trucks; rear for everything else; horizontal and upright; 12-inch minimum height; visibility and obstruction rules; upper-right renewal sticker covering the previous year; Class C infraction"
106
+ - "https://iga.in.gov/laws/2025/ic/titles/9 # CANONICAL Indiana Code host — served a JavaScript shell only, NOT fetched as text"
107
+ - "https://en.wikipedia.org/wiki/Vehicle_registration_plates_of_Indiana # LOCATOR ONLY: rear plates only since 1956"
108
+
109
+ series:
110
+
111
+ - id: us-in-standard-2017
112
+ class: standard
113
+ categories: [car, van, bus]
114
+ period: { start: 2017 }
115
+ period_evidence: secondary-first-issue
116
+ matching: strict
117
+ format:
118
+ pattern: "999LLL"
119
+ regex: '\A\d{3}[A-Z]{1,3}\z'
120
+ evidence: secondary
121
+ charset:
122
+ notes: >-
123
+ THREE DIGITS THEN ONE TO THREE LETTERS — a VARIABLE-LENGTH serial, in
124
+ the Delaware family of schema stressors: the regex must quantify
125
+ (`{1,3}`) rather than fix width, and any consumer that assumes a fixed
126
+ US plate length is wrong on Indiana. The reported arrangements are
127
+ 123A, 123AB and 123ABC. No separator is printed. No statutory
128
+ constraint exists to record as `regex_statutory`, because IC 9-18.1-4-3
129
+ delegates 'size, character... content' wholesale to bureau rules
130
+ adopted under IC 4-22-2, and those rules (Indiana Administrative Code)
131
+ were NOT obtained in this pass.
132
+ excluded: []
133
+ excluded_note: "no letter exclusions stated in statute or observed; recorded as an open question rather than as an assertion of none"
134
+ design:
135
+ background: { color: "#FFFFFF", finish: retroreflective, hex_basis: observed }
136
+ colour_note: >-
137
+ Dark blue serial on a reflective pictorial country scene with a covered
138
+ bridge. The background hex is recorded as plain reflective white only
139
+ because the scene sits ON a white sheet; the SCENE has no hex and none is
140
+ invented. The serial colour is named, not hexed, for the same reason.
141
+ legend_top: "INDIANA"
142
+ graphic: { present: true, rendered: placeholder, description: "country scene with a covered bridge; secondary observation only, never a statutory drawing" }
143
+ emblem: { present: true, rendered: placeholder }
144
+ county_sticker: { present: true, position: "top", content: "county number and county name, on a white sticker" }
145
+ replacement_cycle:
146
+ years: 7
147
+ evidence: secondary
148
+ note: >-
149
+ 'Registrants receive new plates on a rolling 7-year basis, bearing the
150
+ same number they had previously' (secondary). Two consequences if true,
151
+ and both matter: Indiana sits at the BOTTOM of AAMVA's 7-10 year
152
+ recommendation, and — unusually — the SERIAL SURVIVES the replacement, so
153
+ an Indiana plate number does not date the plate it is printed on. A parse
154
+ API must not infer era from an Indiana serial.
155
+ region_encoding: >-
156
+ COUNTY ON A STICKER, NOT IN THE SERIAL — but Indiana is the US state where
157
+ this distinction is most easily got wrong, because it USED to be in the
158
+ serial. From 1963 to 2008 the plate carried a numeric county prefix (01
159
+ Adams through 92 Whitley, with overflow 93-99 for Marion and Lake), and
160
+ from 1950 to 1962 a two-letter county prefix. Since 2008 the county number
161
+ and name ride on a sticker at the top of the plate. So a decode table for
162
+ Indiana geography is PERIOD-BOUND and applies only to pre-2008 serials —
163
+ exactly the trap PRD-PLATES §2.4 records for the French SIV band. All of
164
+ this is secondary; no primary was obtained.
165
+ sources:
166
+ - "https://codes.findlaw.com/in/title-9-motor-vehicles/in-code-sect-9-18-1-4-3.html # FETCHED. IC 9-18.1-4-3, the delegation: 'The bureau shall adopt rules under IC 4-22-2 regarding the size, character, display, mounting, securing, content, issuance, replacement, and life cycle of license plates, temporary license plates, renewal stickers, and other proof of registration.' This is the reason no format claim in this file can be statute-grade."
167
+ - "https://codes.findlaw.com/in/title-9-motor-vehicles/in-code-sect-9-18-1-4-1.html # FETCHED. IC 9-18.1-4-1: on registering, the bureau issues 'proof of registration for display on the vehicle', either 'a regular license plate under this article' or 'a distinctive license plate designed and issued under IC 9-18.5'"
168
+ - "https://iga.in.gov/laws/2025/ic/titles/9 # CANONICAL, not fetched (JS shell)"
169
+ - "https://en.wikipedia.org/wiki/Vehicle_registration_plates_of_Indiana # LOCATOR ONLY: 2017-present covered-bridge base; serial formats 123A / 123AB / 123ABC; county number and name on a white sticker at top; the rolling 7-year replating keeping the same number; the 1950-1962 and 1963-2008 county-prefix schemes"
170
+ notes: >-
171
+ INDIANA STANDARD ISSUE, CURRENT BASE. The id is dated on a
172
+ SECONDARY first-issue year and carries `period_evidence:
173
+ secondary-first-issue` to say so; PRD-QUALITY's id contract means a dated
174
+ id minted on a soft boundary must be aliased rather than moved if the
175
+ boundary shifts, so the flag is load-bearing, not decorative. The entry's
176
+ real contribution to the dataset is the two structural facts around the
177
+ format: Indiana's plate spec is in ADMINISTRATIVE RULES, not statute
178
+ (IC 9-18.1-4-3), and Indiana's county geography moved OUT of the serial in
179
+ 2008, which makes every pre-2008 Indiana decode table period-bound.
180
+
181
+ - id: us-in-standard-2013
182
+ class: standard
183
+ categories: [car, van, bus]
184
+ period: { start: 2013, end: 2017 }
185
+ period_evidence: secondary-first-issue
186
+ matching: strict
187
+ format:
188
+ pattern: "999LLL"
189
+ regex: '\A\d{3}[A-Z]{1,3}\z'
190
+ evidence: secondary
191
+ charset: { notes: "same variable-length grammar as the current base — the 2017 change was a BASE change, not a format change" }
192
+ design:
193
+ background: { color: "#FFFFFF", finish: retroreflective, hex_basis: observed }
194
+ colour_note: "black serial on reflective white fading to gold; no serial hex recorded"
195
+ legend_top: "INDIANA"
196
+ legend_bottom: "Bicentennial 1816-2016"
197
+ graphic: { present: true, rendered: placeholder }
198
+ emblem: { present: true, rendered: placeholder }
199
+ county_sticker: { present: true, position: "corner", content: "county number" }
200
+ region_encoding: "county number on the plate corner; not in the serial"
201
+ sources:
202
+ - "https://en.wikipedia.org/wiki/Vehicle_registration_plates_of_Indiana # LOCATOR ONLY: 2013-2017 Bicentennial base, black on white-to-gold, serial formats 123A / 123AB / 123ABC, county number and expiration in the corners"
203
+ - "https://codes.findlaw.com/in/title-9-motor-vehicles/in-code-sect-9-18-1-4-3.html # FETCHED. The same delegation governed this base; it is why neither base has a statute-grade format"
204
+ notes: >-
205
+ ONE SERIES BACK (Bicentennial base, 2013-2017). Carried per L2 scope, and
206
+ it repeats the Ohio lesson in a second state: CONSECUTIVE BASES SHARE ONE
207
+ SERIAL GRAMMAR, so the regex cannot date the plate and the artwork is the
208
+ only discriminator. Combined with Indiana's serial-preserving 7-year
209
+ replating, this means an Indiana serial carries essentially no temporal
210
+ signal at all — worth stating plainly before someone builds era inference
211
+ on top of it.
212
+
213
+ - id: us-in-motorcycle-2010
214
+ class: motorcycle
215
+ categories: [motorcycle]
216
+ period: { start: 2010 }
217
+ period_evidence: secondary-first-issue
218
+ matching: strict
219
+ format:
220
+ pattern: "M999LL"
221
+ regex: '\AM\d{3}[A-Z]{1,2}\z'
222
+ evidence: secondary
223
+ charset:
224
+ notes: >-
225
+ The leading M is a CLASS TOKEN, not a separator and not a serial block:
226
+ Indiana marks the motorcycle class inside the string. Reported
227
+ arrangement M123AB running from M101AA. Because the token is a literal,
228
+ an Indiana motorcycle plate is self-identifying from the string alone —
229
+ the only class in this group's five states of which that is true
230
+ without a range lookup.
231
+ progression: "observed from M101AA (secondary)"
232
+ design:
233
+ background: { color: "#FFFFFF", finish: retroreflective, hex_basis: observed }
234
+ colour_note: "screened blue on white (secondary); no serial hex recorded"
235
+ emblem: { present: true, rendered: placeholder }
236
+ size_note: "reduced motorcycle size; NO dimension recorded — Indiana delegates size to bureau rules (IC 9-18.1-4-3) and AAMVA delegates dimensions to the unpinned SAE J686"
237
+ region_encoding: none
238
+ sources:
239
+ - "https://en.wikipedia.org/wiki/Vehicle_registration_plates_of_Indiana # LOCATOR ONLY: motorcycle plates 2010-present, screened blue on white, format M123AB from M101AA"
240
+ - "https://codes.findlaw.com/in/title-9-motor-vehicles/in-code-sect-9-18-1-4-4.html # FETCHED. IC 9-18.1-4-4's rear-display and 12-inch mounting rules apply to motorcycles as to other vehicles"
241
+ notes: >-
242
+ MOTORCYCLE. Its own series because the format differs (class token plus a
243
+ shorter tail) and the plate size differs. This is the entry that makes
244
+ Indiana's class-token convention visible; see the trailer series for the
245
+ two-character form of the same idea.
246
+
247
+ - id: us-in-trailer
248
+ class: trailer
249
+ categories: [trailer]
250
+ period: { start: 2026 }
251
+ period_evidence: instrument-in-force-upper-bound
252
+ matching: strict
253
+ format:
254
+ pattern: "TR999LLL"
255
+ regex: '\ATR\d{3}[A-Z]{1,3}\z'
256
+ evidence: secondary
257
+ charset:
258
+ notes: >-
259
+ TR is a TWO-CHARACTER CLASS TOKEN, and the same convention runs across
260
+ Indiana's commercial classes: TK for truck (observed TK101LAA to
261
+ TK713ORW as of July 2024), TC for semi tractor, SP for the permanent
262
+ semi-trailer. Those three are outside L2 core-class scope and are
263
+ recorded here as EVIDENCE OF THE CONVENTION rather than as series of
264
+ their own. CAUTION for a render or OCR consumer: under AAMVA's stacked
265
+ -character rule a two-character token like TR may well be PRINTED
266
+ STACKED; whether Indiana stacks it was not established.
267
+ design:
268
+ background: { color: "#FFFFFF", finish: retroreflective, hex_basis: observed }
269
+ colour_note: "screened black on white (secondary)"
270
+ legend_bottom: "TRAILER, with gross weight"
271
+ emblem: { present: true, rendered: placeholder }
272
+ weight_class_note: "the trailer plate prints the GROSS WEIGHT at the bottom alongside the class legend — a weight-class encoding carried as printed TEXT, not in the serial (secondary)"
273
+ region_encoding: none
274
+ sources:
275
+ - "https://en.wikipedia.org/wiki/Vehicle_registration_plates_of_Indiana # LOCATOR ONLY: trailer format TR123ABC, screened black on white, 'TRAILER' and gross weight at bottom; and the parallel TK / TC / SP class tokens"
276
+ - "https://codes.findlaw.com/in/title-9-motor-vehicles/in-code-sect-9-18-1-4-1.html # FETCHED. IC 9-18.1-4-1 is the issuance frame for every plate class; it carries no class grammar"
277
+ notes: >-
278
+ TRAILER. `period.start` is an INSTRUMENT-IN-FORCE UPPER BOUND, not a
279
+ first-issue year: no source dated the TR series, so the year of the
280
+ statutes read is recorded rather than a year invented. The weight-class
281
+ legend is the fact worth carrying — Indiana answers the "does this state
282
+ encode weight class?" question with YES, but as printed text under the
283
+ serial, which is invisible to a string parser and visible to a renderer.
284
+
285
+ - id: us-in-specialty-index
286
+ class: specialty
287
+ categories: [car, van, truck, motorcycle]
288
+ period: { start: 2026 }
289
+ period_evidence: instrument-in-force-upper-bound
290
+ matching: strict
291
+ format:
292
+ pattern: "999LLL"
293
+ regex: '\A\d{3}[A-Z]{1,3}\z'
294
+ evidence: secondary
295
+ charset: { notes: "specialty and 'special group recognition' plates carry ordinary serials on an alternative design; no distinct grammar was sourced" }
296
+ design:
297
+ background: { finish: retroreflective }
298
+ note: "one design per authorised group; designs are L4 scope (PRD-PLATES §2.5) and none is described here"
299
+ emblem: { present: true, rendered: placeholder }
300
+ program_index:
301
+ count_official: null
302
+ count_status: RECORDED-GAP
303
+ count_note: >-
304
+ No count was obtained. www.in.gov/bmv is reachable at its root but every
305
+ plate sub-path tried returned 404 or timed out, so neither the official
306
+ catalogue nor a count was captured; no secondary count was found either.
307
+ Recorded as `null` with the cause stated rather than guessed.
308
+ official_list_url: "https://www.in.gov/bmv/licenses-permits-ids/license-plates/specialty-license-plates/"
309
+ official_list_fetch_status: "NOT CAPTURED — 404 on the parent path and a 60 s timeout on the specialty path, 2026-08-02"
310
+ statutory_basis: "IC 9-18.5 — 'distinctive license plate designed and issued under IC 9-18.5' is the statutory alternative to the regular plate (IC 9-18.1-4-1). IC 9-18.5-1-1 scopes the chapter to a person who 'is the registered owner or lessee of a vehicle' or 'applies to register or renew the registration of a vehicle'. NO PETITION THRESHOLD was found in the sections read — a structural contrast with Illinois (2,000 applications) and Wisconsin (500 signatures), and a recorded gap rather than a finding of none."
311
+ known_programme_note: "Indiana's BLACKOUT plate — an all-black standard-serial plate promoted on the BMV homepage ('Visit your local branch to switch your design to a blackout license plate') — is the most visible current Indiana optional plate. It is an OPTIONAL DESIGN on the ordinary serial, i.e. exactly the specialty shape, and is indexed here rather than given a series."
312
+ region_encoding: none
313
+ sources:
314
+ - "https://codes.findlaw.com/in/title-9-motor-vehicles/in-code-sect-9-18-1-4-1.html # FETCHED. IC 9-18.1-4-1: the regular-plate / IC 9-18.5 distinctive-plate fork"
315
+ - "https://codes.findlaw.com/in/title-9-motor-vehicles/in-code-sect-9-18-5-1-1.html # FETCHED. IC 9-18.5-1-1: the scope of the special-group-recognition chapter"
316
+ - "https://www.in.gov/bmv/ # FETCHED (root only): the BMV's own promotion of the blackout plate and its 'Specialty & Personalized License Plates' section"
317
+ notes: >-
318
+ THE INDIANA SPECIALTY PROGRAM INDEX — one entry for the whole programme per
319
+ PRD-PLATES §2.5, with the count declared as a gap. The structural finding is
320
+ that Indiana routes optional plates through a dedicated CODE ARTICLE
321
+ (IC 9-18.5) rather than through per-plate statutes as Ohio does or through a
322
+ petition threshold as Illinois and Wisconsin do. That article is the right
323
+ place to count from once iga.in.gov is reachable, and counting from an edict
324
+ beats counting from a brochure.