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,547 @@
1
+ # plates/us-nj.yml — New Jersey (PRD-PLATES gate L2, mid-Atlantic group).
2
+ #
3
+ # THE FINDING THIS FILE EXISTS FOR: NEW JERSEY'S SEPARATOR IS NOT A CHARACTER.
4
+ # The gap in the middle of a New Jersey serial is occupied by a SILHOUETTE OF
5
+ # THE STATE, embossed or screened between the third and fourth characters. That
6
+ # is not typography and it is not punctuation — it is a design element sitting
7
+ # in a serial gap, which is precisely the case `_meta/separators.yml`'s
8
+ # `never_separator_note` already contemplates for German and Austrian coats of
9
+ # arms. It was confirmed here TWICE and independently: from NJ MVC's own sample
10
+ # plate image, which reads SAM<state outline>PLE, and from the locator's own
11
+ # wording, which calls it a 'state-shaped separator'. This file therefore spells
12
+ # the gap as an EMITTED SPACE and carries the glyph in `design`, never in the
13
+ # serial. See `separator_finding`.
14
+ #
15
+ # WHY NEW JERSEY IS THE FAVOURABLE ARTWORK CASE IN THIS GROUP. Unlike its two
16
+ # neighbours — New York adverse, Pennsylvania adverse by statute — New Jersey
17
+ # affirmatively invites reuse: the State's own legal statement says 'anyone may
18
+ # view, copy or distribute State information found here without obligation to
19
+ # the State'. See `artwork_risk`.
20
+ #
21
+ # SOURCING RULE APPLIED HERE. New Jersey's plate law is DISPLAY law: N.J.S.A.
22
+ # 39:3-33 governs where a plate goes and how legible it must be, and specifies
23
+ # nothing about design, colour, dimension or serial grammar. So the statute
24
+ # carries display, NJ MVC's own pages carry the charset, the historic and street
25
+ # rod grammars, the plate categories and the dedicated-plate list, and the
26
+ # passenger ARRANGEMENT is locator-grade and labelled per series.
27
+ #
28
+ # period_evidence / format_evidence vocabularies as in us-ny.yml.
29
+ jurisdiction: us-nj
30
+ authority:
31
+ name: New Jersey Motor Vehicle Commission (NJ MVC)
32
+ url: "https://www.nj.gov/mvc/"
33
+ binding: vehicle
34
+ statute_edition: "New Jersey Revised Statutes Title 39 (Motor Vehicles and Traffic Regulation), read 2026-08-02 through a third-party reproduction (see the sourcing caveat on 39:3-33). Edicts of government are public domain at every level, so the reproduction carries the text faithfully, but the OFFICIAL New Jersey Legislature service was not reachable in this pass and that is recorded as a gap."
35
+
36
+ # ---------------------------------------------------------------------------
37
+ # artwork_risk — required per jurisdiction by PRD-PLATES §4.
38
+ # ---------------------------------------------------------------------------
39
+ artwork_risk:
40
+ posture: public-domain-favourable
41
+ basis: >-
42
+ New Jersey affirmatively permits reuse of State information. The State of
43
+ New Jersey's own Legal Statement and Disclaimers says, in terms, that
44
+ 'anyone may view, copy or distribute State information found here without
45
+ obligation to the State'. The Wikipedia survey of subnational copyright
46
+ status places New Jersey in the favourable column on the same basis and adds
47
+ two supports: Burnett v. County of Bergen, 402 N.J. Super. 319 (2008), read
48
+ as permitting commercial reproduction of records obtained under OPRA, and
49
+ the New Jersey Open Data Initiative Act (N.J.S.A. 52:18A-234.5), which makes
50
+ covered State data 'license-free, subject to reuse, and not subject to
51
+ copyright restrictions'.
52
+ evidence_grade: >-
53
+ THE STATE'S OWN LEGAL STATEMENT WAS FETCHED AND IS QUOTED — that is a
54
+ primary, agency-published source and the strongest artwork evidence in the
55
+ mid-Atlantic group after nothing at all. The Burnett opinion and the Open
56
+ Data Initiative Act were NOT fetched; they are recorded as citations located
57
+ through a locator, for a verifier to pull. The State's statement also
58
+ carries its own hedge — it makes no warranty that a particular item is free
59
+ of third-party copyright or trademark — so 'favourable' means the STATE does
60
+ not assert, not that every element on a plate is clear.
61
+ emblem_rule: >-
62
+ RENDER PLACEHOLDER ANYWAY. New Jersey's favourable posture is about
63
+ COPYRIGHT; the state silhouette that sits inside every standard serial, and
64
+ the State seal, carry protection INDEPENDENT of copyright under state-seal
65
+ misuse statutes, and that question is unresearched here exactly as it is for
66
+ Florida. `graphic: {present: true, rendered: placeholder}` stands until the
67
+ seal question is answered per-emblem.
68
+ photograph_caution: >-
69
+ Commons photographs of New Jersey plates are the photographer's licence on
70
+ the photograph; the uploader had no standing over the design. Because our
71
+ renders are generated from data, those share-alike obligations never attach.
72
+ NJ MVC's own sample-plate image was READ (to establish the separator finding)
73
+ and is NOT copied into the dataset.
74
+ sources:
75
+ - "https://www.nj.gov/nj/legal.shtml # State of New Jersey Legal Statement and Disclaimers, section F: 'anyone may view, copy or distribute State information found here without obligation to the State', with the State's own no-warranty hedge"
76
+ - "https://en.wikipedia.org/wiki/Copyright_status_of_works_by_subnational_governments_of_the_United_States # LOCATOR ONLY: surfaces Burnett v. County of Bergen, 402 N.J. Super 319 (2008) and N.J.S.A. 52:18A-234.5 (Open Data Initiative Act). Neither was fetched."
77
+
78
+ # ---------------------------------------------------------------------------
79
+ # THE SEPARATOR FINDING (PRD-PLATES §2.6 / §2.8).
80
+ # ---------------------------------------------------------------------------
81
+ separator_finding:
82
+ headline: "New Jersey prints a state-outline GRAPHIC in the serial gap."
83
+ observed: >-
84
+ NJ MVC's official 'Standard Plate Example' image (www.nj.gov/mvc/images/standard.jpg,
85
+ fetched and read 2026-08-02) shows the serial SAM<state outline>PLE: three
86
+ characters, a solid silhouette of New Jersey occupying the gap, three more
87
+ characters. The locator independently describes the 1993 and later bases as
88
+ carrying a 'state-shaped separator' added to the serial, and describes the
89
+ 2014 base as having 'serial and separator screened rather than embossed' —
90
+ i.e. the separator is a printed OBJECT with a manufacturing method, not a
91
+ character.
92
+ encoding_decision: >-
93
+ The gap is spelled as an EMITTED SPACE (U+0020) in `pattern` and as an
94
+ optional space in `regex`, and the silhouette is carried in `design.graphic`.
95
+ This is the treatment `_meta/separators.yml` already prescribes for the
96
+ analogous case: its `never_separator_note` names 'the coats of arms / seals
97
+ that sit between groups on several German and Austrian plates (a design
98
+ element, carried in `design.emblem`, never in the serial)'. New Jersey is
99
+ that case in the United States, and the group's first one.
100
+ recommended_amendment: >-
101
+ Add the New Jersey state silhouette to `_meta/separators.yml`'s
102
+ `never_separator` list by name, with this citation, so the rule is stated
103
+ once for consumers rather than rediscovered per jurisdiction. No behaviour
104
+ changes — a separator-stripping consumer already deletes the space and can
105
+ never see the glyph — but the dataset should say why the space is there.
106
+ source: "https://www.nj.gov/mvc/vehicles/standplates.htm # links the official 'Standard Plate Example' image at /mvc/images/standard.jpg, which is where the silhouette was read"
107
+
108
+ # ---------------------------------------------------------------------------
109
+ # The US standards chain. Voluntary; J686 never quoted.
110
+ # ---------------------------------------------------------------------------
111
+ us_standards:
112
+ no_federal_mandate: true
113
+ chain: "SAE J686 -> AAMVA License Plate Standard Edition 3 (September 2025) -> voluntary state adoption."
114
+ aamva_edition_3:
115
+ dimensions_delegated: "AAMVA §3.1 sends dimensions and bolt holes to SAE J686, whose text is paywalled and was NOT obtained. New Jersey states no plate dimension in Title 39. This file therefore carries NO sourced dimension — a recorded gap."
116
+ retroreflectivity: "AAMVA §3.3: readable 'in both daylight and nighttime from distances of at least 75 feet'. New Jersey legislates a DIFFERENT and stricter-sounding night rule of its own — the rear plate must be illuminated so as to be visible from 50 feet at night — which is a LIGHTING duty on the vehicle, not a retroreflectivity duty on the plate. The two are not the same claim and are not merged here."
117
+ replacement_cycle: "AAMVA §1.1 recommends a cycle 'not to exceed 7 to 10 years'. New Jersey legislates no replacement cycle; no reissuance programme was located. Recorded gap."
118
+ source: "https://www.aamva.org/getmedia/646bcc8a-219b-47d8-b5cd-726240473163/License-Plate-Standard-Edition-3_September-2025-Update.pdf"
119
+ folklore_caution: "The '1956 AMA standardization agreement' is UNCITED in its Wikipedia source and is recorded as COMMONLY REPEATED, UNSOURCED. New Jersey has no statutory dimension to put in its place."
120
+
121
+ # ---------------------------------------------------------------------------
122
+ # Display rules. New Jersey is a TWO-PLATE state and legislates an unusual
123
+ # NIGHT-VISIBILITY duty on the rear plate.
124
+ # ---------------------------------------------------------------------------
125
+ display_rules:
126
+ default: "TWO plates where two are issued — one front, one rear; ONE plate on the rear where only one is issued (N.J.S.A. 39:3-33)."
127
+ mounting: "§ 39:3-33: the owner 'shall display not less than 12 inches nor more than 48 inches from the ground in a horizontal position, and in such a way as not to swing, a registration plate or plates to be furnished by the commission'."
128
+ height_exception: "rear plates on TANK TRUCKS, TRAILERS and SANITATION VEHICLES may exceed the 48-inch ceiling (§ 39:3-33) — a genuine outlier clause worth keeping, since a naive validator of mounting height would flag lawful vehicles."
129
+ legibility: "§ 39:3-33: plates must be kept 'clear and distinct and free from grease, dust, or other blurring matter'."
130
+ frames: "§ 39:3-33: a plate frame may not conceal the STATE NAME or the REGISTRATION NUMBER. Note what this implies for a parse layer — New Jersey legislates that the jurisdiction legend is part of what must remain readable."
131
+ night_illumination: "NJ MVC: the rear plate 'must be illuminated to make it visible from 50 feet away at night'. This is a vehicle-lighting requirement, distinct from AAMVA's 75-foot retroreflectivity recommendation."
132
+ penalty: "§ 39:3-33: fines up to $500 and imprisonment for displaying fictitious numbers; up to $100 for other violations."
133
+ sources:
134
+ - "https://codes.findlaw.com/nj/title-39-motor-vehicles-and-traffic-regulation/nj-st-sect-39-3-33.html # N.J.S.A. 39:3-33 as reproduced by a third party: the 12-48 inch horizontal non-swinging rule, two-plate/one-plate display, the tank truck/trailer/sanitation height exception, 'clear and distinct and free from grease, dust, or other blurring matter', the frame rule, and the penalty tiers. SOURCING CAVEAT: an edict of government is public domain at every level so the text is freely usable, but this is a REPRODUCTION — the official New Jersey Legislature service was unreachable in this pass and a verifier should re-derive from it."
135
+ - "https://www.nj.gov/mvc/vehicles/standplates.htm # NJ MVC: 'two license plates - one for the front and one for the rear'; 'The license plates must be clean and visible at all times'; the rear-plate 50-foot night illumination rule"
136
+
137
+ series:
138
+
139
+ # =========================================================================
140
+ # THE CURRENT STANDARD-ISSUE SERIES.
141
+ # =========================================================================
142
+ - id: us-nj-garden-state-screened
143
+ class: standard
144
+ categories: [car, van, truck, bus]
145
+ period: { start: 2014 }
146
+ period_evidence: secondary-locator-unverified
147
+ format_evidence: official-agency-image
148
+ matching: strict
149
+ format:
150
+ pattern: "L99 LLL"
151
+ regex: '\A[A-Z]\d{2} ?[A-Z]{3}\z'
152
+ charset:
153
+ notes: >-
154
+ NO CHARSET RULE IS IN TITLE 39 — N.J.S.A. 39:3-33 is a display statute
155
+ and states no serial grammar. NJ MVC's personalisation rules give the
156
+ only official character constraint New Jersey publishes: a personalised
157
+ plate 'must have at least three letters and a maximum of seven
158
+ characters in combination of letters and numbers'. No letter exclusions
159
+ are published anywhere for the ordinary series.
160
+ pattern_note: >-
161
+ SPLIT EVIDENCE, RECORDED SEPARATELY. The 3+3 GROUPING and the
162
+ separator's existence are `official-agency-image` — read off NJ MVC's own
163
+ sample plate. The ALPHANUMERIC ARRANGEMENT within the groups (letter,
164
+ two numerals | three letters) and the A10-EFF starting point are
165
+ `secondary-locator-unverified`: only the locator states them. A verifier
166
+ can confirm the grouping from the agency image without leaving the
167
+ agency; the arrangement needs a primary that was not found.
168
+ progression: "reported to run A10-EFF -> Z99-SZZ, then A10-UAA -> R22-WPG as of 5 January 2026 (locator). The second block is evidence the first exhausted, which is useful era-inference signal and is recorded as reported, not as fact."
169
+ design:
170
+ background: { color: "#F5D547", finish: retroreflective, hex_basis: observed }
171
+ foreground: "#231F20"
172
+ colour_note: >-
173
+ NEITHER COLOUR IS IN STATUTE. The plate is a GRADIENT — reflective yellow
174
+ at the top fading to near-white at the bottom — which a single
175
+ `background.color` cannot express. The hex recorded is the top-of-plate
176
+ yellow, `hex_basis: observed` from NJ MVC's own sample image; the
177
+ gradient is stated here rather than flattened silently. This is a real
178
+ schema stressor: `design.background` assumes one colour and New Jersey
179
+ has two with a ramp between them.
180
+ background_gradient: { from: "#F5D547", to: "#FBF6E3", direction: top-to-bottom, hex_basis: observed }
181
+ legend_top: "New Jersey"
182
+ legend_bottom: "Garden State"
183
+ legend_case_note: "New Jersey sets both legends in MIXED CASE with a serif face for the state name and a bold sans for the slogan — unusual among US plates, most of which set the jurisdiction name in caps. Observed from the agency sample image."
184
+ graphic:
185
+ present: true
186
+ rendered: placeholder
187
+ description: "a solid silhouette of the State of New Jersey, printed IN THE SERIAL GAP between the third and fourth characters. See `separator_finding` — it is design, never serial."
188
+ emblem: { present: true, rendered: placeholder }
189
+ band: { side: none }
190
+ rear_differs: false
191
+ security_features: "the 2014 base is SCREENED rather than embossed; the 2010 base immediately before it added security threads to the centre (locator). A barcode appears at the lower right of the agency sample image — observed, purpose unstated by MVC, recorded as an observation."
192
+ dimension_note: "NO SOURCED DIMENSION (Title 39 states none; SAE J686 unpinned)."
193
+ region_encoding: none
194
+ sources:
195
+ - "https://www.nj.gov/mvc/vehicles/standplates.htm # NJ MVC's standard-plate page and its official 'Standard Plate Example' image — the source for the 3+3 grouping, the state-outline separator, the gradient, the mixed-case legends and the two-plate rule"
196
+ - "https://www.nj.gov/mvc/vehicles/personalized.htm # NJ MVC: 'A personalized plate must have at least three letters and a maximum of seven characters' — the only official New Jersey character constraint"
197
+ - "https://en.wikipedia.org/wiki/Vehicle_registration_plates_of_New_Jersey # LOCATOR ONLY (PRD-PLATES §4): the April 2014 date, the A12-BCD arrangement, the A10-EFF start and the R22-WPG progression"
198
+ notes: >-
199
+ GARDEN STATE, SCREENED (2014-). The current New Jersey standard issue.
200
+ `start: 2014` is locator-grade; what is agency-sourced is that this is the
201
+ design NJ MVC shows as its standard plate today. The 2010 and 2014 bases
202
+ share a serial arrangement and differ ONLY in manufacture — embossed with
203
+ security threads versus screened — which is exactly the kind of boundary
204
+ PRD-PLATES §2.3 says makes a separate series (design differs) while
205
+ warning that it will look like hair-splitting to a consumer. It is not:
206
+ an embossed New Jersey plate and a screened one are physically different
207
+ objects and a renderer must know which it is drawing.
208
+
209
+ # =========================================================================
210
+ # ONE SERIES BACK.
211
+ # =========================================================================
212
+ - id: us-nj-garden-state-embossed
213
+ class: standard
214
+ categories: [car, van, truck, bus]
215
+ period: { start: 2010, end: 2014 }
216
+ period_evidence: secondary-locator-unverified
217
+ format_evidence: secondary-locator-unverified
218
+ matching: strict
219
+ format:
220
+ pattern: "L99 LLL"
221
+ regex: '\A[A-Z]\d{2} ?[A-Z]{3}\z'
222
+ charset: { notes: "as us-nj-garden-state-screened; no statutory charset. Reported range A10-AAA to T99-EEK." }
223
+ design:
224
+ background: { color: "#F5D547", finish: retroreflective, hex_basis: observed }
225
+ foreground: "#231F20"
226
+ background_gradient: { from: "#F5D547", to: "#FBF6E3", direction: top-to-bottom, hex_basis: observed }
227
+ legend_top: "New Jersey"
228
+ legend_bottom: "Garden State"
229
+ graphic: { present: true, rendered: placeholder, description: "state silhouette in the serial gap, EMBOSSED on this base" }
230
+ emblem: { present: true, rendered: placeholder }
231
+ band: { side: none }
232
+ security_features: "security threads added to the centre of the plate on this base (locator)"
233
+ region_encoding: none
234
+ sources:
235
+ - "https://en.wikipedia.org/wiki/Vehicle_registration_plates_of_New_Jersey # LOCATOR ONLY: July 2010, security threads added, A12-BCD from A10-AAA to T99-EEK"
236
+ notes: >-
237
+ GARDEN STATE, EMBOSSED (2010-2014). The previous base. It is the SAME
238
+ SERIAL FORMAT as the current one, which is why New Jersey is a good
239
+ warning for consumers: format alone cannot date a New Jersey plate after
240
+ 2010, only the serial BLOCK can, and the blocks are locator-grade. Any
241
+ era-inference feature over New Jersey must say so.
242
+
243
+ # =========================================================================
244
+ # CORE DISTINCT CLASSES.
245
+ # =========================================================================
246
+ - id: us-nj-motorcycle
247
+ class: motorcycle
248
+ categories: [motorcycle]
249
+ period: { start: 2009 }
250
+ period_evidence: secondary-locator-unverified
251
+ format_evidence: secondary-locator-unverified
252
+ matching: strict
253
+ format:
254
+ pattern: "9LLL9"
255
+ regex: '\A\d[A-Z]{3}\d\z'
256
+ charset: { notes: "reported five-character motorcycle arrangement, numeral / three letters / numeral, current since 2009. Earlier reported arrangements (AB123, 123AB, A123B, A1234, 1234A) are not given series of their own — no primary for their periods." }
257
+ design:
258
+ background: { finish: retroreflective }
259
+ legend_top: "New Jersey"
260
+ emblem: { present: true, rendered: placeholder }
261
+ note: "reduced-size motorcycle plate; NO SOURCED DIMENSION."
262
+ region_encoding: none
263
+ sources:
264
+ - "https://www.nj.gov/mvc/vehicles/standplates.htm # NJ MVC lists motorcycles among the vehicle types with their own plate handling"
265
+ - "https://en.wikipedia.org/wiki/Vehicle_registration_plates_of_New_Jersey # LOCATOR ONLY: current motorcycle format 1ABC2 from 2009 and the five superseded arrangements"
266
+ notes: "MOTORCYCLE. Class officially evidenced, arrangement locator-grade."
267
+
268
+ - id: us-nj-trailer
269
+ class: trailer
270
+ categories: [trailer]
271
+ period: { start: 2023 }
272
+ period_evidence: secondary-locator-unverified
273
+ format_evidence: secondary-locator-unverified
274
+ matching: strict
275
+ format:
276
+ pattern: "L99 TLL"
277
+ regex: '\A[A-Z]\d{2} ?T[A-Z]{2}\z'
278
+ charset:
279
+ notes: >-
280
+ The locator writes this format as A12-TCD. The T is read here as a
281
+ LITERAL trailer marker rather than a placeholder, because the locator's
282
+ own placeholder convention runs alphabetically (A, B, C, D) and T
283
+ breaks that run in the fourth-group's first position. THAT IS AN
284
+ INFERENCE, not a source, and it is flagged as one: if T is in fact a
285
+ placeholder the regex is wrong by a factor of 26 and must be widened
286
+ to '\A[A-Z]\d{2} ?[A-Z]{3}\z'.
287
+ design:
288
+ background: { finish: retroreflective }
289
+ legend_top: "New Jersey"
290
+ graphic: { present: true, rendered: placeholder, description: "state silhouette in the serial gap, as the passenger base" }
291
+ emblem: { present: true, rendered: placeholder }
292
+ region_encoding: none
293
+ sources:
294
+ - "https://en.wikipedia.org/wiki/Vehicle_registration_plates_of_New_Jersey # LOCATOR ONLY: trailer A12-TCD from early 2023"
295
+ notes: >-
296
+ TRAILER. THE WEAKEST CLAIM IN THIS FILE and deliberately labelled as such:
297
+ it rests on a locator plus one inference about placeholder convention. It
298
+ is included because a recorded, flagged, falsifiable claim is worth more to
299
+ a verifier than a silent omission — but it must be verified before it
300
+ carries any five-nines claim.
301
+
302
+ - id: us-nj-dealer
303
+ class: dealer
304
+ categories: [car, van, truck]
305
+ period: { start: 2014 }
306
+ period_evidence: secondary-locator-unverified
307
+ format_evidence: secondary-locator-unverified
308
+ matching: strict
309
+ binding: business
310
+ format:
311
+ pattern: "DLL-99"
312
+ regex: '\AD[A-Z]{2}-?\d{2}\z'
313
+ charset: { notes: "reported new-car dealer format DBC-12 with the trailing pair reported to be a two-digit YEAR rather than a sequence counter, and reported letter series DAA through DKZ. The leading D is read as a literal dealer marker on the same placeholder-convention reasoning applied to the trailer series." }
314
+ design:
315
+ background: { finish: retroreflective }
316
+ legend_top: "New Jersey"
317
+ legend_bottom: "Dealer"
318
+ emblem: { present: true, rendered: placeholder }
319
+ region_encoding: none
320
+ sources:
321
+ - "https://en.wikipedia.org/wiki/Vehicle_registration_plates_of_New_Jersey # LOCATOR ONLY: new-car dealer DBC-12 with two-digit year, series DAA-DKZ"
322
+ notes: >-
323
+ DEALER. `binding: business` — the plate follows the dealership. The
324
+ interesting reported feature is that the last two characters encode a
325
+ YEAR, which would make the New Jersey dealer plate one of the few US
326
+ serials with a TIME field in it. Locator-grade; worth a verifier's
327
+ attention precisely because it would be a decode-table-worthy fact if true.
328
+
329
+ - id: us-nj-temporary
330
+ class: temporary
331
+ categories: [car, van, truck, bus, motorcycle, trailer]
332
+ period: { start: 2012 }
333
+ period_evidence: secondary-locator-unverified
334
+ format_evidence: secondary-locator-unverified
335
+ matching: strict
336
+ format:
337
+ pattern: "L999999"
338
+ regex: '\A[A-Z]\d{6}\z'
339
+ charset: { notes: "reported single letter plus six numerals, current since 1 April 2012, issued in letter series." }
340
+ design:
341
+ background: { finish: unknown }
342
+ legend_top: "New Jersey"
343
+ note: "temporary tags are paper/plastic; no design source obtained. NJ MVC's own temporary-tag page was not reachable in this pass (recorded gap)."
344
+ emblem: { present: false }
345
+ validity: "not sourced (recorded gap)"
346
+ region_encoding: none
347
+ sources:
348
+ - "https://en.wikipedia.org/wiki/Vehicle_registration_plates_of_New_Jersey # LOCATOR ONLY: temporary A123456 from 1 April 2012"
349
+ notes: >-
350
+ TEMPORARY. Included because New Jersey serialises temporary tags in their
351
+ own space, which is the L2 test. Every field here except the class is
352
+ locator-grade; the MVC page that would carry the validity period and the
353
+ design returned 404 on two attempts and is a recorded gap.
354
+
355
+ - id: us-nj-state-government
356
+ class: government
357
+ categories: [car, van, truck, bus]
358
+ period: { start: 2014 }
359
+ period_evidence: secondary-locator-unverified
360
+ format_evidence: secondary-locator-unverified
361
+ matching: strict
362
+ binding: business
363
+ format:
364
+ pattern: "SG99999"
365
+ regex: '\ASG\d{5}\z'
366
+ charset: { notes: "reported STATE GOVERNMENT format SG plus five numerals. New Jersey runs several parallel official series with their own literal prefixes — TD for the Department of Transportation, TPA for the Turnpike Authority, SPA for the State Police — which are NOT given series of their own here because no source beyond the locator was obtained for any of them." }
367
+ design:
368
+ background: { finish: retroreflective }
369
+ legend_top: "New Jersey"
370
+ emblem: { present: true, rendered: placeholder }
371
+ region_encoding: "the leading token is an AGENCY code, not a geographic one — SG state government, TD transportation, TPA turnpike authority, SPA state police. That makes New Jersey's official plates the one place in this file where the serial carries decodable structure, and it is an ORGANISATIONAL decode, not a regional one. Locator-grade; a real decode table needs a primary."
372
+ sources:
373
+ - "https://en.wikipedia.org/wiki/Vehicle_registration_plates_of_New_Jersey # LOCATOR ONLY: SG12345 state government, TD12345 DOT, TPA1234 Turnpike Authority, SPA123D State Police"
374
+ notes: >-
375
+ STATE GOVERNMENT. Modelled as one series with the sibling agency prefixes
376
+ recorded in `region_encoding` rather than as four thin series, because
377
+ minting four locator-only ids would spend four permanent, append-only
378
+ identifiers on unverified claims. One id, honestly scoped, is the
379
+ cheaper mistake to correct.
380
+
381
+ # =========================================================================
382
+ # HISTORIC — New Jersey runs TWO distinct regimes and NJ MVC publishes BOTH
383
+ # serial ranges itself. These are the best-sourced formats in the file.
384
+ # =========================================================================
385
+ - id: us-nj-historic
386
+ class: historic
387
+ categories: [car, truck, motorcycle]
388
+ period: { start: 2014 }
389
+ period_evidence: agency-page-in-force
390
+ format_evidence: official-agency-text
391
+ matching: strict
392
+ format:
393
+ pattern: "QQ9999"
394
+ regex: '\AQQ\d{4,5}\z'
395
+ charset:
396
+ notes: >-
397
+ NJ MVC publishes the range itself: series QQ1000-QQ99999. The QQ is a
398
+ LITERAL agency-published token — not an inference, unlike the trailer
399
+ and dealer markers above — and the numeric part is genuinely
400
+ VARIABLE-WIDTH (four or five digits), which is why the quantifier is a
401
+ range rather than a fixed width.
402
+ progression: "sequential within QQ1000-QQ99999 (NJ MVC)"
403
+ eligibility: "NJ MVC: 'the vehicle must be at least 25 years old and only used for exhibition and educational purposes' — a ROLLING threshold plus a USE restriction. The use restriction is the operative half: New Jersey does not let an eligible vehicle run historic plates as ordinary transport."
404
+ fee: "$44 (NJ MVC)"
405
+ design:
406
+ background: { finish: retroreflective }
407
+ legend_top: "New Jersey"
408
+ legend_bottom: "Historic"
409
+ legend_rule: "NJ MVC describes the 'Historic' designation as appearing on the bottom rim of the plate."
410
+ emblem: { present: true, rendered: placeholder }
411
+ region_encoding: none
412
+ sources:
413
+ - "https://www.nj.gov/mvc/vehicles/historic.htm # NJ MVC: 25-year rolling eligibility, exhibition-and-education-only use restriction, series QQ1000-QQ99999, 'Historic' bottom rim, $44 fee"
414
+ notes: >-
415
+ HISTORIC. New Jersey's rolling 25-year threshold is the same shape as New
416
+ York's and the opposite of Maryland's fixed 1999 cutoff and Florida's
417
+ fixed 1945 — three states, three different threshold designs, in one
418
+ research group. A dataset that models only one kind will be wrong about
419
+ the other two, and only the rolling kind needs annual re-auditing.
420
+
421
+ - id: us-nj-street-rod
422
+ class: historic
423
+ categories: [car]
424
+ period: { start: 2014 }
425
+ period_evidence: agency-page-in-force
426
+ format_evidence: official-agency-text
427
+ matching: strict
428
+ format:
429
+ pattern: "R9999"
430
+ regex: '\AR\d{4}\z'
431
+ charset: { notes: "NJ MVC publishes the range: series R1000-R9999. R is an agency-published literal." }
432
+ progression: "sequential within R1000-R9999 (NJ MVC)"
433
+ eligibility: "NJ MVC: 'modified antique automobiles manufactured before 1949 that are registered in a New Jersey street rod club or an affiliate of the National Street Rod Association Inc.' — a FIXED model-year cutoff (before 1949) PLUS a club-membership condition."
434
+ fee: "$15 (NJ MVC)"
435
+ design:
436
+ background: { finish: retroreflective }
437
+ legend_top: "New Jersey"
438
+ legend_bottom: "Street Rod"
439
+ emblem: { present: true, rendered: placeholder }
440
+ region_encoding: none
441
+ sources:
442
+ - "https://www.nj.gov/mvc/vehicles/historic.htm # NJ MVC: street rod eligibility (modified antiques manufactured before 1949, club or NSRA affiliate membership), series R1000-R9999, 'Street Rod' bottom rim, $15 fee"
443
+ notes: >-
444
+ STREET ROD. Its own series and not a variant of Historic because format,
445
+ eligibility and fee all differ. Note that New Jersey requires PRIVATE CLUB
446
+ MEMBERSHIP as a condition of a government registration class — a
447
+ delegation of eligibility to a non-governmental body, and the only example
448
+ of it found anywhere in the mid-Atlantic group.
449
+
450
+ # =========================================================================
451
+ # PERSONALISED.
452
+ # =========================================================================
453
+ - id: us-nj-personalized
454
+ class: personalized
455
+ categories: [car, van, truck, bus, motorcycle]
456
+ period: { start: 2014 }
457
+ period_evidence: agency-page-in-force
458
+ format_evidence: official-agency-text
459
+ matching: strict
460
+ format:
461
+ pattern: "LLLLLLL"
462
+ regex: '\A[A-Z0-9]{3,7}\z'
463
+ regex_strict: '\A(?=[A-Z0-9]{3,7}\z)[A-Z0-9]*[A-Z][A-Z0-9]*[A-Z][A-Z0-9]*[A-Z][A-Z0-9]*\z'
464
+ charset:
465
+ notes: >-
466
+ NJ MVC, in its own words: 'A personalized plate must have at least
467
+ three letters and a maximum of seven characters in combination of
468
+ letters and numbers.' Two constraints, not one: a LENGTH ceiling of
469
+ seven, and a MINIMUM LETTER COUNT of three. `regex` carries the length
470
+ bound (and the floor of three characters implied by needing three
471
+ letters); `regex_strict` carries the at-least-three-letters rule, which
472
+ the round-trip against `pattern` forbids `regex` from expressing.
473
+ pattern_note: >-
474
+ The three-letter minimum is an unusual constraint — most states bound
475
+ length and alphabet, not letter COUNT — and it is exactly the kind of
476
+ authority-alphabet rule PRD-PLATES §2.7 invented `regex_strict` for.
477
+ fee: "$50 initial personalisation; $50 to reactivate a registration expired more than two years; $50 to reissue to a different owner (NJ MVC). Dedicated plates may additionally be personalised with up to FIVE characters for an initial $100 plus the annual renewal."
478
+ region_encoding: none
479
+ sources:
480
+ - "https://www.nj.gov/mvc/vehicles/personalized.htm # NJ MVC: 'at least three letters and a maximum of seven characters in combination of letters and numbers'; the $50 fee tiers; Form SP-2"
481
+ - "https://www.nj.gov/mvc/vehicles/dedicated.htm # NJ MVC: dedicated plates personalisable 'with up to five characters' for an initial $100 fee plus the annual renewal — a TIGHTER cap on a specialty base than on the standard one"
482
+ notes: >-
483
+ PERSONALISED. The five-character cap on a DEDICATED base versus seven on
484
+ the standard base is a real, agency-stated asymmetry and a trap for any
485
+ validator that treats personalisation as one rule per state.
486
+
487
+ # =========================================================================
488
+ # SPECIALTY — THE PROGRAM INDEX, per PRD-PLATES §2.5.
489
+ # =========================================================================
490
+ - id: us-nj-specialty-index
491
+ class: specialty
492
+ categories: [car, van, truck, motorcycle]
493
+ period: { start: 2014 }
494
+ period_evidence: agency-page-in-force
495
+ format_evidence: official-agency-text
496
+ matching: strict
497
+ format:
498
+ pattern: "L99 LLL"
499
+ regex: '\A[A-Z]\d{2} ?[A-Z]{3}\z'
500
+ charset: { notes: "specialty plates carry ORDINARY serials on an alternative design; when personalised they are capped at five characters rather than seven (NJ MVC)." }
501
+ design:
502
+ background: { finish: retroreflective }
503
+ note: "one design per approved programme; the designs themselves are L4 scope (PRD-PLATES §2.5) and none is described here"
504
+ emblem: { present: true, rendered: placeholder }
505
+ program_index:
506
+ structure_official: >-
507
+ NJ MVC splits its programme into FIVE named tracks rather than one list:
508
+ Dedicated (special interest), Organizational, Sports, Military and
509
+ Volunteer, and Professional. Any single count for New Jersey is therefore
510
+ a count of one track, and this index refuses to invent a total.
511
+ count_dedicated: 17
512
+ count_dedicated_method: "ENUMERATED BY HAND from NJ MVC's own dedicated-plate page, read 2026-08-02: Organ Donor, Law Enforcement Memorial, Animal Friendly, Agriculture, Meadowlands, Deborah Heart & Lung, Liberty State Park, Treasure our Trees, Pinelands, United We Stand, Discover NJ History, Baymen's Heritage, Conquer Cancer, USS New Jersey Battleship, Olympic Spirit, Shore to Please, Conserve Wildlife. The agency states no count of its own — this is our enumeration of the agency's own list and is labelled as such."
513
+ count_organizational_types: 3
514
+ count_organizational_note: "NJ MVC states 'three organizational plate types' — Service Organizations, Community Organizations, Alumni Organizations — and does not publish the number of organisations within them. NOT a plate count."
515
+ count_total: null
516
+ count_total_note: "NO OFFICIAL TOTAL EXISTS for New Jersey and none is fabricated here. This is the honest opposite of Florida, where FLHSMV states 'over 100' itself."
517
+ dedicated_list_url: "https://www.nj.gov/mvc/vehicles/dedicated.htm"
518
+ organizational_list_url: "https://www.nj.gov/mvc/vehicles/organizational.htm"
519
+ sports_list_url: "https://www.nj.gov/mvc/vehicles/sport.htm"
520
+ index_url: "https://www.nj.gov/mvc/vehicles/standplates.htm"
521
+ fee_structure: "dedicated plates: $50 initial and $10 annual renewal, with two agency-stated exceptions — USS New Jersey Battleship is $15 annual, and Agriculture is $20 initial with NO annual renewal (NJ MVC). The exceptions matter: a fee model that assumes one rule per state gets New Jersey wrong twice."
522
+ churn_note: "no discontinuation rule located; whether New Jersey retires dead programmes is a recorded gap."
523
+ region_encoding: none
524
+ sources:
525
+ - "https://www.nj.gov/mvc/vehicles/dedicated.htm # the 17 dedicated plates enumerated above, the $50/$10 fee structure and its two exceptions, the five-character personalisation cap"
526
+ - "https://www.nj.gov/mvc/vehicles/organizational.htm # NJ MVC: 'three organizational plate types' - Service, Community, Alumni; 'Plate fees vary by plate type'"
527
+ - "https://www.nj.gov/mvc/vehicles/standplates.htm # the five-track structure: Personalized, Dedicated, Specialty/Organizational, Sports, Special Vehicle (Historic/Hot Rod), Disability"
528
+ notes: >-
529
+ THE SPECIALTY PROGRAM INDEX. New Jersey is the case that shows why
530
+ `count_official` must be nullable: the state genuinely does not publish a
531
+ total, its programme is split across five tracks with different fee rules,
532
+ and any single number would be our invention. Recording 17 enumerated
533
+ dedicated plates plus three organisational TYPES plus an explicit null
534
+ total is the whole truth and is more useful to a consumer than a confident
535
+ wrong integer.
536
+
537
+ # ---------------------------------------------------------------------------
538
+ # GAPS.
539
+ # ---------------------------------------------------------------------------
540
+ gaps:
541
+ - "NO OFFICIAL SOURCE FOR THE PASSENGER SERIAL ARRANGEMENT. The 3+3 grouping is agency-image-sourced; the letter/digit arrangement within the groups is locator-only."
542
+ - "N.J.S.A. 39:3-33 was read through a third-party reproduction. The official New Jersey Legislature statute service was not reachable; re-derive before applying."
543
+ - "NO SOURCED PLATE DIMENSION or colour VALUE — Title 39 states neither."
544
+ - "The trailer T and dealer D literals are INFERENCES from placeholder convention, not sources. Flagged in-series."
545
+ - "NJ MVC's temporary-tag page 404'd twice; validity period and design unobtained."
546
+ - "Burnett v. County of Bergen and N.J.S.A. 52:18A-234.5 were not fetched — the artwork posture rests on the State's own legal statement, which WAS fetched."
547
+ - "No New Jersey equivalent of Florida's monthly issuance-volume report was found."