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,256 @@
1
+ # plates/ca-sk.yml — Saskatchewan (PRD-PLATES gate L3, Canada west).
2
+ #
3
+ # ── THE HONEST HEADLINE: THIS IS THE THINNEST FILE IN THE CANADA-WEST GROUP,
4
+ # AND THE REASON IS INFRASTRUCTURE, NOT SASKATCHEWAN.
5
+ #
6
+ # Two things had to be reached to source Saskatchewan properly and neither was:
7
+ #
8
+ # * THE STATUTE AND REGULATIONS. Saskatchewan publishes its consolidated law
9
+ # through publications.saskatchewan.ca, whose document IDs are only
10
+ # discoverable through a JavaScript front end. The REST API was probed
11
+ # directly (`/api/v1/products?...`, `/api/v1/products/{id}`,
12
+ # `/api/v1/products/{id}/formats/{fid}/download`, `/api/v1/freelaw/...`)
13
+ # and every path either 404s or rejects the parameter shape; the legacy
14
+ # qp.gov.sk.ca statute paths no longer resolve; the pubsask blob-storage
15
+ # paths 404. No Saskatchewan statute or regulation was read in this pass.
16
+ # WebSearch was unavailable (session budget exhausted at the first call),
17
+ # so ID discovery by search was not possible either.
18
+ # * SGI'S OWN PAGES. sgi.sk.ca is a Liferay single-page application: the
19
+ # licence-plate and personalized-plate URLs return HTTP 200 with a shell
20
+ # containing navigation only, and no plate rules in the served HTML.
21
+ #
22
+ # What WAS reached is worth having and is the spine of this file: two
23
+ # Government of Saskatchewan NEWS RELEASES, served in full, dated, attributed,
24
+ # and quoting the responsible minister. They settle the single-plate question
25
+ # to the DAY. Everything about the SERIAL, by contrast, is secondary.
26
+ #
27
+ # ── THE ONE HARD FACT, VERBATIM ────────────────────────────────────────────
28
+ #
29
+ # Government of Saskatchewan, "SASKATCHEWAN MOVES TO A SINGLE PLATE ON JUNE
30
+ # 30TH", 28 June 2004:
31
+ # "Saskatchewan's new, single licence plate system will take effect on
32
+ # June 30th."
33
+ # "Because the legislative and administrative changes required were completed
34
+ # faster than expected, the single plate system is being introduced a month
35
+ # earlier than previously announced," Minister responsible for SGI Maynard
36
+ # Sonntag said.
37
+ # "Starting June 30th, SGI will issue a single plate on transactions requiring
38
+ # a new plate. On existing registrations, customers will have the choice to
39
+ # remove their existing front plate."
40
+ # "Alberta, Quebec, Newfoundland and Labrador, Nova Scotia, Prince Edward
41
+ # Island and the three territories use single licence plates."
42
+ #
43
+ # Three things that release gives us that no encyclopedia table can. (1) A
44
+ # CHANGEOVER DATE, 30 June 2004, from the government that made it. (2) The
45
+ # TRANSITION MECHANICS: new plates single from that date, existing registrations
46
+ # grandfathered with an OPTION to remove the front plate — so Saskatchewan front
47
+ # plates remained lawfully in service indefinitely after 2004, and a
48
+ # two-plate Saskatchewan vehicle is not evidence of a pre-2004 registration.
49
+ # (3) A CROSS-JURISDICTION ROLL-CALL that independently corroborates the
50
+ # single-plate finding in plates/ca-ab.yml, plates/ca-yt.yml, plates/ca-nt.yml
51
+ # and plates/ca-nu.yml — cited in each of those files, from outside.
52
+ #
53
+ # ── PERIOD DISCIPLINE, STATED UP FRONT ─────────────────────────────────────
54
+ # Every serial-format claim below is graded `secondary-wikipedia` under the
55
+ # PRD-PLATES § 4 Wikipedia row's tagging condition. None of them is traced to a
56
+ # Saskatchewan instrument or to SGI, because neither was reachable. A verifier
57
+ # with working access to publications.saskatchewan.ca should treat every such
58
+ # grade as an open item; they are enumerated in the dossier.
59
+ jurisdiction: ca-sk
60
+ authority:
61
+ name: Saskatchewan Government Insurance (SGI), as administrator of the Saskatchewan Auto Fund and the driver and vehicle registry
62
+ url: "https://sgi.sk.ca/personalized-plates"
63
+ authority_url_note: >-
64
+ sgi.sk.ca serves a JavaScript application; this URL returns HTTP 200 with no
65
+ substantive body text. It is recorded as the correct address. NOTHING in this
66
+ file is sourced to it.
67
+ binding: vehicle
68
+ binding_note: >-
69
+ Not established from any Saskatchewan instrument in this pass. Saskatchewan
70
+ registers vehicles through SGI and issues plates against the registration; the
71
+ transfer rules were not read. Recorded gap.
72
+ instrument:
73
+ status: not-read
74
+ note: >-
75
+ NEGATIVE FINDING, recorded so nobody repeats the hunt. The Traffic Safety
76
+ Act (S.S. 2004, c. T-18.1) and its vehicle-registration regulations are the
77
+ instruments that would carry Saskatchewan's plate law. Neither was obtained:
78
+ see the header for the exact paths probed on publications.saskatchewan.ca,
79
+ pubsaskdev.blob.core.windows.net and qp.gov.sk.ca, all of which failed on
80
+ 2026-08-02.
81
+ news_releases:
82
+ - citation: "Government of Saskatchewan, 'SASKATCHEWAN MOVES TO A SINGLE PLATE ON JUNE 30TH', 28 June 2004"
83
+ source: "https://www.saskatchewan.ca/government/news-and-media/2004/june/28/saskatchewan-moves-to-a-single-plate-on-june-30th # full body served and read 2026-08-02"
84
+ - citation: "Government of Saskatchewan, 'SASKATCHEWAN LICENCE PLATES ARE GOING STICKERLESS', 2 October 2012"
85
+ source: "https://www.saskatchewan.ca/government/news-and-media/2012/october/02/saskatchewan-licence-plates-are-going-stickerless # headline and date confirmed by direct fetch 2026-08-02; the body did not extract from the served markup, so ONLY the headline claim is used"
86
+ licence: "saskatchewan.ca news releases are Government of Saskatchewan publications. Facts extracted, quoted for the operative sentences, not reproduced wholesale."
87
+
88
+ artwork_risk:
89
+ posture: unresearched-crown-copyright-presumed
90
+ basis: >-
91
+ Crown copyright under s. 12 of the Copyright Act (Canada) is the default and
92
+ no Saskatchewan disclaimer was found — nor could one be looked for properly,
93
+ since neither the Queen's/King's Printer nor SGI was reachable in a form
94
+ that serves text. Recorded as UNRESEARCHED. Note one structural difference
95
+ from every other jurisdiction in this group: Saskatchewan's plate authority
96
+ is a CROWN INSURANCE CORPORATION with commercial operations, as British
97
+ Columbia's is, which makes the "edict of government" argument weaker for
98
+ SGI's own materials than for a statute.
99
+ emblem_rule: "PRD-PLATES § 3 placeholder default applies to the wheat device reported at the centre of the standard base."
100
+ sources:
101
+ - "https://www.saskatchewan.ca/government/news-and-media/2004/june/28/saskatchewan-moves-to-a-single-plate-on-june-30th # the province's own publication of the plate regime"
102
+
103
+ display_rules:
104
+ count: >-
105
+ ONE plate since 30 June 2004, with the pre-2004 front plate lawfully
106
+ retained at the owner's option. Verbatim: "Starting June 30th, SGI will
107
+ issue a single plate on transactions requiring a new plate. On existing
108
+ registrations, customers will have the choice to remove their existing front
109
+ plate." CONSEQUENCE A CONSUMER MUST NOT MISS: because removal was OPTIONAL
110
+ rather than mandatory, a Saskatchewan vehicle carrying two plates is not
111
+ thereby datable, and the 2004 boundary is a boundary in ISSUANCE, not in
112
+ what is on the road.
113
+ before_2004: "Front and rear plates were required. The instrument that required them was not read (see instrument.status)."
114
+ validation_sticker: >-
115
+ Saskatchewan went STICKERLESS: Government of Saskatchewan news release of
116
+ 2 October 2012, headline verbatim, "SASKATCHEWAN LICENCE PLATES ARE GOING
117
+ STICKERLESS". Only the headline is relied on — the release body did not
118
+ extract from the served markup — so the claim carried here is exactly that
119
+ and no more: from around that date a Saskatchewan plate stops carrying a
120
+ validity decal. The effective date is NOT asserted.
121
+ sources:
122
+ - "https://www.saskatchewan.ca/government/news-and-media/2004/june/28/saskatchewan-moves-to-a-single-plate-on-june-30th # single-plate date and transition mechanics, quoted verbatim"
123
+ - "https://www.saskatchewan.ca/government/news-and-media/2012/october/02/saskatchewan-licence-plates-are-going-stickerless # headline only"
124
+
125
+ common:
126
+ separator_note: >-
127
+ The Saskatchewan serial is universally rendered as two groups of three with
128
+ a printed gap (`123 ABC`). No Saskatchewan source states a separator glyph.
129
+ Under PRD-PLATES § 2.8 the position is spelled with the sanctioned
130
+ separator-only class, and `pattern` shows the canonical printed space.
131
+ dimensions_note: >-
132
+ NEGATIVE FINDING. No dimension is sourced. The reported 12 x 6 in /
133
+ 30 x 15 cm North American convention is recorded here and asserted nowhere;
134
+ `design.plate` is absent from every series.
135
+ alphabet_note: >-
136
+ THE ONE GENUINELY INTERESTING SERIAL FACT ABOUT SASKATCHEWAN IS AN ALPHABET
137
+ WIDENING, AND IT IS SECONDARY. The per-province encyclopedia article reports
138
+ that letters I, O, Q, U and V were not used until 2009, when I, Q, U and V
139
+ were added to current serials — leaving O as the only permanent exclusion.
140
+ If that is right, a Saskatchewan serial containing I, Q, U or V is
141
+ 2009-or-later, which is a genuine era signal and the file's most useful
142
+ parse fact. It is NOT encoded in any `regex_strict`, because this programme
143
+ only ships a strict twin where the AUTHORITY states the alphabet (contrast
144
+ plates/ca-bc.yml, where ICBC states it in terms). Carried as
145
+ `charset.excluded` with its secondary grade instead.
146
+
147
+ series:
148
+
149
+ - id: ca-sk-standard
150
+ class: standard
151
+ categories: [car, van, truck, bus]
152
+ period: { start: 1998 }
153
+ period_evidence: secondary-wikipedia
154
+ matching: strict
155
+ format:
156
+ pattern: "999 LLL"
157
+ regex: '\A\d{3}[- ]?[A-Z]{3}\z'
158
+ evidence: secondary
159
+ charset:
160
+ excluded: ["O"]
161
+ excluded_before_2009: ["I", "O", "Q", "U", "V"]
162
+ notes: >-
163
+ Secondary only; see common.alphabet_note. The two lists are recorded
164
+ separately rather than merged because the DIFFERENCE between them is
165
+ the era signal, and merging would destroy it.
166
+ progression: "not published"
167
+ design:
168
+ background: { color: "#FFFFFF", finish: retroreflective, hex_basis: observed }
169
+ foreground: "#00693E"
170
+ legend_top: "SASKATCHEWAN"
171
+ legend_bottom: "Land of Living Skies"
172
+ emblem: { present: true, rendered: placeholder, description: "screened wheat graphic, centre" }
173
+ material: "aluminum (reported)"
174
+ design_basis: secondary
175
+ rear_differs: false
176
+ notes: >-
177
+ NUMERALS FIRST, LETTERS SECOND, REPORTED FROM MAY 1998 — the inverse of
178
+ the arrangement it replaced, which is the whole change. Both the
179
+ arrangement and the 1998 date come from the per-province encyclopedia
180
+ article's format table, tagged accordingly; no SGI or Saskatchewan source
181
+ was reachable to confirm either. The same table lists a further row
182
+ beginning "early 2009" with the SAME arrangement, which on inspection is
183
+ an ALPHABET change and not a format change (see common.alphabet_note) —
184
+ so it is recorded as a charset fact inside this series rather than minted
185
+ as a second series, on the PRD-PLATES § 2.3 test (own series iff format OR
186
+ design OR period differs; a charset widening inside one arrangement is
187
+ none of the three).
188
+ THE STRONGEST THING IN THIS RECORD IS NOT THE FORMAT. It is the display
189
+ regime: single plate since 30 June 2004, stickerless since around October
190
+ 2012, both from the province's own releases. A current Saskatchewan
191
+ vehicle therefore shows ONE plate carrying NO validity marker — the same
192
+ end state Idaho reached in July 2026 by abolishing both its sticker and
193
+ its replacement cycle, arrived at eleven years earlier by a different
194
+ route.
195
+ sources:
196
+ - "https://en.wikipedia.org/wiki/Vehicle_registration_plates_of_Saskatchewan # FINDING AID (PRD-PLATES §4 Wikipedia row): 123 ABC reported from May 1998, the 2009 alphabet widening, the green-on-white wheat design, 'Land of Living Skies', aluminium; accessed 2026-08-02"
197
+ - "https://www.saskatchewan.ca/government/news-and-media/2004/june/28/saskatchewan-moves-to-a-single-plate-on-june-30th # the single-plate regime this series is issued under"
198
+
199
+ - id: ca-sk-standard-1977
200
+ class: standard
201
+ categories: [car, van, truck, bus]
202
+ period: { start: 1977, end: 1998 }
203
+ period_evidence: secondary-wikipedia
204
+ matching: strict
205
+ format:
206
+ pattern: "LLL 999"
207
+ regex: '\A[A-Z]{3}[- ]?\d{3}\z'
208
+ evidence: secondary
209
+ charset:
210
+ excluded: ["I", "O", "Q", "U", "V"]
211
+ design:
212
+ background: { color: "#FFFFFF", finish: retroreflective, hex_basis: observed }
213
+ foreground: "#00693E"
214
+ legend_top: "SASKATCHEWAN"
215
+ design_basis: secondary
216
+ rear_differs: false
217
+ notes: >-
218
+ THE "ONE SERIES BACK". Three letters then three numerals, reported from
219
+ 1977 to May 1998, and issued under the TWO-PLATE regime that ran until
220
+ 30 June 2004 — so this series' vehicles are the ones the 2004 release's
221
+ grandfathering clause is about. Entirely secondary. Everything before
222
+ 1977 (a numeric `12-345` reported from 1923 and shorter numerics before
223
+ that) is NOT authored: one unfootnoted table is not enough to mint
224
+ decades of series.
225
+ sources:
226
+ - "https://en.wikipedia.org/wiki/Vehicle_registration_plates_of_Saskatchewan # FINDING AID: ABC 123 reported 1977 - May 1998; accessed 2026-08-02"
227
+ - "https://www.saskatchewan.ca/government/news-and-media/2004/june/28/saskatchewan-moves-to-a-single-plate-on-june-30th # the two-plate regime in force throughout this series"
228
+
229
+ - id: ca-sk-personalized
230
+ class: personalized
231
+ categories: [car, van, truck, motorcycle]
232
+ period: { start: 1998 }
233
+ period_evidence: not-established
234
+ matching: recall-only
235
+ format:
236
+ pattern: "LLLLLL"
237
+ regex: '\A[A-Z0-9](?:[- ]?[A-Z0-9])*\z'
238
+ evidence: none-obtained
239
+ design:
240
+ background: { color: "#FFFFFF", finish: retroreflective, hex_basis: observed }
241
+ foreground: "#00693E"
242
+ design_basis: secondary
243
+ notes: >-
244
+ AUTHORED AS AN EXISTENCE CLAIM ONLY, AND MARKED AS SUCH. SGI serves a page
245
+ at /personalized-plates (HTTP 200), so the programme exists; its rules —
246
+ character count, permitted characters, eligible classes, the design
247
+ catalogue — are behind a JavaScript front end that serves no body text,
248
+ and no Saskatchewan instrument was reachable to supply them. `period.start`
249
+ is a schema-satisfying floor tied to the current standard series and is
250
+ graded `not-established`: it must not be read as a claim. The regex is an
251
+ unbounded catch-all because Saskatchewan publishes no length bound that
252
+ was reachable — contrast plates/ca-yt.yml, whose regulation caps
253
+ personalized plates at six characters, and plates/ca-bc.yml, whose agency
254
+ bulletin caps every plate type at six.
255
+ sources:
256
+ - "https://sgi.sk.ca/personalized-plates # HTTP 200, JavaScript shell; existence of the programme only"