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,394 @@
1
+ # plates/us-nh.yml — New Hampshire (PRD-PLATES gate L2, northeast group).
2
+ #
3
+ # NEW HAMPSHIRE'S STATUTE DOES ONE THING AND DOES IT ABSOLUTELY: it mandates the
4
+ # SLOGAN by name and delegates everything else. RSA 261:75(II), verbatim: "The
5
+ # director may make special rules relative to the number of plates, the location
6
+ # of said plate or plates on the vehicle, and the material and design thereof,
7
+ # provided, however, that number plates for passenger vehicles shall have the
8
+ # state motto 'LIVE FREE OR DIE' written thereon." Number of plates: delegated.
9
+ # Location: delegated. Material: delegated. Design: delegated. Four words of
10
+ # motto: mandatory. New Hampshire is the cleanest example in this dataset of a
11
+ # legislature legislating IDENTITY and outsourcing ENGINEERING — the exact
12
+ # inverse of Maine two states away, whose legislature specifies character
13
+ # heights and a pine tree and delegates the numbering system.
14
+ #
15
+ # (The motto mandate is also the reason New Hampshire has a US Supreme Court
16
+ # case about a licence plate. It is deliberately NOT cited here: Wooley v.
17
+ # Maynard (1977) is a compelled-speech decision about covering the motto, not a
18
+ # plate-specification or copyright authority, and the FL pilot's discipline of
19
+ # keeping First Amendment plate cases out of the IP analysis — it excluded
20
+ # Walker v. Texas Div., SCV for the same reason — applies unchanged.)
21
+ #
22
+ # SPECIALTY MODEL: New Hampshire does not run a large specialty catalogue. It
23
+ # runs ONE plate with a 3-inch square hole in it. See us-nh-specialty-index —
24
+ # it is the most structurally interesting specialty program in the group.
25
+ jurisdiction: us-nh
26
+ authority:
27
+ name: New Hampshire Division of Motor Vehicles, a division of the New Hampshire Department of Safety
28
+ url: "https://www.dmv.nh.gov/"
29
+ binding: vehicle
30
+ statute_edition: >-
31
+ New Hampshire Revised Statutes Annotated, Title XXI Chapter 261 (Certificates
32
+ of Title and Registration of Vehicles), as served by the NH General Court —
33
+ RSA 261:75 read this pass, source line ending "2002, 165:6, eff. July 1, 2002".
34
+
35
+ # ---------------------------------------------------------------------------
36
+ # artwork_risk — required per jurisdiction by PRD-PLATES §4.
37
+ # ---------------------------------------------------------------------------
38
+ artwork_risk:
39
+ posture: unresearched
40
+ basis: >-
41
+ HONESTLY UNRESEARCHED, and recorded that way rather than guessed. Three
42
+ checks were run this pass and all three came back empty or blocked. (1)
43
+ Commons has NO {{PD-NHGov}} template — queried by API, result MISSING. (2)
44
+ New Hampshire has NO entry in the Wikipedia survey of subnational copyright
45
+ postures. (3) The state's own disclaimer page at nh.gov returned HTTP 403 to
46
+ every fetch attempt, so New Hampshire's terms of use are unpinned. With no
47
+ affirmative disclaimer located, the §105 default governs: the federal
48
+ public-domain rule does not extend to states, so a New Hampshire state work
49
+ is presumed copyrighted. Treat as default-adverse pending research.
50
+ emblem_rule: >-
51
+ THE PLACEHOLDER RULE MATTERS MORE HERE THAN ANYWHERE ELSE IN THIS GROUP, for
52
+ a reason that has nothing to do with copyright. The 1999 base's graphic is
53
+ the OLD MAN OF THE MOUNTAIN — the granite profile on Cannon Mountain that
54
+ COLLAPSED on 3 May 2003 and no longer exists. New Hampshire has continued to
55
+ issue plates depicting it for the twenty-three years since. The image is a
56
+ state emblem in the strongest sense (it is on the state quarter, the state
57
+ highway signs and the state seal's neighbourhood), and emblem protection
58
+ independent of copyright — misuse statutes, state-symbol statutes — is
59
+ UNRESEARCHED for New Hampshire, as it is for every state in this dataset.
60
+ Render `emblem: {present: true, rendered: placeholder}` and treat any
61
+ proposal to draw the profile as a named decision requiring its own research,
62
+ not as a rendering detail.
63
+ photograph_caution: "Commons photographs of New Hampshire plates carry the photographer's licence on the photograph, not a licence on the design. Our renders are generated from spec, so those obligations never attach."
64
+ sources:
65
+ - "https://commons.wikimedia.org/w/api.php?action=query&titles=Template:PD-NHGov # queried this pass: MISSING — no New Hampshire public-domain tag exists on Commons"
66
+ - "https://en.wikipedia.org/wiki/Copyright_status_of_works_by_subnational_governments_of_the_United_States # LOCATOR: New Hampshire has NO entry — recorded as unsurveyed"
67
+ - "https://www.nh.gov/disclaimer.htm # the state's own terms/disclaimer page — returned HTTP 403 to every fetch this pass; UNPINNED (recorded gap)"
68
+
69
+ display_rules:
70
+ default: "DELEGATED, not statutory. RSA 261:75(II): every vehicle required to be registered 'shall have displayed conspicuously thereon a number plate or plates to be furnished by the department, together with any current validation sticker', and 'The director may make special rules relative to the NUMBER OF PLATES, the location of said plate or plates on the vehicle, and the material and design thereof'. So even the count of plates is administrative. Two plates (front and rear) for most classes, rear only for motorcycles and trailers, is the reported practice (secondary) — the DIRECTOR'S RULES THEMSELVES WERE NOT OBTAINED (recorded gap)."
71
+ motto_mandate: "RSA 261:75(II), verbatim proviso: 'provided, however, that number plates for passenger vehicles shall have the state motto \"Live Free or Die\" written thereon.' The only design element New Hampshire's legislature reserves to itself, and it binds PASSENGER plates specifically — which is why the non-passenger series below vary in whether they carry it."
72
+ validation: "RSA 261:75(I): plates 'shall be furnished by the department yearly or at whatever interval of years the department shall determine. In all cases such plate or plates shall bear on the face thereof a permanent or changeable designation of their effective period.' A statutory requirement that the plate itself declare its validity window — by permanent marking or by sticker."
73
+ cleanliness: "RSA 261:75(II): 'The plate shall be kept clean.' Four words; no distance test, no obstruction clause, no illumination rule — the shortest display duty in this group."
74
+ fee: "RSA 261:75(I): $4.00 per plate."
75
+ sources:
76
+ - "https://www.gencourt.state.nh.us/rsa/html/XXI/261/261-75.htm # RSA 261:75(I) department designs and issues, $4.00 per plate, yearly or other interval, the effective-period designation duty; (II) conspicuous display with validation sticker, the delegation of number/location/material/design to the director, the 'Live Free or Die' proviso for passenger plates, and the cleanliness duty"
77
+
78
+ us_standards:
79
+ no_federal_mandate: true
80
+ chain: "SAE J686 -> AAMVA License Plate Standard Edition 3 (September 2025) -> voluntary state adoption; recommendations, not requirements."
81
+ aamva_geometry: "AAMVA §2.1 jurisdiction name top-centre between the bolt holes, >=0.25 in above the plate number, >=0.125 in from the top edge, characters 0.75-1.0 in; §2.2 serial characters >=2.5 in high, >=0.25 in apart, stroke 0.2-0.4 in, >=1.25 in clear of top and bottom; §3.3 legible day and night from >=75 feet, ASTM D4956-19 and ISO 7591:1982 cl.3, entrance angle 0.2 deg, observation angle -4 deg, minimum 45 cd/lx/m^2."
82
+ stacked_characters: "AAMVA Ed.3: 'If stacked characters are used, they are part of the official license plate number. No more than two characters are to be stacked.' NEW HAMPSHIRE STRESSES THIS RULE HARDER THAN ANY OTHER STATE IN THE GROUP — its Conservation and Construction Equipment plates carry a stacked 'C/H' and 'C/E' pair beside the serial, i.e. exactly two stacked characters, which under AAMVA's own words are PART OF THE NUMBER. Whether New Hampshire agrees was not established. Recorded as a live normalisation question for the parse layer."
83
+ dimensions_delegated: "AAMVA §3.1 sends dimensions and bolt holes to SAE J686, PAYWALLED and UNPINNED; no J686 dimension is quoted here. RSA 261 states no plate dimension (design is delegated to the director in terms), so 12x6 in below is `observed`."
84
+ replacement_cycle: "RSA 261:75(I) lets the department set the interval — 'yearly or at whatever interval of years the department shall determine' — so New Hampshire's cycle is a departmental decision with statutory authority behind it, not a fixed legislated term. The 1999 base has been in issue 27 years."
85
+ source: "https://www.aamva.org/getmedia/646bcc8a-219b-47d8-b5cd-726240473163/License-Plate-Standard-Edition-3_September-2025-Update.pdf"
86
+
87
+ series:
88
+
89
+ # =========================================================================
90
+ # CURRENT STANDARD ISSUE — the 1999 Old Man of the Mountain base.
91
+ # =========================================================================
92
+ - id: us-nh-standard-1999
93
+ class: standard
94
+ categories: [car, van, truck, bus]
95
+ period: { start: 1999 }
96
+ period_evidence: secondary-dated
97
+ matching: strict
98
+ format:
99
+ pattern: "999 9999"
100
+ regex: '\A\d{3} ?\d{4}\z'
101
+ charset:
102
+ notes: >-
103
+ ALL-NUMERIC, which makes New Hampshire the only standard series in this
104
+ group with no letters at all and the only one where the separator
105
+ carries the entire visual structure. RSA 261 states no grammar and no
106
+ length — design is delegated to the director in terms — so the
107
+ seven-digit shape is secondary. Reported serials run 100 0000 to
108
+ 553 8164 as of 17 January 2025.
109
+ concurrent_formats_note: >-
110
+ THREE SHORTER ARRANGEMENTS RAN ON THE SAME BASE BEFORE THIS ONE AND ARE
111
+ STILL ON THE ROAD: 12345 (1 to 99999, Old Man graphic at right — also the
112
+ vanity style), 123 456 (Old Man graphic centred), and the current
113
+ 123 4567 (Old Man graphic slightly left of centre). THE MIDDLE ONE RAN
114
+ BACKWARDS: 999 999 down to 100 000. A descending serial sequence is rare
115
+ enough to be worth stating plainly — any consumer inferring age from
116
+ magnitude on a New Hampshire six-digit plate will get it exactly
117
+ inverted. Also note the graphic POSITION shifts with the serial width,
118
+ so on this base the artwork placement is a function of the format.
119
+ progression: "ascending on the current seven-digit format; DESCENDING on the preceding six-digit format"
120
+ design:
121
+ plate: { w: 12, h: 6, unit: in, dimension_note: "OBSERVED — RSA 261 states no plate dimension" }
122
+ background: { finish: retroreflective }
123
+ colour_note: >-
124
+ NO BACKGROUND HEX RECORDED. The base is a GRAPHIC plate — the Old Man of
125
+ the Mountain and Cannon Mountain against a pale blue sky — so a single
126
+ background hex would misdescribe it. The serial is embossed DARK GREEN
127
+ (secondary) and the state name and motto are screened dark green.
128
+ foreground: "#1B4D3E"
129
+ legend_bottom: "New HAMPSHIRE"
130
+ legend_bottom_note: "reported as cursive 'New' set above serifed 'HAMPSHIRE' — a two-weight, two-line state name, unusual in US practice and a real render constraint"
131
+ legend_top: "LIVE FREE OR DIE"
132
+ legend_rule: "STATUTORY as to the words: RSA 261:75(II) requires passenger plates to bear the state motto 'Live Free or Die'. The statute does not fix its position; top placement is observed."
133
+ graphic:
134
+ present: true
135
+ rendered: placeholder
136
+ description: "the Old Man of the Mountain profile with Cannon Mountain behind, against a pale blue sky (secondary)"
137
+ note: "the depicted formation COLLAPSED on 3 May 2003 and the design has continued unchanged since. See artwork_risk."
138
+ emblem: { present: true, rendered: placeholder }
139
+ rear_differs: false
140
+ region_encoding: none
141
+ sources:
142
+ - "https://www.gencourt.state.nh.us/rsa/html/XXI/261/261-75.htm # RSA 261:75(II): the 'Live Free or Die' mandate for passenger plates, and the delegation of number, location, material and design to the director; (I) the department's issuance duty, the $4.00 fee and the effective-period designation"
143
+ - "https://en.wikipedia.org/wiki/Vehicle_registration_plates_of_New_Hampshire # LOCATOR ONLY (PRD-PLATES §4): the January 1999 base with the Old Man of the Mountain and Cannon Mountain, the three concurrent numeric arrangements, the DESCENDING six-digit sequence, the current 123 4567 range to 553 8164 as of 17 January 2025, and the graphic-position shift by format"
144
+ - "https://www.licenseplates.cc/NH # enthusiast corroboration, cited because used: the reported serial high-water mark. No text or image copied"
145
+ notes: >-
146
+ NEW HAMPSHIRE STANDARD ISSUE. The base is dated 1999 and the DESIGN has not
147
+ changed since, which by the AAMVA §1.1 measure makes it nearly three
148
+ replacement cycles old — and legally fine, because RSA 261:75(I) leaves the
149
+ interval to the department. The id is dated to the BASE rather than to the
150
+ current serial width, deliberately and unlike us-ct-standard-2015: in
151
+ Connecticut the format changes were accompanied by an official changeover
152
+ event with a reported date; in New Hampshire the widths simply grew as each
153
+ space exhausted, with no reported boundary dates at all, so dating an id to
154
+ a width would be inventing a boundary. Where the evidence differs, the id
155
+ policy differs, and the file says why.
156
+
157
+ # =========================================================================
158
+ # ONE SERIES BACK — the 1989 base.
159
+ # =========================================================================
160
+ - id: us-nh-standard-1989
161
+ class: standard
162
+ categories: [car, van, truck, bus]
163
+ period: { start: 1989, end: 1998 }
164
+ period_evidence: secondary-dated
165
+ matching: strict
166
+ format:
167
+ pattern: "LLL 999"
168
+ regex: '\A[A-Z]{3} ?\d{3}\z'
169
+ charset: { notes: "reported AAA 001 to approximately DEX 500. The immediately preceding arrangement, on the 1987 base, was a plain six-digit 123456 running 1 to 999999" }
170
+ separator_note: "printed with a hyphen in secondary depictions (ABC-123); spelled U+0020 here, and either reading is inside the emitted set (PRD-PLATES §2.6) — recorded because the two are not interchangeable to a strict matcher"
171
+ design:
172
+ plate: { w: 12, h: 6, unit: in }
173
+ background: { color: "#FFFFFF", finish: retroreflective, hex_basis: observed }
174
+ foreground: "#1B4D3E"
175
+ colour_note: "embossed dark green serial on reflective white, with the state name and Old Man graphic screened in dark green (secondary); hexes observed"
176
+ legend_top: "NEW HAMPSHIRE"
177
+ legend_bottom: "LIVE FREE OR DIE"
178
+ legend_note: "the motto moved from BOTTOM on this base to TOP on the 1999 base — the statute mandates the words, never the position, so both layouts satisfy RSA 261:75(II). A good illustration of how much a slogan mandate does NOT determine."
179
+ graphic: { present: true, rendered: placeholder, description: "Old Man of the Mountain in a circle between the two words of the state name (secondary)" }
180
+ emblem: { present: true, rendered: placeholder }
181
+ region_encoding: none
182
+ sources:
183
+ - "https://www.gencourt.state.nh.us/rsa/html/XXI/261/261-75.htm # RSA 261:75(II): the motto mandate this base satisfies with a different placement than the current one"
184
+ - "https://en.wikipedia.org/wiki/Vehicle_registration_plates_of_New_Hampshire # LOCATOR ONLY: the March 1989 - December 1998 base, the ABC-123 arrangement and its AAA-001 to approximately DEX-500 range, and the 1987-1989 predecessor with the pale-green screening"
185
+ notes: >-
186
+ THE PREVIOUS BASE. Still the design of record for several New Hampshire
187
+ NON-PASSENGER classes issued today — Commercial, Disabled, Municipal
188
+ Government and the older Trailer series are all reported to run "as
189
+ 1989-98 passenger base". So the 1989 base did not retire in 1998; it
190
+ DEMOTED, from the passenger design to the utility design, and continues in
191
+ production for other classes. `period.end: 1998` is therefore correct for
192
+ the PASSENGER series and would be wrong for the base, which is a real
193
+ argument for keying series to issuance systems rather than to artwork.
194
+
195
+ # =========================================================================
196
+ # CORE DISTINCT CLASSES.
197
+ # =========================================================================
198
+ - id: us-nh-motorcycle
199
+ class: motorcycle
200
+ categories: [motorcycle]
201
+ period: { start: 2022 }
202
+ period_evidence: secondary-dated
203
+ matching: strict
204
+ format:
205
+ pattern: "9L999"
206
+ regex: '\A\d[A-Z]\d{3}\z'
207
+ charset: { notes: "reported 1A000 to 1H885 as of 12 October 2024. Predecessors on the same design: 12345 (1987-94), 1234A (1994-2008), A1234 (2008-2022) — four grammars, one design, the New Hampshire pattern" }
208
+ design:
209
+ plate: { w: 7, h: 4, unit: in, dimension_note: "MOTORCYCLE PLATE SIZE NOT OBTAINED — placeholder carrying the conventional US motorcycle size; not sourced (recorded gap). RSA 261:75(II) delegates material and design to the director, whose rules were not obtained" }
210
+ background: { color: "#FFFFFF", finish: retroreflective, hex_basis: observed }
211
+ foreground: "#1B4D3E"
212
+ legend_bottom: "MOTORCYCLE"
213
+ legend_note: "NO MOTTO. Reported slogan: none — and that is statutorily correct, because RSA 261:75(II)'s proviso binds 'number plates for PASSENGER VEHICLES'. New Hampshire motorcycles are outside the mandate, and the plates show it. One of the cleanest statute-to-artefact confirmations in this group."
214
+ graphic: { present: true, rendered: placeholder, description: "Old Man of the Mountain screened at top left with 'N' and 'H' on either side (secondary)" }
215
+ region_encoding: none
216
+ sources:
217
+ - "https://www.gencourt.state.nh.us/rsa/html/XXI/261/261-75.htm # RSA 261:75(II): the motto proviso is scoped to PASSENGER vehicles — the statutory reason this series carries no slogan"
218
+ - "https://en.wikipedia.org/wiki/Vehicle_registration_plates_of_New_Hampshire # LOCATOR ONLY: the 1A234 motorcycle arrangement from 2022, the three earlier grammars, the reported range, and the absence of a slogan"
219
+ notes: >-
220
+ MOTORCYCLE. Worth the entry for the negative fact alone: the absence of the
221
+ state motto on New Hampshire motorcycle plates is not an oversight, it is
222
+ the statute's own scoping, and a dataset that records "NH plates carry
223
+ 'Live Free or Die'" as a jurisdiction-level fact would be wrong for an
224
+ entire class.
225
+
226
+ - id: us-nh-trailer
227
+ class: trailer
228
+ categories: [trailer]
229
+ period: { start: 2004 }
230
+ period_evidence: secondary-dated
231
+ matching: strict
232
+ format:
233
+ pattern: "T999999"
234
+ regex: '\AT\d{6}\z'
235
+ charset: { notes: "a literal 'T' class prefix and six digits; reported T100000 to T792323 as of 23 January 2025. The preceding arrangement was TB1234 — 'T' plus a sequential letter plus four digits — running TA0001 to TZ9999" }
236
+ design:
237
+ plate: { w: 12, h: 6, unit: in }
238
+ background: { finish: retroreflective }
239
+ legend_bottom: "LIVE FREE OR DIE"
240
+ legend_note: "reported to carry the motto even though RSA 261:75(II) does not require it on a trailer — the director's discretion exercised toward uniformity, not away from it"
241
+ design_note: "runs on the 1989-98 passenger base design and, per the secondary source, uses THE SAME SERIAL DIES as the current passenger base — a manufacturing fact with a rendering consequence: trailer and passenger glyphs are metrically identical even though the bases differ"
242
+ region_encoding: none
243
+ sources:
244
+ - "https://en.wikipedia.org/wiki/Vehicle_registration_plates_of_New_Hampshire # LOCATOR ONLY: the T123456 trailer arrangement from 2004, its TB1234 predecessor, the reported range, the 1989-98 base design and the shared serial dies"
245
+ - "https://www.gencourt.state.nh.us/rsa/html/XXI/261/261-75.htm # RSA 261:75(II): design and number of plates delegated to the director — the authority under which the trailer series is single-issue and carries the motto voluntarily"
246
+ notes: >-
247
+ TRAILER. The shared-serial-dies detail is the kind of fact that only
248
+ matters to a render layer and matters a lot to it: it means one glyph set
249
+ serves two series, so a Maine-style per-series font decision is unnecessary
250
+ here.
251
+
252
+ - id: us-nh-municipal
253
+ class: government
254
+ categories: [car, van, truck, bus]
255
+ period: { start: 1989 }
256
+ period_evidence: secondary-dated
257
+ matching: strict
258
+ format:
259
+ pattern: "G99999"
260
+ regex: '\AG\d{5}\z'
261
+ charset: { notes: "a literal 'G' prefix (for Government) and five digits; reported G10000 to G30914 as of 18 September 2024" }
262
+ design:
263
+ plate: { w: 12, h: 6, unit: in }
264
+ background: { finish: retroreflective }
265
+ legend_bottom: "LIVE FREE OR DIE"
266
+ design_note: "runs on the 1989-98 passenger base design (secondary)"
267
+ region_encoding: none
268
+ sources:
269
+ - "https://en.wikipedia.org/wiki/Vehicle_registration_plates_of_New_Hampshire # LOCATOR ONLY: the G12345 Municipal Government arrangement from 1989 and its reported range"
270
+ notes: >-
271
+ MUNICIPAL GOVERNMENT. Sequential, not geographic — the 'G' prefix marks
272
+ the class and the digits are a plain counter, so unlike Connecticut's
273
+ municipal series this one decodes to nothing. The New Hampshire plate that
274
+ DOES decode geographically is the Municipal Police series; see
275
+ us-nh-municipal-police.
276
+
277
+ - id: us-nh-municipal-police
278
+ class: police
279
+ categories: [car, van, truck]
280
+ period: { start: 1999 }
281
+ period_evidence: secondary-dated
282
+ matching: recall-only
283
+ format:
284
+ pattern: "LLL 99"
285
+ regex: '\A[A-Z]{2,4} ?\d{1,3}\z'
286
+ charset:
287
+ notes: >-
288
+ Reported structure: a DEPARTMENT CODE of letters, then a VEHICLE NUMBER
289
+ — the secondary source writes it as "xxx 12" and glosses it "xxx -
290
+ department code, 12 - vehicle number". Neither the code width nor the
291
+ number width is stated anywhere, which is why the regex quantifies
292
+ loosely and why this series is `recall-only`: a hit is a shape claim,
293
+ not a validity claim.
294
+ design:
295
+ plate: { w: 12, h: 6, unit: in }
296
+ background: { finish: retroreflective }
297
+ colour_note: "embossed blue serial on a white and blue plate (secondary); no hex recorded because the two-tone field is not describable as one background colour"
298
+ legend_top: "LIVE FREE OR DIE"
299
+ legend_bottom: "MUNICIPAL POLICE"
300
+ layout_note: "'M/P' screened at left — a stacked two-character class marker, the same AAMVA stacked-characters question raised in us_standards above"
301
+ region_encoding: >-
302
+ YES — THE LETTER GROUP IS A DEPARTMENT CODE, i.e. a MUNICIPAL DECODE, the
303
+ New Hampshire analogue of Connecticut's municipal letters. THE DECODE TABLE
304
+ WAS NOT OBTAINED: no official list of New Hampshire police department codes
305
+ was found this pass, and the secondary source gives the mechanism without
306
+ any of the values. Recorded as a gap and as a candidate
307
+ `plates/_decode/us-nh-police-departments.yml`. Until it lands a parse API
308
+ must answer "a New Hampshire municipal police vehicle" and stop.
309
+ sources:
310
+ - "https://en.wikipedia.org/wiki/Vehicle_registration_plates_of_New_Hampshire # LOCATOR ONLY: the Municipal Police series from 1999, the two-tone design, the 'M/P' marker, and the explicit gloss that the letter group is a department code and the digits a vehicle number"
311
+ notes: >-
312
+ MUNICIPAL POLICE — modelled `police` rather than `government` because New
313
+ Hampshire serializes it separately from the G-prefixed municipal series,
314
+ which is exactly the test _meta/classes.yml sets for the police class
315
+ ("police fleets where distinct from government"). Both a decode mechanism
316
+ and a stacked-character question in one series; between this and Connecticut
317
+ the northeast group has produced two municipal decode tables' worth of
318
+ mechanism and zero rows of table, which is recorded as the group's second
319
+ structural gap.
320
+
321
+ # =========================================================================
322
+ # SPECIALTY — PROGRAM INDEX ONLY (PRD-PLATES §2.5). New Hampshire's program
323
+ # is a plate with a hole in it, and that is genuinely novel.
324
+ # =========================================================================
325
+ - id: us-nh-specialty-index
326
+ class: specialty
327
+ categories: [car, van, truck]
328
+ period: { start: 2017 }
329
+ period_evidence: statutory-date
330
+ matching: strict
331
+ format:
332
+ pattern: "L9999"
333
+ regex: '\A[A-Z]\d{4}\z'
334
+ charset: { notes: "the Decal Plate serial is reported as D1234 — a literal 'D' prefix and four digits, running from D1000. Decal Vanity Plates are also offered, at an additional $40 vanity fee, so the space is not purely sequential" }
335
+ design:
336
+ plate: { w: 12, h: 6, unit: in }
337
+ background: { finish: retroreflective }
338
+ note: "the Decal Plate 'resembles a regular New Hampshire passenger license plate' but carries a BLANK 3-inch by 3-inch SQUARE on the left side. The plate itself is one design; the variation lives in a separately purchased adhesive decal. No individual decal design is described here (PRD-PLATES §2.5)."
339
+ emblem: { present: true, rendered: placeholder, description: "Old Man of the Mountain at right on the decal plate — the graphic moves right to clear the decal square" }
340
+ program_index:
341
+ model: >-
342
+ NEW HAMPSHIRE'S SPECIALTY PROGRAM IS ARCHITECTURALLY DIFFERENT FROM EVERY
343
+ OTHER STATE IN THIS GROUP AND IT IS THE MOST INTERESTING FINDING IN THIS
344
+ FILE. Instead of authorising N plate DESIGNS, New Hampshire authorised ONE
345
+ plate TYPE with a 3in x 3in blank square, and lets legislatively approved
346
+ 501(c)(3) organizations sell DECALS to fill it. The DMV states it plainly:
347
+ "Decals are NOT available at DMV locations, they have to be purchased
348
+ directly from the legislatively authorized 501(c)(3) organizations", and
349
+ "Decals can only be placed on a Decal Plate." The state manufactures one
350
+ plate; the charities manufacture the variety. Consequences worth stating:
351
+ the specialty COUNT is a count of ORGANIZATIONS, not of plate designs; the
352
+ plate's SERIAL SPACE is shared across all of them, so the serial decodes
353
+ to nothing about the cause; and — decisively for this dataset — the
354
+ variable artwork IS NOT A STATE WORK AT ALL. It is a charity's decal. The
355
+ artwork_risk analysis for New Hampshire specialty plates is therefore a
356
+ question about fifteen private organizations' IP, not about the state's.
357
+ statutory_basis: "RSA 261-B, in force from 3 July 2017 per the DMV's own words: 'Pursuant to RSA 261:B, starting July 3rd, 2017, the NH DMV began offering our newest plate type, the Decal Plate.' Veteran decal plates run under a parallel chapter, RSA 261-C, restricted to vehicles registered under RSA 261:87-b."
358
+ count_organizations: 15
359
+ count_basis: >-
360
+ FIFTEEN legislatively approved organizations are listed by name on the
361
+ DMV's own Decal Plates page as of the capture read this pass: Girl Scouts
362
+ of the Green and White Mountains; the Grand Lodge of Ancient, Free and
363
+ Accepted Masons in New Hampshire; Harris Center for Conservation
364
+ Education; Keene State College; NH Firefighters; New England Donor
365
+ Services; New England Patriot's Foundation; NH Breast Cancer Coalition;
366
+ NH Catholic Charities d/b/a NH Food Bank; NH Law Enforcement Officers
367
+ Memorial Association; NH Rotary; Plymouth State University; Seacoast
368
+ Youth Services; Sophia's Fund; University of New Hampshire Foundation.
369
+ This is an OFFICIAL count from the issuing agency, which is a better
370
+ artefact than any other specialty count in this group except Connecticut's
371
+ statute-derived one.
372
+ veteran_decals: "RSA 261-C additionally authorises Veteran Decal Plates with a distinguishing veteran design in the same 3x3 square, sold by the NH Office of Veteran Services rather than by a charity. Branch decals cover Army, Navy, Air Force, Marine Corps, Coast Guard and SPACE FORCE — an issuing agency that has already added the newest US service branch. Medal-of-valor decals cover Medal of Honor, Distinguished Service Cross, Navy Cross, Air Force Cross, Silver Star and Bronze Star, each pre-qualified; Gold Star family decals run under RSA 261-C:3-a."
373
+ other_specialty_series: "Separately from the decal program New Hampshire issues a CONSERVATION plate (the 'moose plate') from 1999, with a stacked 'C/H' marker beside the serial and five reported serial arrangements (C/H1234X, C/H123X4, C/H12X34, C/H1X234, C/HX1234). It is NOT given a series here: five width variants with no primary and a stacked marker of contested serial status is precisely the shape that produces a wrong regex, and PRD-PLATES §2.5 does not require it. Recorded as the file's largest deliberate omission."
374
+ fees: "$15 per year for a Decal Plate on top of town and state registration fees; $40 more for a Decal Vanity Plate; an $8.00 plate manufacturing fee in the first year only (DMV's own figures)."
375
+ official_list_url: "https://www.dmv.nh.gov/vehicles-boats-or-titles/vehicle-registrations/decal-plates"
376
+ region_encoding: none
377
+ sources:
378
+ - "https://www.dmv.nh.gov/vehicles-boats-or-titles/vehicle-registrations/decal-plates # NH DMV's own Decal Plates page: RSA 261-B and the 3 July 2017 start; the 3in x 3in blank square; decals sold by the organizations and not by the DMV; the fifteen approved organizations by name; the $15/$40/$8 fees; RSA 261-C veteran decals, the RSA 261:87-b registration condition, the six service branches including Space Force, the six medals of valor, and RSA 261-C:3-a Gold Star family decals. Read via https://web.archive.org/web/2025/... because dmv.nh.gov returned 403 to direct fetches this pass"
379
+ - "https://www.gencourt.state.nh.us/rsa/html/XXI/261/261-75.htm # RSA 261:75(II): the director's design authority under which a plate type with a blank decal field can exist at all"
380
+ - "https://en.wikipedia.org/wiki/Vehicle_registration_plates_of_New_Hampshire # LOCATOR ONLY: the D1234 decal-plate serial arrangement from D1000, and the Conservation plate's five reported arrangements with the stacked C/H marker"
381
+ notes: >-
382
+ THE NEW HAMPSHIRE SPECIALTY INDEX. `period_evidence: statutory-date`
383
+ because the DMV cites RSA 261-B and a specific commencement date, 3 July
384
+ 2017, in its own words — the only specialty index in this group with a
385
+ dated statutory start. THE STRUCTURAL LESSON, which belongs in the PRD's
386
+ §2.5 discussion and not just in this file: the "specialty programs" concept
387
+ assumes one design per program, and New Hampshire breaks that assumption by
388
+ separating the PLATE (state, one design, one serial space) from the DECAL
389
+ (private, many designs, no serial). A schema that counts "specialty plates"
390
+ per state is counting different things in different states — Florida's over
391
+ a hundred DESIGNS, Connecticut's thirteen STATUTES, Maine's nine SERIAL
392
+ BLOCKS, and New Hampshire's fifteen ORGANIZATIONS SHARING ONE PLATE. The
393
+ index entries in this group therefore say what they are counting, every
394
+ time, and no cross-state total is offered.