vehicles 0.4.1 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (189) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop_todo.yml +164 -0
  3. data/CHANGELOG.md +321 -0
  4. data/README.md +88 -15
  5. data/data/PROVENANCE-vehicles.md +12 -0
  6. data/data/plates/PROVENANCE.md +10 -0
  7. data/data/plates/_decode/at-districts.yml +287 -0
  8. data/data/plates/_decode/ch-cantons.yml +110 -0
  9. data/data/plates/_decode/cn-issuing-offices.yml +463 -0
  10. data/data/plates/_decode/cn-provinces.yml +614 -0
  11. data/data/plates/_decode/cz-kraj.yml +159 -0
  12. data/data/plates/_decode/dk-serial-blocks.yml +327 -0
  13. data/data/plates/_decode/es-provinces.yml +116 -0
  14. data/data/plates/_decode/fr-departements.yml +191 -0
  15. data/data/plates/_decode/gb-age-identifiers.yml +170 -0
  16. data/data/plates/_decode/gb-memory-tags.yml +202 -0
  17. data/data/plates/_decode/gr-prefectures.yml +1408 -0
  18. data/data/plates/_decode/hr-cities.yml +315 -0
  19. data/data/plates/_decode/ie-counties.yml +227 -0
  20. data/data/plates/_decode/in-state-codes.yml +169 -0
  21. data/data/plates/_decode/is-districts-1938.yml +116 -0
  22. data/data/plates/_decode/it-provinces.yml +348 -0
  23. data/data/plates/_decode/jp-office-marks.yml +960 -0
  24. data/data/plates/_decode/jp-use-marks.yml +205 -0
  25. data/data/plates/_decode/kr-authority-marks.yml +146 -0
  26. data/data/plates/_decode/kr-use-syllables.yml +194 -0
  27. data/data/plates/_decode/lu-series-order.yml +638 -0
  28. data/data/plates/_decode/mx-entity-series.yml +380 -0
  29. data/data/plates/_decode/my-index-marks.yml +271 -0
  30. data/data/plates/_decode/no-counties-1913.yml +148 -0
  31. data/data/plates/_decode/no-districts.yml +901 -0
  32. data/data/plates/_decode/pl-powiats.yml +567 -0
  33. data/data/plates/_decode/pt-trailer-services.yml +96 -0
  34. data/data/plates/_decode/ro-counties.yml +213 -0
  35. data/data/plates/_decode/se-diplomatic.yml +220 -0
  36. data/data/plates/_decode/si-regions.yml +123 -0
  37. data/data/plates/_decode/sk-districts.yml +314 -0
  38. data/data/plates/_decode/th-registration-elements.yml +208 -0
  39. data/data/plates/_decode/ua-regions.yml +393 -0
  40. data/data/plates/_decode/za-licence-marks.yml +215 -0
  41. data/data/plates/_meta/classes.yml +26 -0
  42. data/data/plates/_meta/separators.yml +102 -0
  43. data/data/plates/ad.yml +961 -0
  44. data/data/plates/ar.yml +762 -0
  45. data/data/plates/at.yml +1424 -0
  46. data/data/plates/au-act.yml +472 -0
  47. data/data/plates/au-nsw.yml +282 -0
  48. data/data/plates/au-nt.yml +431 -0
  49. data/data/plates/au-qld.yml +272 -0
  50. data/data/plates/au-sa.yml +248 -0
  51. data/data/plates/au-tas.yml +302 -0
  52. data/data/plates/au-vic.yml +215 -0
  53. data/data/plates/au-wa.yml +309 -0
  54. data/data/plates/be.yml +1840 -0
  55. data/data/plates/br.yml +1152 -0
  56. data/data/plates/ca-ab.yml +430 -0
  57. data/data/plates/ca-bc.yml +697 -0
  58. data/data/plates/ca-mb.yml +499 -0
  59. data/data/plates/ca-nb.yml +537 -0
  60. data/data/plates/ca-nl.yml +743 -0
  61. data/data/plates/ca-ns.yml +808 -0
  62. data/data/plates/ca-nt.yml +610 -0
  63. data/data/plates/ca-nu.yml +280 -0
  64. data/data/plates/ca-on.yml +881 -0
  65. data/data/plates/ca-pe.yml +592 -0
  66. data/data/plates/ca-qc.yml +1036 -0
  67. data/data/plates/ca-sk.yml +256 -0
  68. data/data/plates/ca-yt.yml +656 -0
  69. data/data/plates/ch.yml +1273 -0
  70. data/data/plates/cn.yml +1431 -0
  71. data/data/plates/cy.yml +688 -0
  72. data/data/plates/cz.yml +1179 -0
  73. data/data/plates/de.yml +1107 -0
  74. data/data/plates/dk.yml +1647 -0
  75. data/data/plates/ee.yml +1275 -0
  76. data/data/plates/es.yml +888 -0
  77. data/data/plates/fi.yml +1271 -0
  78. data/data/plates/fr.yml +1265 -0
  79. data/data/plates/gb.yml +1188 -0
  80. data/data/plates/gr.yml +721 -0
  81. data/data/plates/hr.yml +860 -0
  82. data/data/plates/hu.yml +959 -0
  83. data/data/plates/ie.yml +775 -0
  84. data/data/plates/in.yml +1172 -0
  85. data/data/plates/is.yml +667 -0
  86. data/data/plates/it.yml +1317 -0
  87. data/data/plates/jp.yml +3650 -0
  88. data/data/plates/kr.yml +1375 -0
  89. data/data/plates/li.yml +1010 -0
  90. data/data/plates/lt.yml +879 -0
  91. data/data/plates/lu.yml +842 -0
  92. data/data/plates/lv.yml +924 -0
  93. data/data/plates/mc.yml +1024 -0
  94. data/data/plates/mt.yml +854 -0
  95. data/data/plates/mx.yml +1372 -0
  96. data/data/plates/my.yml +685 -0
  97. data/data/plates/nl.yml +1016 -0
  98. data/data/plates/no.yml +1018 -0
  99. data/data/plates/nz.yml +1699 -0
  100. data/data/plates/pl.yml +1296 -0
  101. data/data/plates/pt.yml +847 -0
  102. data/data/plates/ro.yml +785 -0
  103. data/data/plates/se.yml +1091 -0
  104. data/data/plates/si.yml +1105 -0
  105. data/data/plates/sk.yml +1439 -0
  106. data/data/plates/sm.yml +1119 -0
  107. data/data/plates/th.yml +1150 -0
  108. data/data/plates/ua.yml +1672 -0
  109. data/data/plates/us-ak.yml +763 -0
  110. data/data/plates/us-al.yml +457 -0
  111. data/data/plates/us-ar.yml +427 -0
  112. data/data/plates/us-as.yml +454 -0
  113. data/data/plates/us-az.yml +430 -0
  114. data/data/plates/us-ca.yml +892 -0
  115. data/data/plates/us-co.yml +452 -0
  116. data/data/plates/us-ct.yml +427 -0
  117. data/data/plates/us-dc.yml +614 -0
  118. data/data/plates/us-de.yml +551 -0
  119. data/data/plates/us-fl.yml +741 -0
  120. data/data/plates/us-ga.yml +644 -0
  121. data/data/plates/us-gu.yml +658 -0
  122. data/data/plates/us-hi.yml +585 -0
  123. data/data/plates/us-ia.yml +438 -0
  124. data/data/plates/us-id.yml +531 -0
  125. data/data/plates/us-il.yml +516 -0
  126. data/data/plates/us-in.yml +324 -0
  127. data/data/plates/us-ks.yml +351 -0
  128. data/data/plates/us-ky.yml +770 -0
  129. data/data/plates/us-la.yml +568 -0
  130. data/data/plates/us-ma.yml +379 -0
  131. data/data/plates/us-md.yml +536 -0
  132. data/data/plates/us-me.yml +445 -0
  133. data/data/plates/us-mi.yml +408 -0
  134. data/data/plates/us-mn.yml +411 -0
  135. data/data/plates/us-mo.yml +356 -0
  136. data/data/plates/us-mp.yml +402 -0
  137. data/data/plates/us-ms.yml +432 -0
  138. data/data/plates/us-mt.yml +619 -0
  139. data/data/plates/us-nc.yml +602 -0
  140. data/data/plates/us-nd.yml +419 -0
  141. data/data/plates/us-ne.yml +483 -0
  142. data/data/plates/us-nh.yml +394 -0
  143. data/data/plates/us-nj.yml +547 -0
  144. data/data/plates/us-nm.yml +574 -0
  145. data/data/plates/us-nv.yml +655 -0
  146. data/data/plates/us-ny.yml +592 -0
  147. data/data/plates/us-oh.yml +404 -0
  148. data/data/plates/us-ok.yml +513 -0
  149. data/data/plates/us-or.yml +392 -0
  150. data/data/plates/us-pa.yml +506 -0
  151. data/data/plates/us-pr.yml +507 -0
  152. data/data/plates/us-ri.yml +445 -0
  153. data/data/plates/us-sc.yml +605 -0
  154. data/data/plates/us-sd.yml +428 -0
  155. data/data/plates/us-tn.yml +471 -0
  156. data/data/plates/us-tx.yml +535 -0
  157. data/data/plates/us-ut.yml +384 -0
  158. data/data/plates/us-va.yml +567 -0
  159. data/data/plates/us-vi.yml +489 -0
  160. data/data/plates/us-vt.yml +458 -0
  161. data/data/plates/us-wa.yml +484 -0
  162. data/data/plates/us-wi.yml +509 -0
  163. data/data/plates/us-wv.yml +446 -0
  164. data/data/plates/us-wy.yml +523 -0
  165. data/data/plates/va.yml +604 -0
  166. data/data/plates/za.yml +1141 -0
  167. data/data/vehicles.json +160653 -105090
  168. data/lib/vehicles/configuration.rb +18 -2
  169. data/lib/vehicles/dataset.rb +73 -18
  170. data/lib/vehicles/fuzzy.rb +115 -0
  171. data/lib/vehicles/http.rb +48 -0
  172. data/lib/vehicles/make.rb +36 -6
  173. data/lib/vehicles/mcp_server.rb +5 -5
  174. data/lib/vehicles/model.rb +42 -6
  175. data/lib/vehicles/plates/jurisdiction.rb +32 -0
  176. data/lib/vehicles/plates/series.rb +291 -0
  177. data/lib/vehicles/plates/template_fill.rb +188 -0
  178. data/lib/vehicles/plates/templates.rb +162 -0
  179. data/lib/vehicles/plates.rb +122 -0
  180. data/lib/vehicles/providers/hosted_provider.rb +49 -58
  181. data/lib/vehicles/providers/local_provider.rb +4 -3
  182. data/lib/vehicles/validators/vehicle_make_validator.rb +3 -1
  183. data/lib/vehicles/validators/vehicle_model_validator.rb +1 -1
  184. data/lib/vehicles/version.rb +1 -1
  185. data/lib/vehicles.rb +53 -16
  186. data/rakelib/data_refresh.rake +109 -0
  187. data/rakelib/plates_refresh.rake +29 -0
  188. data/sig/vehicles.rbs +18 -0
  189. metadata +174 -2
@@ -0,0 +1,419 @@
1
+ # plates/us-nd.yml — North Dakota (PRD-PLATES gate L2, group midwest-b).
2
+ #
3
+ # NORTH DAKOTA IS THE BEST-SOURCED STATE IN THIS GROUP, and it is worth saying
4
+ # why: NDDOT publishes, on its own license-plate page, a prose specification of
5
+ # the standard plate that names the INTRODUCTION MONTH, the SERIAL FORMAT and
6
+ # every design element. That is rare. Most states publish images and leave the
7
+ # facts to be inferred; North Dakota wrote them down. Consequently `us-nd-standard-2016`
8
+ # carries `period_evidence: agency-stated-date` rather than the
9
+ # instrument-in-force upper bound that the rest of this group is stuck with.
10
+ #
11
+ # THE SECOND NORTH DAKOTA GIFT is that the legislature specified plate CONTENT
12
+ # in the Century Code: § 39-04-12 mandates the slogan "Peace Garden State" in
13
+ # terms, and § 39-04-10.18 fixes the blackout plate's colours as VALUES ("a
14
+ # solid black background" / "white numbers and letters"). Statutory colour
15
+ # VALUES are unusual — Florida's legislature specified only that historic plates
16
+ # be "of a distinguishing color" and named none. So `us-nd-blackout` is the only
17
+ # series in this group whose hexes are `hex_basis: statute`.
18
+ #
19
+ # SOURCING RULE APPLIED HERE (PRD-PLATES §4): edicts of government are public
20
+ # domain at every level, so every content, display, reflectorization and class
21
+ # claim below cites the North Dakota Century Code. The NDDOT page is cited only
22
+ # for what the Code does not carry: the current base design, its introduction
23
+ # date and its serial arrangement.
24
+ jurisdiction: us-nd
25
+ authority:
26
+ name: North Dakota Department of Transportation (NDDOT), Motor Vehicle Division
27
+ url: "https://www.dot.nd.gov/motor-vehicle/license-plates"
28
+ binding: vehicle
29
+ statute_edition: "North Dakota Century Code Title 39, Chapter 39-04 (Motor Vehicles — Registration), chapter text as published by the North Dakota Legislative Branch at ndlegis.gov and fetched for this pass"
30
+
31
+ # ---------------------------------------------------------------------------
32
+ # artwork_risk — required per jurisdiction by PRD-PLATES §4.
33
+ # ---------------------------------------------------------------------------
34
+ artwork_risk:
35
+ posture: unresearched
36
+ basis: >-
37
+ NORTH DAKOTA WAS NOT LOCATED IN ANY COPYRIGHT SURVEY READ FOR THIS PASS. The
38
+ Wikipedia survey of subnational-government copyright status that the US dossier
39
+ treats as its core analysis carries per-state sections for Arizona, California,
40
+ Colorado, Florida, Georgia, Indiana, Massachusetts, Minnesota, Missouri, New
41
+ Jersey, New York, North Carolina, Pennsylvania, Rhode Island, South Carolina,
42
+ Utah and Washington — and NO section for North Dakota. No {{PD-NDGov}} tag was
43
+ found on Commons. Therefore the DEFAULT stated in the dossier governs: 17 U.S.C.
44
+ § 105 does not reach the states, so a state plate design is presumed COPYRIGHTED
45
+ unless that state says otherwise, and North Dakota has not been shown to say
46
+ otherwise. Recorded as unresearched rather than as either PD or adverse, because
47
+ absence of a fetched source is weak evidence in both directions.
48
+ edict_carve_out: >-
49
+ THE PART THAT IS AFFIRMATIVELY CLEAN. Whatever North Dakota's posture on plate
50
+ ARTWORK, the plate's mandated elements live in the Century Code — the "Peace
51
+ Garden State" slogan (§ 39-04-12), the reflectorization duty (§ 39-04-12), and the
52
+ blackout plate's black ground and white characters (§ 39-04-10.18). Edicts of
53
+ government are uncopyrightable at every level ({{PD-US-GovEdict}}), so those
54
+ specifications are freely usable EVEN IF the Badlands/bison artwork is not. This
55
+ is the cleanest legal path the dossier identifies and this file walks it.
56
+ emblem_rule: >-
57
+ PRD-PLATES §3's placeholder default applies to the BISON, the BADLANDS scene and
58
+ the THREE WHEAT STALKS. These are pictorial artwork described by NDDOT in prose,
59
+ not drawn in any statutory instrument, so nothing about them is cleared. Render
60
+ `emblem: {present: true, rendered: placeholder}`. State-seal misuse statutes are a
61
+ protection regime independent of copyright and are unresearched for North Dakota.
62
+ sources:
63
+ - "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 North Dakota has NO section in the survey — a negative result, recorded as such"
64
+ - "https://www.dot.nd.gov/motor-vehicle/license-plates # NDDOT's own description of the artwork whose status is unresearched"
65
+
66
+ # ---------------------------------------------------------------------------
67
+ # The US standards chain. Voluntary, no federal mandate; the SAE J686 delegation
68
+ # trap is recorded once per jurisdiction file so each file stands alone.
69
+ # ---------------------------------------------------------------------------
70
+ us_standards:
71
+ no_federal_mandate: true
72
+ chain: "SAE J686 -> AAMVA License Plate Standard Edition 3 (September 2025) -> voluntary state adoption. AAMVA writes recommendations in the declarative present; they must be read as RECOMMENDED PRACTICE, not requirement."
73
+ dimensions_delegated: "AAMVA §3.1 sends dimensions and bolt holes to SAE J686, whose own text is PAYWALLED and UNPINNED. No J686 dimension is quoted anywhere in this file."
74
+ 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) are the renderable geometry this dataset may use."
75
+ retroreflectivity: "AAMVA §3.3: legible in daylight and at 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."
76
+ replacement_cycle_recommendation: "AAMVA §1.1 recommends a rolling or full replacement cycle not to exceed 7 to 10 years. North Dakota legislates NO replacement cycle at all — see replacement_cycle on us-nd-standard-2016."
77
+ source: "https://www.aamva.org/getmedia/646bcc8a-219b-47d8-b5cd-726240473163/License-Plate-Standard-Edition-3_September-2025-Update.pdf"
78
+ folklore_caution: >-
79
+ The "1956 AMA standardization agreement" commonly said to have fixed the 6x12 inch
80
+ plate is UNCITED in its Wikipedia source (a `citation needed` since 2017, copied
81
+ across articles — circular). It is recorded as COMMONLY REPEATED, UNSOURCED. North
82
+ Dakota's Century Code states no plate dimension at all, so this file makes no
83
+ dimension claim for North Dakota either (recorded gap).
84
+
85
+ # ---------------------------------------------------------------------------
86
+ # Display rules. North Dakota is a TWO-PLATE state with an unusual inversion for
87
+ # apportioned vehicles and truck tractors.
88
+ # ---------------------------------------------------------------------------
89
+ display_rules:
90
+ default: "TWO plates, front and rear. § 39-04-11: an individual may not operate a vehicle unless it has 'two number plates, bearing the distinctive number conspicuously displayed, horizontally and in an upright position, one on the front and one on the rear of the vehicle, each securely fastened'."
91
+ rear_only:
92
+ - "housetrailer: plates 'must be attached to the rear of the housetrailer' (§ 39-04-11)"
93
+ - "motorcycle and trailer: 'must be attached to the rear ... and may be displayed vertically' — North Dakota expressly permits VERTICAL display for these two classes, which most states do not (§ 39-04-11)"
94
+ single_plate_inversion: "§ 39-04-11: when only ONE plate is furnished for an apportioned vehicle registered under the International Registration Plan (§ 39-19-04) or a truck tractor, 'the plate must be attached to the front' — and for a semitrailer, the rear. A front-only plate in a two-plate state is the same outlier shape Florida has for truck tractors."
95
+ mounting: "§ 39-04-11: the bottom of each plate not less than twelve inches [30.48 cm] above the level surface on which the vehicle stands; mounted visibly so as to clearly display the number and the state name; kept free of mud, ice or snow 'as far as is reasonably possible' — a winter-state qualification worth noticing"
96
+ old_plates: "§ 39-04-11: all number plates, markers or evidence of registration except for the current year must be REMOVED from the vehicle"
97
+ ownership: "§ 39-04-11: 'All vehicle license plates issued by the department are the property of the department for the period for which the plates are valid' — the plate is state property, not the registrant's"
98
+ temporary_permit: "§ 39-04-11: a temporary registration permit from NDDOT or a licensed dealer is displayed on the rear window, the rearmost driver's-side window, or in the rear plate location, clearly visible and unobstructed"
99
+ sources:
100
+ - "https://ndlegis.gov/cencode/t39c04.pdf # NDCC § 39-04-11: two plates front and rear; housetrailer/motorcycle/trailer rear-only and vertical display; the apportioned/truck-tractor FRONT-only and semitrailer rear inversion; 12-inch mounting height; mud/ice/snow duty; removal of prior-year plates; plates are department property; temporary permit placement"
101
+
102
+ series:
103
+
104
+ # =========================================================================
105
+ # THE STANDARD-ISSUE SERIES — and the only series in group midwest-b with a
106
+ # month-precise, agency-stated introduction date.
107
+ # =========================================================================
108
+ - id: us-nd-standard-2016
109
+ class: standard
110
+ categories: [car, van, truck, bus]
111
+ period: { start: 2016 }
112
+ period_evidence: agency-stated-date
113
+ matching: strict
114
+ format:
115
+ pattern: "999 LLL"
116
+ regex: '\A\d{3} ?[A-Z]{3}\z'
117
+ regex_statutory: '\A[A-Z0-9](?: ?[A-Z0-9])*\z'
118
+ charset:
119
+ notes: >-
120
+ § 39-04-12(1) is the whole statutory constraint on the serial: the plate bears
121
+ 'a distinctive number for assignment to each vehicle', and 'the distinctive
122
+ number may be in figures or a combination of figures and letters and must be of
123
+ a size clearly distinguishable by law enforcement officers and individuals
124
+ generally'. NO WIDTH, NO ARRANGEMENT AND NO EXCLUDED LETTERS are stated
125
+ anywhere in Chapter 39-04. Whether North Dakota skips I/O/Q in the letter
126
+ group — as many states do — was NOT established (recorded gap).
127
+ pattern_note: >-
128
+ `regex` encodes the arrangement NDDOT states in its own words: 'The serial format
129
+ follows a "123 ABC" pattern.' `regex_statutory` encodes the outer bound the
130
+ Century Code actually permits (any figures, or any combination of figures and
131
+ letters, of unstated width) and is the honest bound for a North Dakota plate of
132
+ unknown vintage.
133
+ progression: "not established (recorded gap) — NDDOT states the format but not the issuing order"
134
+ design:
135
+ plate_dimension_note: >-
136
+ NORTH DAKOTA LEGISLATES NO PLATE DIMENSION. Chapter 39-04 states none, and this
137
+ file will not import the 6x12 inch convention from the uncited 1956 folklore or
138
+ from SAE J686, whose text is unpinned. Recorded gap.
139
+ material: "reflective aluminum (NDDOT); § 39-04-12(1) requires plates to be 'of metal or other suitable material' and 'treated with a reflectorized material according to the specifications prescribed by the department'"
140
+ legibility: "§ 39-04-12(1): 'To reduce highway accidents at night all number plates and temporary registration permits must be legible for a minimum distance of one hundred feet [30.48 meters] to an approaching motorist by day or night with lawful headlight beams and without other illumination'"
141
+ legend_top: "Legendary"
142
+ legend_state: "North Dakota"
143
+ legend_bottom_left: "Peace Garden State"
144
+ legend_rule: >-
145
+ THE SLOGAN IS STATUTORY, WHICH IS UNUSUAL. § 39-04-12(1) requires number plates
146
+ to bear 'the name of the state, either in full or by abbreviation, the number of
147
+ the year, the slogan "Peace Garden State" and a distinctive number'. So "Peace
148
+ Garden State" is not a design choice the department could drop — it is mandated
149
+ text. "Legendary", by contrast, is a DEPARTMENTAL addition described only by
150
+ NDDOT and appearing in no instrument.
151
+ graphic:
152
+ present: true
153
+ rendered: placeholder
154
+ description: "NDDOT's own description: 'a scenic depiction of the state's Badlands, highlighted by a gradient sky transitioning from light blue to orange and yellow, symbolizing a sunrise. A bison stands prominently in the foreground ... while three wheat stalks flank the state's name'"
155
+ emblem: { present: true, rendered: placeholder }
156
+ colour_note: >-
157
+ NO HEX IS RECORDED FOR THIS SERIES, DELIBERATELY. NDDOT describes a GRADIENT sky
158
+ ('light blue to orange and yellow'), and a gradient is not a colour value — a
159
+ single background hex would be a fabrication, not an approximation. Neither the
160
+ Century Code nor NDDOT states a character colour. Both are recorded as gaps
161
+ rather than invented, which is why `background` and `foreground` are absent here
162
+ while the blackout series below carries statutory hexes.
163
+ band: { side: none }
164
+ rear_differs: false
165
+ replacement_cycle:
166
+ years: null
167
+ note: >-
168
+ NORTH DAKOTA LEGISLATES NO REPLACEMENT CYCLE. Chapter 39-04 contains no
169
+ counterpart to Florida's 10-year rule, South Dakota's seven-year redesign duty or
170
+ Kansas's five-year reissue cycle. § 39-04-12(1) instead provides for an annual
171
+ 'year plate, tab, or sticker'. The 2016 base has therefore run for a decade with
172
+ no statutory expiry, against AAMVA §1.1's recommended 7-10 year ceiling.
173
+ fleet_option: "§ 39-04-12(2): an owner of a fleet of 100 or more vehicles may be given plates valid for as many as SIX consecutive years, exempt from annual validation evidence, against a corporate surety bond"
174
+ region_encoding: none
175
+ sources:
176
+ - "https://www.dot.nd.gov/motor-vehicle/license-plates # NDDOT, verbatim: 'Introduced in November 2016'; the Badlands/gradient-sky/bison/three-wheat-stalks design; the slogans 'Legendary' above the state name and 'Peace Garden State' at the bottom left; 'The serial format follows a \"123 ABC\" pattern'; 'reflective aluminum'"
177
+ - "https://ndlegis.gov/cencode/t39c04.pdf # NDCC § 39-04-12(1): state name, year number, the MANDATED slogan 'Peace Garden State', the distinctive number in figures or figures-and-letters, the 100-foot legibility rule, reflectorized material, annual year plate/tab/sticker; § 39-04-12(2) the 100-vehicle fleet six-year plate"
178
+ - "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 replacement recommendation North Dakota has no counterpart to"
179
+ notes: >-
180
+ NORTH DAKOTA STANDARD ISSUE, THE 2016 BADLANDS BASE. The id is dated because the
181
+ date is real: NDDOT states 'Introduced in November 2016' on its own license-plate
182
+ page, so `period_evidence: agency-stated-date` and 2016 is a genuine claim rather
183
+ than the statute-edition upper bound the rest of this group carries. The month is
184
+ recorded here in prose because the runs shape takes integer years only.
185
+ THE ONE SERIES BACK IS A RECORDED GAP: NDDOT describes only the current base, the
186
+ Century Code is design-silent, and no primary establishing North Dakota's
187
+ pre-November-2016 base or its period was obtained. Rather than mint a series on an
188
+ enthusiast-site era table, it is omitted and recorded here — the L2 brief asks for
189
+ one series back where it can be sourced, not for a guess.
190
+
191
+ # =========================================================================
192
+ # BLACKOUT — the only series in group midwest-b with STATUTORY COLOUR VALUES.
193
+ # =========================================================================
194
+ - id: us-nd-blackout
195
+ class: specialty
196
+ categories: [car, truck, motorcycle]
197
+ period: { start: 2025 }
198
+ period_evidence: instrument-in-force-upper-bound
199
+ matching: strict
200
+ format:
201
+ pattern: "999 LLL"
202
+ regex: '\A\d{3} ?[A-Z]{3}\z'
203
+ regex_statutory: '\A[A-Z0-9](?: ?[A-Z0-9])*\z'
204
+ charset: { notes: "§ 39-04-10.18 fixes this plate's COLOURS and its eligibility but says nothing about its serial; the § 39-04-12(1) grammar therefore applies unchanged" }
205
+ pattern_note: >-
206
+ ARRANGEMENT INHERITED, NOT SEPARATELY SOURCED. NDDOT says the blackout plate
207
+ 'maintains all required plate elements such as registration decals and
208
+ identification numbers', which implies but does not state that it carries the
209
+ standard 123 ABC arrangement. The inheritance is recorded as an assumption here
210
+ and `regex_statutory` is the honest bound. Flagged as a gap.
211
+ design:
212
+ background: { color: "#000000", finish: retroreflective, hex_basis: statute }
213
+ foreground: "#FFFFFF"
214
+ colour_rule: >-
215
+ § 39-04-10.18(2), verbatim: 'Blackout number plates issued under this section must
216
+ have: a. A solid black background; and b. White numbers and letters.' THE
217
+ LEGISLATURE NAMED THE COLOUR VALUES. That is rare enough to be worth flagging —
218
+ contrast Florida, whose legislature required historic plates to be 'of a
219
+ distinguishing color' and named none, and contrast this file's own standard
220
+ series, whose colours are unrecorded because nobody official stated them. Black
221
+ and white are unambiguous as named colours, so these two hexes are the only
222
+ `hex_basis: statute` values in group midwest-b.
223
+ emblem: { present: false }
224
+ note: "NDDOT: 'The blackout design maintains all required plate elements such as registration decals and identification numbers, ensuring it meets legal standards'"
225
+ eligibility: "§ 39-04-10.18(3): the director may issue blackout plates ONLY to the owner of a passenger motor vehicle, a truck whose registered gross weight does not exceed 20,000 pounds [9071.85 kg], or a motorcycle"
226
+ fee: "$25.00 per registration period in addition to all other registration fees (§ 39-04-10.18(1))"
227
+ region_encoding: none
228
+ sources:
229
+ - "https://ndlegis.gov/cencode/t39c04.pdf # NDCC § 39-04-10.18: the $25 per-period fee; (2) 'a solid black background' and 'white numbers and letters'; (3) the passenger / <=20,000 lb truck / motorcycle eligibility limit"
230
+ - "https://www.dot.nd.gov/motor-vehicle/license-plates/blackout-plate # NDDOT: 'solid black background with crisp white lettering'; available for 'passenger cars, light trucks, and motorcycles'; 'Like other specialty plates, it comes with an additional fee'; the plate 'maintains all required plate elements'"
231
+ notes: >-
232
+ BLACKOUT PLATES. Two things make this series worth its own entry rather than a
233
+ colour sub-entry on the standard series. First, the colours differ AND they are
234
+ legislated, so under PRD-PLATES §2.3 the design difference is its own series and
235
+ the values are sourced to an edict. Second, the eligibility rule is a genuine
236
+ restriction — a truck over 20,000 lb registered gross weight cannot have one — so
237
+ the series scopes narrower than its jurisdiction default, which is exactly the
238
+ case `categories:` exists to carry.
239
+ PERIOD CAVEAT: `start: 2025` is an UPPER BOUND from the Century Code edition read,
240
+ not a real date. NDDOT calls the plate 'new' and 'long-awaited', so the true start
241
+ is recent, but the session law that added § 39-04-10.18 was not pinned in this pass
242
+ and the chapter text as published carries no source note. Recorded rather than
243
+ guessed. North Dakota and Iowa both run statutory blackout plates (Iowa Code
244
+ § 321.34(11C)) — a small Midwestern convergence worth noting for the encyclopedia.
245
+
246
+ # =========================================================================
247
+ # PERSONALIZED — the character caps are statutory and differ by vehicle type.
248
+ # =========================================================================
249
+ - id: us-nd-personalized
250
+ class: personalized
251
+ categories: [car, van, truck, trailer, motorcycle]
252
+ period: { start: 2025 }
253
+ period_evidence: instrument-in-force-upper-bound
254
+ matching: strict
255
+ format:
256
+ pattern: "LLLLLLL"
257
+ regex: '\A[A-Z]{1,7}\z'
258
+ regex_statutory: '\A[A-Z0-9]{1,7}\z'
259
+ charset:
260
+ notes: >-
261
+ § 39-04-10.3, verbatim: plates 'marked with not more than seven numerals,
262
+ letters, or combinations of numerals and letters'. For MOTORCYCLES the cap
263
+ drops: 'The special license plates for motorcycles may contain not more than
264
+ six numerals, letters, or a combination of not more than six numerals and
265
+ letters.' The statute also provides that 'A personal plate containing a
266
+ restricted character may not be renewed' — North Dakota's restricted-character
267
+ list itself is not in Chapter 39-04 and was not obtained (recorded gap).
268
+ pattern_note: "`regex` is the letters-only shape most vanity configurations take; `regex_statutory` is the true statutory frame (any mix of up to seven alphanumerics). The six-character motorcycle cap is a narrower bound not separately encoded."
269
+ design:
270
+ note: "personalization is a serial-source difference applied over the standard or an eligible specialty design; no distinct design is prescribed"
271
+ emblem: { present: true, rendered: placeholder }
272
+ fee: "$25.00 per registration period, waived where the plate is a gold star, military sacrifice or prisoner-of-war plate; a one-time $100.00 fee for vehicles registered as collector vehicles under § 39-04-10.6 (§ 39-04-10.3)"
273
+ transferable: "on sale or transfer the owner removes the plates (§ 39-04-36) and may transfer them to a replacement motor vehicle on payment of the transfer fee (§ 39-04-10.3)"
274
+ region_encoding: none
275
+ sources:
276
+ - "https://ndlegis.gov/cencode/t39c04.pdf # NDCC § 39-04-10.3: the seven-character cap, the six-character motorcycle cap, the $25 per-period fee and its gold-star/military-sacrifice/POW waivers, the $100 collector-vehicle one-time fee, the restricted-character non-renewal rule, availability for trailers/travel trailers/motorcycles, and transfer to a replacement vehicle"
277
+ notes: >-
278
+ PERSONALIZED PLATES. Modelled as its own series because the SERIAL SOURCE differs —
279
+ owner-chosen rather than department-assigned — which is a format property even
280
+ where the character frame is shared. North Dakota is one of the few states in this
281
+ group to legislate a SEPARATE, SMALLER cap for motorcycles (six rather than seven),
282
+ and to make a personalized plate available on PERMANENTLY registered collector
283
+ vehicles for a one-time fee, which is why the categories list includes trailers.
284
+
285
+ # =========================================================================
286
+ # ANTIQUE — a rolling forty-year threshold, permanent, and single-plate by an
287
+ # express override of the two-plate rule.
288
+ # =========================================================================
289
+ - id: us-nd-antique
290
+ class: historic
291
+ categories: [car, truck]
292
+ period: { start: 2025 }
293
+ period_evidence: instrument-in-force-upper-bound
294
+ matching: recall-only
295
+ format:
296
+ pattern: "999999"
297
+ regex: '\A[A-Z0-9]{1,7}\z'
298
+ pattern_note: >-
299
+ REPRESENTATIVE SHAPE ONLY. § 39-04-10.4(1) says the department 'shall design and
300
+ issue a distinctive number plate for this purpose' and specifies nothing about
301
+ the serial, so no arrangement is sourced. The regex is deliberately the wide
302
+ alphanumeric shape and `matching: recall-only` says so: a hit is a shape hit, not
303
+ a well-formedness claim for this series.
304
+ design:
305
+ note: "'a distinctive number plate' designed by the department (§ 39-04-10.4(1)); no colour, dimension or legend is stated in the Century Code"
306
+ emblem: { present: true, rendered: placeholder }
307
+ eligibility: "any motor vehicle AT LEAST FORTY YEARS OLD — a ROLLING threshold, so eligibility changes silently every year and this series needs re-auditing on a cadence that a fixed-cutoff regime would not"
308
+ validity: "permanently licensed on payment of a $10.00 registration fee (§ 39-04-10.4(1))"
309
+ year_of_manufacture_option: >-
310
+ § 39-04-10.4(1): in lieu of the distinctive plate the owner may, AT THE DIRECTOR'S
311
+ DISCRETION, display a number plate from the vehicle's year of manufacture — or, for
312
+ military vehicles, military identification numbers — provided it would not duplicate
313
+ a number in the department's records and is legible and restored to the department's
314
+ satisfaction. A year-of-manufacture regime means a lawfully displayed North Dakota
315
+ plate may belong to ANY historical series, which is a real trap for a parser: the
316
+ plate on the car is not evidence of the era of its registration.
317
+ display_override: "§ 39-04-10.4(1): 'Notwithstanding section 39-04-11, only one number plate needs to be displayed' — an express carve-out from the two-plate rule"
318
+ use_restriction: "vehicles registered under this section 'may not be used in the routine functions of a business or farming operation' (§ 39-04-10.4(1))"
319
+ region_encoding: none
320
+ sources:
321
+ - "https://ndlegis.gov/cencode/t39c04.pdf # NDCC § 39-04-10.4(1): the forty-year rolling threshold, the $10 permanent registration, the department-designed distinctive plate, the year-of-manufacture and military-identification alternative with its duplication and legibility conditions, the single-plate override of § 39-04-11, and the business/farming use restriction; (2) the permanent personalized-plate alternative at a one-time $100 fee"
322
+ notes: >-
323
+ ANTIQUE MOTOR VEHICLES. North Dakota sets its historic threshold by a ROLLING forty
324
+ years, the opposite design choice to Florida's fixed model-year-1945 Horseless
325
+ Carriage cutoff — and a plates dataset must model both, because only the rolling
326
+ kind silently changes eligibility every year and needs re-auditing. The
327
+ year-of-manufacture option is the more consequential fact for the parse layer: it
328
+ means a currently valid North Dakota registration can be displayed on a plate from
329
+ any past series, so a period inference drawn from plate DESIGN is unsafe for this
330
+ class of vehicle.
331
+
332
+ # =========================================================================
333
+ # MANUFACTURER / FACTORY REPRESENTATIVE — bound to a person and a role, not to
334
+ # a vehicle, which is why `binding` is overridden here.
335
+ # =========================================================================
336
+ - id: us-nd-manufacturer
337
+ class: dealer
338
+ categories: [car, van, truck]
339
+ period: { start: 2025 }
340
+ period_evidence: instrument-in-force-upper-bound
341
+ matching: recall-only
342
+ format:
343
+ pattern: "999999"
344
+ regex: '\A[A-Z0-9]{1,7}\z'
345
+ pattern_note: "REPRESENTATIVE SHAPE ONLY. § 39-04-10.1 says the plate 'must be designed by the director' and states no serial grammar at all; the regex is the wide alphanumeric shape and `matching: recall-only` marks it as a shape hit."
346
+ design:
347
+ note: "'designed by the director' (§ 39-04-10.1); no design property is stated in the Century Code"
348
+ emblem: { present: true, rendered: placeholder }
349
+ binding: business
350
+ eligibility: "a RESIDENT FACTORY REPRESENTATIVE of a motor vehicle manufacturer, for the single vehicle used in the course of that employment; separately, a manufacturer of motor vehicles may use a manufacturer plate on its DEMONSTRATION vehicles, issued in the manufacturer's name and used solely for demonstration by the registrant or its designated employees"
351
+ fee: "$150.00 for a twelve-month period, prorated monthly if procured mid-period; procurement is IN LIEU OF any other registration fee, sales tax or use tax on the vehicle (§ 39-04-10.1)"
352
+ region_encoding: none
353
+ sources:
354
+ - "https://ndlegis.gov/cencode/t39c04.pdf # NDCC § 39-04-10.1: the resident factory representative, the director-designed plate, the $150 twelve-month fee and monthly proration, the in-lieu-of-tax effect, the personal-use and single-vehicle restrictions, retention of the plate across replacement vehicles, and the separate manufacturer demonstration-vehicle entitlement"
355
+ notes: >-
356
+ MANUFACTURER PLATES. `binding: business` for the same reason as Germany's rote
357
+ Kennzeichen and Florida's dealer plate: the plate follows the representative or the
358
+ manufacturer, not a vehicle — § 39-04-10.1 says so twice, first by tying the plate
359
+ to the vehicle 'used by the factory representative in the course of employment' and
360
+ then by providing that on sale of that vehicle the plate is RETAINED and reused on
361
+ the replacement. CLASS CAVEAT: recorded as `dealer`, since _meta/classes.yml has no
362
+ `manufacturer` value and the dealer definition ('trade/garage plates bound to a
363
+ business, not a vehicle') fits the binding if not the trade — the same caveat
364
+ us-fl-manufacturer carries.
365
+
366
+ # =========================================================================
367
+ # SPECIALTY — THE PROGRAM INDEX, per PRD-PLATES §2.5. No individual designs.
368
+ # =========================================================================
369
+ - id: us-nd-specialty-index
370
+ class: specialty
371
+ categories: [car, van, truck, motorcycle]
372
+ period: { start: 2025 }
373
+ period_evidence: instrument-in-force-upper-bound
374
+ matching: strict
375
+ format:
376
+ pattern: "999 LLL"
377
+ regex: '\A\d{3} ?[A-Z]{3}\z'
378
+ regex_statutory: '\A[A-Z0-9](?: ?[A-Z0-9])*\z'
379
+ charset: { notes: "specialty plates carry ordinary serials on an alternative design; the § 39-04-12(1) grammar applies unchanged, and many North Dakota specialty series are additionally available personalized under § 39-04-10.3" }
380
+ design:
381
+ note: "one design per authorised program; the designs themselves are L4 scope (PRD-PLATES §2.5) and none is described here"
382
+ emblem: { present: true, rendered: placeholder }
383
+ program_index:
384
+ count_statutory: 18
385
+ count_basis: >-
386
+ COUNTED FROM THE STATUTE, NOT FROM A BROCHURE — which makes this one of the few
387
+ defensible specialty counts in the group. Chapter 39-04 authorises specialty and
388
+ special-purpose plate programs in eighteen numbered sections: § 39-04-10 (amateur
389
+ radio), 10.1 (manufacturer), 10.2 (mobility-impaired), 10.3 (personalized), 10.4
390
+ (antique), 10.5 (prisoner of war), 10.6 (collector), 10.7 (farm vehicles), 10.8
391
+ (national guard), 10.9 (law enforcement), 10.10 (North Dakota veterans), 10.11
392
+ (firefighter's association), 10.12 (Future Farmers of America foundation), 10.13
393
+ (public or nonprofit organization), 10.14 (gold star), 10.15 (patriotic), 10.16
394
+ (volunteer emergency responders), 10.17 (military sacrifice), 10.18 (blackout).
395
+ Note the count is of AUTHORISING SECTIONS, not of designs: § 39-04-10.13 alone is
396
+ an open-ended public-or-nonprofit-organization program that can carry many
397
+ designs, so the number of DESIGNS is strictly greater and was not obtained.
398
+ count_caveat: >-
399
+ NDDOT publishes no specialty-plate count and no consolidated catalogue was
400
+ located, so no agency figure exists to reconcile against the statutory count. The
401
+ discrepancy between 'authorising sections' and 'designs offered' is recorded, not
402
+ resolved (PRD-PLATES §5.3 — disagreements are recorded, never averaged).
403
+ official_list_url: "https://www.dot.nd.gov/motor-vehicle/license-plates"
404
+ organization_program: "§ 39-04-10.13 is the open-ended door: a public or nonprofit organization may have a number plate authorised, which is the mechanism by which the catalogue grows without further legislation"
405
+ region_encoding: none
406
+ sources:
407
+ - "https://ndlegis.gov/cencode/t39c04.pdf # NDCC §§ 39-04-10 through 39-04-10.18: the eighteen authorising sections counted above, including § 39-04-10.13's open-ended public/nonprofit organization program"
408
+ - "https://www.dot.nd.gov/motor-vehicle/license-plates # NDDOT's license-plate index page — the official entry point; publishes no count and no consolidated specialty catalogue"
409
+ notes: >-
410
+ THE SPECIALTY PROGRAM INDEX — one entry standing for the whole program, which is
411
+ what PRD-PLATES §2.5 asks for at this gate. North Dakota is the cleanest counting
412
+ case in group midwest-b because its programs are created by NUMBERED STATUTORY
413
+ SECTIONS rather than by departmental discretion, so the index can be counted from an
414
+ edict of government instead of from a marketing page. The honest caveat is recorded
415
+ in `count_caveat`: sections are not designs, and § 39-04-10.13 makes the design
416
+ count unbounded from the statute alone.
417
+ NOTE THE OVERLAP: us-nd-blackout above is one of these eighteen programs
418
+ (§ 39-04-10.18) and is broken out as its own series only because its colours are
419
+ legislated as VALUES. It is counted once here and specified once there.