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,351 @@
1
+ # plates/us-ks.yml — Kansas (PRD-PLATES gate L2, group midwest-b).
2
+ #
3
+ # KANSAS IS THE ONLY STATE IN THIS GROUP WHOSE SERIAL ARRANGEMENT IS FIXED BY
4
+ # STATUTE. K.S.A. 8-147(c) does not delegate the format to the agency the way
5
+ # Missouri, Minnesota, North Dakota and South Dakota all do — it states it:
6
+ # "Each license plate shall contain a combination of three letters followed by a
7
+ # combination of three numerals". That is an edict of government specifying a
8
+ # regex, which is the best sourcing situation this program can hope for, and it
9
+ # is why `us-ks-standard` is `matching: strict` while several of its neighbours
10
+ # in this group are `recall-only`.
11
+ #
12
+ # THE STATUTE ALSO WROTE ITS OWN EXHAUSTION CLAUSE, which is unusual foresight
13
+ # and matters for the parse layer: "except that once all allowable combinations
14
+ # of letters and numerals have been used, each license plate shall contain an
15
+ # arrangement of numerals or letters, or both, as shall be assigned by the
16
+ # secretary of revenue." So Kansas law contains BOTH a precise current grammar
17
+ # and a pre-authorised escape hatch out of it. `regex_statutory` encodes the
18
+ # escape hatch; `regex` encodes the grammar.
19
+ #
20
+ # THE ONE THING THIS FILE COULD NOT RESOLVE is the county designation. K.S.A.
21
+ # 8-132(d) refers, in passing and without defining them, to "the letters required
22
+ # to designate the county in which such vehicle is registered" — telling us that
23
+ # Kansas plates carry a county designator that even a vanity plate may not
24
+ # displace, without telling us what it looks like or where on the plate it sits.
25
+ # That gap is recorded in `region_encoding` rather than papered over, because
26
+ # guessing at it would corrupt exactly the decode data this program exists to get
27
+ # right. The Kansas Department of Revenue's own site was UNREACHABLE for this
28
+ # pass (connection timeouts on every attempt), which is why the gap survives.
29
+ jurisdiction: us-ks
30
+ authority:
31
+ name: Kansas Department of Revenue, Division of Vehicles
32
+ url: "https://www.ksrevisor.gov/statutes/chapters/ch08/"
33
+ binding: vehicle
34
+ statute_edition: "Kansas Statutes Annotated Chapter 8 (Automobiles and Other Vehicles), Article 1, as published by the Kansas Office of Revisor of Statutes and fetched for this pass. K.S.A. 8-147 carries a 2025 amendment (L. 2025, ch. 75, § 6), so the design provisions read here are current to the 2025 session."
35
+
36
+ # ---------------------------------------------------------------------------
37
+ # artwork_risk — required per jurisdiction by PRD-PLATES §4.
38
+ # ---------------------------------------------------------------------------
39
+ artwork_risk:
40
+ posture: unresearched
41
+ basis: >-
42
+ KANSAS WAS NOT LOCATED IN ANY COPYRIGHT SURVEY READ FOR THIS PASS. The Wikipedia
43
+ survey of subnational-government copyright status carries per-state sections for
44
+ seventeen states and NO section for Kansas; no {{PD-KSGov}} tag was found on
45
+ Commons. The dossier's default therefore governs: 17 U.S.C. § 105 does not reach the
46
+ states, so a Kansas plate design is presumed COPYRIGHTED unless Kansas says
47
+ otherwise, and Kansas has not been shown to say otherwise. Recorded as unresearched,
48
+ not as adverse — absence of a fetched source is weak evidence either way.
49
+ edict_carve_out: >-
50
+ KANSAS HAS THE STRONGEST EDICT CARVE-OUT IN GROUP MIDWEST-B, and it is worth stating
51
+ plainly because it is the practical answer to the unresearched posture above. The
52
+ facts this program most needs from Kansas — the three-letters-then-three-numerals
53
+ arrangement, the reflective coating duty, the mandatory colour change on each
54
+ reissue, the five-year reissue cycle, the personalized character caps — are ALL in
55
+ the Kansas Statutes Annotated, and edicts of government are uncopyrightable at every
56
+ level ({{PD-US-GovEdict}}). So the entire format layer of this file is affirmatively
57
+ clean regardless of what Kansas thinks about its artwork. Only the artwork is exposed.
58
+ emblem_rule: >-
59
+ PRD-PLATES §3's placeholder default applies to whatever graphic the current Kansas
60
+ base carries — which this pass could not identify, since the Department of Revenue
61
+ site timed out. Render `emblem: {present: true, rendered: placeholder}`. Kansas
62
+ state-seal misuse statutes are a protection regime independent of copyright and are
63
+ unresearched.
64
+ sources:
65
+ - "https://en.wikipedia.org/wiki/Copyright_status_of_works_by_subnational_governments_of_the_United_States # LOCATOR ONLY (PRD-PLATES §4): read to establish that Kansas has NO section in the survey — a negative result, recorded as such"
66
+ - "https://www.ksrevisor.gov/statutes/chapters/ch08/008_001_0047.html # K.S.A. 8-147, the statutory design spec itself — an edict of government, PD"
67
+
68
+ us_standards:
69
+ no_federal_mandate: true
70
+ chain: "SAE J686 -> AAMVA License Plate Standard Edition 3 (September 2025) -> voluntary state adoption. AAMVA has no enforcement power; its declarative present is RECOMMENDED PRACTICE."
71
+ dimensions_delegated: "AAMVA §3.1 sends dimensions and bolt holes to SAE J686, whose text is PAYWALLED and UNPINNED. No J686 dimension is quoted anywhere in this file."
72
+ geometry_available: "AAMVA §2.1 (jurisdiction name top-centre between the bolt holes, >=0.25 in above the number, >=0.125 in from the top edge, characters 0.75-1.0 in) and §2.2 (characters >=2.5 in high, >=0.25 in apart, stroke 0.2-0.4 in, >=1.25 in clear of top and bottom)."
73
+ retroreflectivity: "AAMVA §3.3: legible day and night from at least 75 feet; ASTM D4956-19 and ISO 7591:1982 clause 3; entrance angle 0.2 deg, observation angle -4 deg, minimum 45 cd/lx/m^2."
74
+ replacement_cycle_recommendation: >-
75
+ AAMVA §1.1 recommends a cycle 'not to exceed 7 to 10 years'. KANSAS LEGISLATED FIVE —
76
+ TIGHTER THAN AAMVA'S FLOOR — and then legislated a way to stretch it. See
77
+ `replacement_cycle` on us-ks-standard: this is the most interesting replacement regime
78
+ in group midwest-b precisely because the legislature anticipated that plates might
79
+ outlast their nominal life and gave the director a rules-based extension rather than
80
+ forcing a statutory amendment.
81
+ source: "https://www.aamva.org/getmedia/646bcc8a-219b-47d8-b5cd-726240473163/License-Plate-Standard-Edition-3_September-2025-Update.pdf"
82
+ folklore_caution: "The '1956 AMA standardization agreement' is UNCITED in its Wikipedia source (a `citation needed` since 2017, copied across articles). Recorded as COMMONLY REPEATED, UNSOURCED. Chapter 8 states no plate dimension, so this file makes no Kansas dimension claim (recorded gap)."
83
+
84
+ # ---------------------------------------------------------------------------
85
+ # Display rules. Kansas is a ONE-PLATE, REAR-ONLY state — with five statutory
86
+ # exceptions, three of which move the plate to the FRONT.
87
+ # ---------------------------------------------------------------------------
88
+ display_rules:
89
+ default: "ONE plate, REAR. K.S.A. 8-132(a): the division 'shall furnish to every owner whose vehicle shall be registered one license plate'. K.S.A. 8-133(a): it 'shall be attached to the rear of the vehicle', and 'Except as otherwise provided in subsection (b), a Kansas registered vehicle shall not have a license plate attached to the front of the vehicle' — an express PROHIBITION on front display, not merely an absence of a requirement."
90
+ exceptions:
91
+ - "TRUCK TRACTOR: the plate 'shall be attached to the front of the truck tractor' (§ 8-133(b)(1)) — front-only, the inverse of the state default, and the same outlier shape Florida and North Dakota carry"
92
+ - "ANTIQUE VEHICLE displaying a model-year plate under K.S.A. 8-172 MAY be attached to the front (§ 8-133(b)(2))"
93
+ - "PERSONALIZED plate issued to a passenger vehicle or truck under § 8-132(c) MAY be attached to the front (§ 8-133(b)(3)) — so a Kansas vanity plate may lawfully appear where a standard plate may not"
94
+ - "CONCRETE MIXER TRUCK: may be attached to either the front or the rear (§ 8-133(b)(4))"
95
+ - "DUMP TRUCK of gross weight 26,000 lb or more: 'shall be attached to the front of the vehicle', but NOT if the vehicle is registered as a farm truck (§ 8-133(b)(5))"
96
+ mounting: "§ 8-133(c): securely fastened to prevent swinging, not less than 12 inches from the ground measured from the bottom of the plate, in a place and position clearly visible, free from foreign materials and legible"
97
+ enforcement_note: "§ 8-133(e) required a warning citation rather than a penalty for the dump-truck rule, and by its own terms 'shall expire and have no effect on and after January 1, 2022' — a self-repealing grace period, now spent"
98
+ suspension_contingency: "§ 8-133(d): if plate CONSTRUCTION is suspended under § 8-132, whatever 'plate, tag, token, marker or sign' is assigned is displayed as the director of vehicles prescribes — a wartime-style contingency still sitting in the code"
99
+ sources:
100
+ - "https://www.ksrevisor.gov/statutes/chapters/ch08/008_001_0033.html # K.S.A. 8-133: rear attachment and the express front-display prohibition; the truck-tractor, antique, personalized, concrete-mixer and dump-truck exceptions; the 12-inch mounting rule; the expired warning-citation subsection; the construction-suspension contingency"
101
+ - "https://www.ksrevisor.gov/statutes/chapters/ch08/008_001_0032.html # K.S.A. 8-132(a): one plate per registered vehicle"
102
+
103
+ series:
104
+
105
+ # =========================================================================
106
+ # THE STANDARD-ISSUE SERIES — statutory arrangement, statutory reissue cycle,
107
+ # statutory colour change. Kansas legislates more of its plate than any other
108
+ # state in this group.
109
+ # =========================================================================
110
+ - id: us-ks-standard
111
+ class: standard
112
+ categories: [car, van, truck, bus]
113
+ period: { start: 2025 }
114
+ period_evidence: instrument-in-force-upper-bound
115
+ matching: strict
116
+ format:
117
+ pattern: "LLL 999"
118
+ regex: '\A[A-Z]{3} ?\d{3}\z'
119
+ regex_statutory: '\A[A-Z0-9](?: ?[A-Z0-9])*\z'
120
+ charset:
121
+ notes: >-
122
+ K.S.A. 8-147(c), verbatim: 'Each license plate shall contain a combination of
123
+ three letters followed by a combination of three numerals, except that once all
124
+ allowable combinations of letters and numerals have been used, each license
125
+ plate shall contain an arrangement of numerals or letters, or both, as shall be
126
+ assigned by the secretary of revenue. The arrangement of numerals and letters of
127
+ license plates shall be uniform throughout each classification of registration.
128
+ The secretary may provide for the arrangement of the numerals and letters in
129
+ groups or otherwise and for other distinguishing marks on such license plates.'
130
+ NO LETTER EXCLUSIONS are stated anywhere in Chapter 8 — whether Kansas skips
131
+ I/O/Q was NOT established (recorded gap).
132
+ pattern_note: >-
133
+ `regex` encodes the arrangement the STATUTE fixes. `regex_statutory` encodes the
134
+ statute's own EXHAUSTION CLAUSE — 'an arrangement of numerals or letters, or both,
135
+ as shall be assigned by the secretary' — which is the outer legal bound once the
136
+ three-and-three space is used up, and the honest bound for a Kansas plate of
137
+ unknown vintage. This is the cleanest example in group midwest-b of the tier order
138
+ doing real work: the two tiers are not researcher caution, they are two sentences
139
+ of one statute.
140
+ grouping: "§ 8-147(c) lets the secretary arrange the characters 'in groups or otherwise', which is why the separator is optional in the regex rather than mandatory"
141
+ design:
142
+ material_and_finish: "§ 8-147(d): 'As new license plates are issued, the face of every license plate shall be completely coated with a reflective material. The reflectorized material shall be of such nature as to provide effective and dependable performance in the promotion of highway safety and vehicle identification throughout the service period for which the license plates are issued.' A $0.50 charge is added to the cost of each reflectorized plate."
143
+ contrast_rule: "§ 8-147(c): 'The letters and numerals of such license plates shall be in such contrast of colors to the background of the license plate as to make such letters and numerals easily readable.'"
144
+ colour_change_rule: >-
145
+ THE COLOUR IS REQUIRED TO CHANGE, WHICH IS A FACT ABOUT THE SERIES BOUNDARY ITSELF.
146
+ § 8-147(d): 'The director shall change the color of such license plates every time
147
+ new license plates are issued under K.S.A. 8-132(b).' Kansas has therefore
148
+ legislated that every reissue is visually distinguishable from its predecessor —
149
+ which means Kansas base generations are, in principle, separable by colour alone,
150
+ and that a complete Kansas history is a colour sequence. Iowa legislates the same
151
+ idea in different words (Iowa Code § 321.166(5)).
152
+ colour_note: >-
153
+ NO HEX IS RECORDED. Kansas mandates CONTRAST and mandates CHANGE but names no
154
+ colour value, and the Kansas Department of Revenue site was unreachable in this
155
+ pass, so no departmental colour specification was obtained. Recording an observed
156
+ hex from a photograph would attach a value to the wrong authority. Recorded gap.
157
+ decals: "§ 8-147(c): the secretary designs decals affixed to the plate to identify registration expiration information consistent with K.S.A. 8-134"
158
+ plate_content: "§ 8-132(a): the plate displays 'the registration number assigned to the vehicle and to the owner thereof, the name of the state, which may be abbreviated, and the year or years for which it is issued'"
159
+ emblem: { present: true, rendered: placeholder }
160
+ manufacture: "§ 8-147(b): plates are manufactured under contract with an organization or institution designated in K.S.A. 39-1208 — the Kansas correctional-industries route, the same arrangement South Dakota states more bluntly as its penitentiary plate plant"
161
+ distribution: "§ 8-147(e): plates ship directly to the treasurer of the county where they are to be used or, 'for digitally fulfilled license plate orders, directly to the customer for whom the plate is issued' — the digital-fulfilment clause is recent and is what the 2025 amendment added"
162
+ replacement_cycle:
163
+ years: 5
164
+ statutory_text: >-
165
+ § 8-132(b): 'During calendar year 1975 commencing on the effective date of this
166
+ act, and during every fifth calendar year thereafter, the division of vehicles
167
+ shall furnish one license plate for any type of vehicle an owner registers or has
168
+ the registration thereof renewed', with decals furnished in the four intervening
169
+ years.
170
+ extension_mechanism: >-
171
+ THE PART THAT MAKES KANSAS DIFFERENT. § 8-132(b) continues: 'Notwithstanding the
172
+ foregoing provisions of this subsection, whenever, in the discretion of the
173
+ director of vehicles, it is determined that the license plates currently being
174
+ issued and displayed are not deteriorating to the extent that their replacement is
175
+ warranted, the director may adopt rules and regulations to extend the five-year
176
+ issuance cycle provided for in this subsection by one year at a time, and in the
177
+ same manner the director may further extend such cycle by one year at a time,
178
+ successively as the director determines appropriate.' On expiry of an extended
179
+ term an owner may keep displaying the current plate 'for a period not to exceed
180
+ three registration years'. So the NOMINAL cycle is five years and the EFFECTIVE
181
+ cycle is unbounded — which is precisely why `period.start` on this series is an
182
+ upper bound and not a computed date. A dataset that inferred Kansas base
183
+ boundaries by counting five-year steps from 1975 would be wrong, and would look
184
+ confident while being wrong.
185
+ note: "AAMVA §1.1 recommends not exceeding 7 to 10 years; Kansas's nominal five is tighter, but the extension mechanism can carry it past AAMVA's ceiling without any change in the law"
186
+ region_encoding:
187
+ mechanism: "COUNTY DESIGNATION LETTERS — existence sourced, form NOT sourced"
188
+ status: unresolved
189
+ evidence: >-
190
+ K.S.A. 8-132(d) establishes that Kansas plates carry a county designator, and does
191
+ so obliquely, while regulating something else. Describing personalized plates, it
192
+ permits the applicant to choose characters 'in lieu of the letters and numbers
193
+ required by K.S.A. 8-147, and amendments thereto, OTHER THAN THE LETTERS REQUIRED
194
+ TO DESIGNATE THE COUNTY IN WHICH SUCH VEHICLE IS REGISTERED.' Two facts follow and
195
+ no more: (1) Kansas plates carry LETTERS designating the county of registration;
196
+ (2) those letters are so fundamental that even a vanity plate cannot replace them.
197
+ not_established: >-
198
+ WHAT THIS PASS COULD NOT DETERMINE: whether the county letters sit inside the
199
+ six-character serial or in a separate field such as a printed county name; how
200
+ many letters they are; the county-to-letters mapping; and whether all 105 Kansas
201
+ counties are designated or only some. K.S.A. 8-147 defines the serial as three
202
+ letters and three numerals and says nothing about county letters, which suggests
203
+ but does not establish that the designator is a SEPARATE plate element rather than
204
+ part of the serial. The Kansas Department of Revenue site, which would settle it,
205
+ timed out on every attempt. NOTHING IS ASSERTED — this is exactly the decode data
206
+ the parse API would lie with if it were guessed.
207
+ decode_file_planned: "plates/_decode/us-ks-county-designations.yml once the mechanism and the mapping are sourced"
208
+ sources:
209
+ - "https://www.ksrevisor.gov/statutes/chapters/ch08/008_001_0047.html # K.S.A. 8-147(c): the three-letters-then-three-numerals arrangement, the exhaustion clause, uniformity per classification, the grouping discretion, the contrast rule and the expiration decals; (d) the full reflective coating, its $0.50 charge and the mandatory colour change on each reissue; (b) manufacture under a K.S.A. 39-1208 contract; (e) shipping to the county treasurer or, for digitally fulfilled orders, to the customer. History: L. 2025, ch. 75, § 6"
210
+ - "https://www.ksrevisor.gov/statutes/chapters/ch08/008_001_0032.html # K.S.A. 8-132(a): one plate bearing the registration number, state name and year; (b) the five-year reissue cycle from 1975, the intervening decals, and the director's rules-based one-year-at-a-time extension with its three-registration-year grace; (d) 'the letters required to designate the county in which such vehicle is registered'"
211
+ - "https://www.aamva.org/getmedia/646bcc8a-219b-47d8-b5cd-726240473163/License-Plate-Standard-Edition-3_September-2025-Update.pdf # AAMVA Ed.3 §1.1, the 7-10 year recommendation Kansas's nominal five sits inside and its extension mechanism can exceed"
212
+ notes: >-
213
+ KANSAS STANDARD ISSUE. THE ID IS DELIBERATELY UNDATED, on the same reasoning as
214
+ us-fl-standard: Kansas reissues on a five-year cycle that the director may extend
215
+ indefinitely by rule, so base-design generations exist but no primary establishing
216
+ their boundaries was obtained, and the Department of Revenue site was unreachable.
217
+ Minting a dated id on an inferred five-year step would be inventing a boundary the
218
+ statute expressly allows the director to move. When a primary lands, a dated id is
219
+ added and this id becomes its former-id alias under the PRD-QUALITY I-5/I-6 contract.
220
+ PERIOD CAVEAT: `start: 2025` is the statute edition read — K.S.A. 8-147 was amended
221
+ in the 2025 session — and is an UPPER BOUND on the true start of the current base,
222
+ not a claim about it. THE ONE SERIES BACK IS A RECORDED GAP for the same reason.
223
+
224
+ # =========================================================================
225
+ # PERSONALIZED — statutory caps, and the one Kansas plate that may lawfully be
226
+ # displayed on the front of a car.
227
+ # =========================================================================
228
+ - id: us-ks-personalized
229
+ class: personalized
230
+ categories: [car, truck, motorcycle]
231
+ period: { start: 2025 }
232
+ period_evidence: instrument-in-force-upper-bound
233
+ matching: strict
234
+ format:
235
+ pattern: "LLLLLLL"
236
+ regex: '\A[A-Z]{1,7}\z'
237
+ regex_statutory: '\A[A-Z0-9]{1,7}\z'
238
+ charset:
239
+ notes: >-
240
+ K.S.A. 8-132(d), verbatim: 'The division shall design distinctive, personalized
241
+ license plates to be issued that shall contain not more than seven letters or
242
+ numbers on truck or passenger vehicle license plates and not more than five
243
+ letters or numbers on motorcycle license plates, or a combination thereof, to be
244
+ designated by the applicant in lieu of the letters and numbers required by
245
+ K.S.A. 8-147 ... other than the letters required to designate the county in which
246
+ such vehicle is registered.' Note the personalized cap of SEVEN exceeds the
247
+ standard series' SIX — a Kansas vanity plate can be longer than a Kansas
248
+ standard plate.
249
+ pattern_note: "`regex` is the letters-only shape most vanity configurations take; `regex_statutory` is the true statutory frame of up to seven alphanumerics. The five-character motorcycle cap is a narrower bound not separately encoded."
250
+ availability_rule: "§ 8-132(d): the requested characters are issued 'Unless the letters or numbers designated by the applicant have been assigned to another vehicle' or are otherwise unavailable"
251
+ design:
252
+ note: "§ 8-132(c): 'Any license plate issued pursuant to subsection (a) or (b) may be a personalized license plate' and 'The division shall allow an applicant for a personalized license plate to personalize a license plate design established by subsection (a), (b) or (d)' — so personalization is a serial-source difference over an existing design, not a design of its own"
253
+ emblem: { present: true, rendered: placeholder }
254
+ eligibility: "any owner or lessee of a passenger vehicle, or of a truck licensed for a gross weight of not more than 20,000 pounds, applying at renewal of registration; also available for motorcycles (§ 8-132(d))"
255
+ fee: "$40.00 in addition to the ordinary registration fee, paid ONCE during the registration period for which the plates were issued; subsequent renewals within that period pay only the K.S.A. 8-143 registration fee (§ 8-132(d))"
256
+ display_privilege: "a personalized plate issued under § 8-132(c) MAY be attached to the front of the passenger vehicle or truck (§ 8-133(b)(3)) — an exception to Kansas's express prohibition on front plates"
257
+ region_encoding: "the county-designating letters are expressly PRESERVED on a personalized plate (§ 8-132(d)); see region_encoding on us-ks-standard for why their form is unresolved"
258
+ sources:
259
+ - "https://www.ksrevisor.gov/statutes/chapters/ch08/008_001_0032.html # K.S.A. 8-132(c): personalization of any subsection (a), (b) or (d) design; (d) the seven-character passenger/truck cap, the five-character motorcycle cap, the 20,000 lb truck eligibility limit, the $40 once-per-period fee, the availability rule, and the preservation of the county-designating letters"
260
+ - "https://www.ksrevisor.gov/statutes/chapters/ch08/008_001_0033.html # K.S.A. 8-133(b)(3): a personalized plate may be attached to the front of a passenger vehicle or truck"
261
+ notes: >-
262
+ PERSONALIZED PLATES. Modelled as its own series because the SERIAL SOURCE differs —
263
+ owner-chosen rather than division-assigned. Two Kansas oddities are worth carrying
264
+ forward. First, the personalized cap (seven) is LONGER than the standard arrangement
265
+ (six), so a length test alone cannot reject a Kansas plate. Second, a personalized
266
+ plate is one of only five things Kansas permits on the front of a vehicle, in a state
267
+ that otherwise forbids front plates outright — so front-plate presence is not
268
+ evidence of an out-of-state vehicle in Kansas.
269
+
270
+ # =========================================================================
271
+ # ANTIQUE — model-year plates, and the only other Kansas front-display licence.
272
+ # =========================================================================
273
+ - id: us-ks-antique
274
+ class: historic
275
+ categories: [car, truck]
276
+ period: { start: 2025 }
277
+ period_evidence: instrument-in-force-upper-bound
278
+ matching: recall-only
279
+ format:
280
+ pattern: "999999"
281
+ regex: '\A[A-Z0-9]{1,7}\z'
282
+ pattern_note: >-
283
+ REPRESENTATIVE SHAPE ONLY. A Kansas antique vehicle may display a MODEL-YEAR
284
+ plate under K.S.A. 8-172 — i.e. an actual plate from the vehicle's model year —
285
+ so this series has no grammar of its own at all: its serial space is the union of
286
+ every historical Kansas series. `matching: recall-only` is mandatory and a hit is
287
+ a shape hit only. K.S.A. 8-172 itself was not read in this pass (recorded gap);
288
+ the model-year regime is sourced only through the § 8-133(b)(2) cross-reference.
289
+ design:
290
+ note: "a model-year plate is an original historical plate, not a modern issue; no current design property applies"
291
+ emblem: { present: true, rendered: placeholder }
292
+ display_privilege: "§ 8-133(b)(2): 'a model year license plate issued for an antique vehicle, in accordance with K.S.A. 8-172 ... may be attached to the front of the antique vehicle'"
293
+ region_encoding: "unknown — a model-year plate carries whatever county designation its own era used"
294
+ sources:
295
+ - "https://www.ksrevisor.gov/statutes/chapters/ch08/008_001_0033.html # K.S.A. 8-133(b)(2): the model-year antique plate and its front-display permission, cross-referencing K.S.A. 8-172"
296
+ notes: >-
297
+ ANTIQUE / MODEL-YEAR PLATES. Included because of what it does to the parse layer
298
+ rather than for its own sake: like North Dakota's year-of-manufacture option, a
299
+ Kansas model-year plate means a LAWFULLY DISPLAYED, CURRENTLY REGISTERED vehicle may
300
+ be wearing a plate from any past decade. Any inference from plate design to
301
+ registration era must therefore carry an antique-regime exception, and this series
302
+ exists partly to make that exception visible in the data. K.S.A. 8-172's own
303
+ eligibility threshold and fee were not obtained (recorded gap).
304
+
305
+ # =========================================================================
306
+ # SPECIALTY — THE PROGRAM INDEX, per PRD-PLATES §2.5.
307
+ # =========================================================================
308
+ - id: us-ks-specialty-index
309
+ class: specialty
310
+ categories: [car, truck, motorcycle]
311
+ period: { start: 2025 }
312
+ period_evidence: instrument-in-force-upper-bound
313
+ matching: strict
314
+ format:
315
+ pattern: "LLL 999"
316
+ regex: '\A[A-Z]{3} ?\d{3}\z'
317
+ regex_statutory: '\A[A-Z0-9](?: ?[A-Z0-9])*\z'
318
+ charset: { notes: "K.S.A. 8-147(c) requires the arrangement to be 'uniform throughout each classification of registration', so a specialty classification has ITS OWN uniform arrangement, which need not be the passenger three-and-three; the arrangement per specialty class was not obtained (recorded gap)" }
319
+ design:
320
+ note: "one design per authorised program; the designs themselves are L4 scope (PRD-PLATES §2.5) and none is described here"
321
+ emblem: { present: true, rendered: placeholder }
322
+ program_index:
323
+ count_official: null
324
+ count_status: >-
325
+ NOT ESTABLISHED — AND THE HONEST RECORD IS THAT NO NUMBER WAS OBTAINED, not a
326
+ number carried over from a secondary source. The Kansas Department of Revenue's
327
+ vehicle pages (ksrevenue.gov) TIMED OUT on every request in this pass, via two
328
+ clients and both HTTP versions, so neither an official count nor an official
329
+ catalogue was reached. Kansas's specialty plates are created individually by
330
+ statute across K.S.A. Chapter 8 Article 1, so a statutory count is obtainable in
331
+ principle by enumerating those sections the way this file's North Dakota
332
+ counterpart does — that enumeration was not completed here and is the top Kansas
333
+ follow-up.
334
+ structural_note: "K.S.A. 8-147(c) opens 'Except as authorized by other provisions of law', which is the hook every individually legislated Kansas specialty plate hangs from — the general format rule yields to each specialty statute"
335
+ official_list_url: "https://www.ksrevenue.gov/dovindex.html"
336
+ official_list_status: "UNREACHABLE in this pass (connection timeout); recorded so a later run does not mistake it for unfetched-but-fine"
337
+ region_encoding: "county-designating letters presumably preserved as on the standard series; not separately established"
338
+ sources:
339
+ - "https://www.ksrevisor.gov/statutes/chapters/ch08/008_001_0047.html # K.S.A. 8-147(c): 'Except as authorized by other provisions of law' — the clause under which individually legislated Kansas specialty plates displace the general arrangement, and the per-classification uniformity rule"
340
+ - "https://www.ksrevisor.gov/statutes/chapters/ch08/008_001_0032.html # K.S.A. 8-132(c): specialty and standard designs alike may be personalized, which is what makes the specialty serial space share the personalized caps"
341
+ notes: >-
342
+ THE SPECIALTY PROGRAM INDEX — present as required by PRD-PLATES §2.5, but CARRYING NO
343
+ COUNT, which is the honest outcome for Kansas in this pass. Every other state in
344
+ group midwest-b yielded either an agency figure or a statutory enumeration; Kansas
345
+ yielded neither, because its revenue department's site was unreachable and the
346
+ statutory enumeration was not completed. Recording `count_official: null` with an
347
+ explicit `count_status` is better than importing Wikipedia's figure and better than
348
+ silence: a verifier can see precisely what is missing and precisely why. The
349
+ structural fact that IS sourced — that Kansas specialty plates are individually
350
+ legislated and displace the general format rule via 8-147(c)'s opening words — is
351
+ the more useful half for the parse layer anyway.