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,1273 @@
1
+ # plates/ch.yml — Switzerland (PRD-PLATES gate L1). DRAFT for verification.
2
+ #
3
+ # EVERY format, colour, layout and class claim in this file comes from the
4
+ # consolidated federal law on fedlex.admin.ch, fetched 2026-08-02:
5
+ # * VZV — Verordnung vom 27. Oktober 1976 über die Zulassung von Personen und
6
+ # Fahrzeugen zum Strassenverkehr (Verkehrszulassungsverordnung), SR 741.51,
7
+ # Stand am 1. Januar 2026. Art. 82-87a are THE plate chapter (heading "213
8
+ # Kontrollschilder"), Art. 90-97 the moped chapter, Art. 151 the transitional
9
+ # provisions that date three of the series below.
10
+ # * VVV — Verkehrsversicherungsverordnung vom 20. November 1959, SR 741.31,
11
+ # Stand am 1. Januar 2026. Art. 13-15 Wechselschilder, Art. 16-19 + Anhang 2
12
+ # provisional registration, Art. 20-21 Tagesausweise, Art. 22-26 Kollektiv-
13
+ # Fahrzeugausweise (the dealer-plate regime), Art. 35-37 the moped vignette.
14
+ # * VTS — Verordnung vom 19. Juni 1995 über die technischen Anforderungen an
15
+ # Strassenfahrzeuge, SR 741.41, Stand am 1. Januar 2026. Art. 45 + Anhang 4
16
+ # Ziff. 4 the "CH" distinguishing sign; Art. 96 front-and-rear duty.
17
+ # * WSchG — Wappenschutzgesetz vom 21. Juni 2013, SR 232.21, for the arms.
18
+ #
19
+ # ---------------------------------------------------------------------------
20
+ # THE SIX STRUCTURAL FACTS THAT SHAPE THIS FILE
21
+ # ---------------------------------------------------------------------------
22
+ #
23
+ # 1. THE PLATE BINDS TO THE OWNER, NOT THE VEHICLE — and the law says so in one
24
+ # sentence. Art. 87 Abs. 1 VZV, verbatim: "Die einmal zugeteilte Schildnummer
25
+ # bleibt für den Halter reserviert." (The number once allocated stays reserved
26
+ # FOR THE KEEPER.) Art. 87 Abs. 5 adds that the plates themselves "bleiben
27
+ # Eigentum der Behörde" — they never become the keeper's property, let alone
28
+ # the vehicle's. Three more provisions only make sense on that reading: VVV
29
+ # Art. 13 Abs. 2 issues a Wechselschild "nur für Fahrzeuge desselben Halters
30
+ # und mit Standort im gleichen Kanton"; VZV Art. 94 Abs. 5 lets a deregistered
31
+ # moped's plate be re-allocated "für ein anderes Motorfahrrad des gleichen
32
+ # Halters"; and VZV Art. 74 Abs. 5 gives the keeper 14 days to put another
33
+ # vehicle on the road before the plates must go back ("Lässt der Halter innert
34
+ # 14 Tagen kein anderes Fahrzeug in den Verkehr setzen, so hat er auch die
35
+ # Kontrollschilder unverzüglich zurückzugeben"). Hence `binding: owner`
36
+ # at the top of this file — the field PRD-PLATES §2.2 introduced for exactly
37
+ # this jurisdiction. A vehicle-keyed consumer must not join on a Swiss plate.
38
+ #
39
+ # 2. THE CANTON TABLE IS IN THE ORDINANCE, IT IS CLOSED, AND IT IS 26 ROWS.
40
+ # Art. 84 Abs. 1 VZV: "Jeder Kanton wird mit zwei grossen Buchstaben wie folgt
41
+ # bezeichnet:" followed by the table reproduced in plates/_decode/ch-cantons.yml
42
+ # (ZH BE LU UR SZ OW NW GL ZG FR SO BS BL SH AR AI SG GR AG TG TI VD VS NE GE
43
+ # JU, in the ordinance's own order of precedence). This is the German-Anlage-2
44
+ # case, not the German-district case: small, closed, primary, inlineable. The
45
+ # ONE period fact the table carries is also primary — the Jura row is footnoted
46
+ # "Kanton eingefügt durch Ziff. I der V vom 15. Nov. 1978, in Kraft seit
47
+ # 1. Jan. 1979 (AS 1978 1805)", so JU cannot appear on a plate allocated before
48
+ # 1979 and everything JU decodes to was BE before that.
49
+ #
50
+ # 3. FRONT AND REAR DIFFER, AND THE DIFFERENCE IS THE COATS OF ARMS. This is the
51
+ # single most-asked Swiss plate fact and Art. 85 answers it exactly:
52
+ # Abs. 1 (FRONT plate for Motorwagen; also the single plate for Motoreinachser,
53
+ # land- und forstwirtschaftliche Fahrzeuge and Arbeitsanhänger), verbatim:
54
+ # "sind von links nach rechts die zugeteilten Buchstaben, ein Punkt auf halber
55
+ # Höhe und die Zahlen aufzutragen." — letters, a MID-HEIGHT POINT, numbers.
56
+ # NO ARMS AT ALL on the front plate.
57
+ # Abs. 2 sentence 1 (REAR Hochformat for Motorwagen; and the plates for
58
+ # Motorräder, Kleinmotorräder, Leicht-, Klein- und dreirädrige Motorfahrzeuge,
59
+ # Transport- und Ausnahmeanhänger): "müssen im oberen Teil von links nach
60
+ # rechts das eidgenössische Wappen, die Kantonsbuchstaben und das
61
+ # Kantonswappen, im unteren Teil die Kontrollnummer tragen." — FEDERAL arms
62
+ # left, canton letters centre, CANTON arms right, number on the second line.
63
+ # Abs. 2 sentence 2 (REAR Langformat for Motorwagen and their trailers): "muss
64
+ # von links nach rechts das eidgenössische Wappen, die Kantonsbuchstaben,
65
+ # einen Punkt auf halber Höhe, die Kontrollnummer und das Kantonswappen
66
+ # tragen." — federal arms, letters, point, number, CANTON ARMS LAST.
67
+ # Abs. 3 (military trailers): "Das Wappen fällt weg."
68
+ # Abs. 4 + Art. 84 Abs. 4 (diplomatic/consular): the sign field replaces the
69
+ # arms and the plates "enthalten keine Wappen".
70
+ # Art. 84 Abs. 3 (federal plates): "tragen nur das eidgenössische Wappen".
71
+ # Art. 83 Abs. 2 governs how they are made: "Wappen, Buchstaben und Zahlen sind
72
+ # auf 1,5 mm erhaben gepresst. Die Wappen müssen der offiziellen Gestaltung
73
+ # entsprechen." Every series below carries the placement in
74
+ # `design.layout_front` / `design.layout_rear` so the render layer can lay out
75
+ # the emblem slots without re-reading the statute, and `rear_differs: true`
76
+ # where Art. 85 makes them differ.
77
+ #
78
+ # 4. THE ARMS CANNOT BE LICENSED — so §3's placeholder rule is not a caution here,
79
+ # it is the only lawful option. WSchG Art. 8 Abs. 1: "Das Schweizerwappen, die
80
+ # Wappen der Kantone, Bezirke, Kreise und Gemeinden ... dürfen nur von dem
81
+ # Gemeinwesen, zu dem sie gehören, gebraucht werden." Abs. 3: "Die Zeichen nach
82
+ # den Absätzen 1 und 2 können nicht lizenziert und nicht übertragen werden."
83
+ # There is therefore no clean-licence route to the exact artwork for ANY of the
84
+ # 27 arms (federal + 26 cantonal) — PRD-PLATES §6's "affirmatively clean per
85
+ # emblem" exit does not exist in Switzerland. Recorded honestly, and NOT read
86
+ # as legal advice: WSchG Art. 8 Abs. 4 lit. a does permit use "als Abbildung in
87
+ # Wörterbüchern, Nachschlagewerken, wissenschaftlichen und ähnlichen Werken",
88
+ # which is an encyclopedia-shaped exception a lawyer should look at before the
89
+ # site ships anything but placeholders. Until then: placeholders everywhere.
90
+ #
91
+ # 5. THERE IS NO EURO BAND, AND THE "CH" IS A STICKER, NOT PART OF THE PLATE.
92
+ # Nothing in VZV Art. 82-87a mentions a national band, a flag field or an EU
93
+ # strip. The distinguishing sign lives in a different ordinance and a different
94
+ # object: VTS Art. 45 Abs. 1 — "Motorfahrzeuge und Anhänger, die ins Ausland
95
+ # fahren, müssen hinten ein Landeszeichen nach Anhang 4 tragen" — and VTS
96
+ # Anhang 4 Ziff. 4: "Das Landeszeichen setzt sich aus den zwei lateinischen
97
+ # grossen Buchstaben «CH» zusammen. Sie müssen schwarz auf einer elliptischen
98
+ # weissen Fläche angebracht sein, deren Hauptachse waagrecht liegt", minimum
99
+ # ellipse 175 x 115 mm, letters 80 mm high, 40 mm wide, 10 mm stroke. It is
100
+ # required only for journeys abroad and is carried in `common.country_sign`,
101
+ # never in a series' `design.band`, which is `{ side: none }` everywhere.
102
+ #
103
+ # 6. THE PRINTED SEPARATOR IS A GLYPH THIS DATASET CANNOT EMIT — stated up front
104
+ # because it is the one place this file departs from what the plate shows.
105
+ # Art. 85 Abs. 1 and Abs. 2 prescribe "ein Punkt auf halber Höhe" between the
106
+ # canton letters and the number on every single-line plate. A mid-height point
107
+ # is U+00B7 MIDDLE DOT; U+00B7 is in _meta/separators.yml's FORGIVING set but
108
+ # NOT in its EMITTED set, so writing it would be a lint failure under
109
+ # PRD-PLATES §2.6, and rightly: the dataset commits to writing only "-" and
110
+ # " ". Two consequences, both benign:
111
+ # (a) `pattern` spells the gap as a SPACE — which is also literally correct
112
+ # for the two-line Hochformat and motorcycle plates, where Art. 85 Abs. 2
113
+ # puts the letters and the number on different lines and there is no
114
+ # point at all;
115
+ # (b) every `regex` accepts `[- ]?` at that position — hyphen, space, or
116
+ # nothing — and a §2.6-conformant consumer that strips the forgiving set
117
+ # maps a real "ZH·123456" onto "ZH123456", which the separator-free twin
118
+ # of these regexes matches exactly. The contract holds; only the printed
119
+ # glyph is unrepresentable. See the dossier for the amendment this file
120
+ # recommends (add U+00B7 to `forgiving` explicitly — it is already there —
121
+ # and record the Swiss point in `never_separator_note`'s neighbourhood as
122
+ # a KNOWN emitted-set gap rather than leaving it undocumented).
123
+ #
124
+ # ---------------------------------------------------------------------------
125
+ # REGEX POLICY (PRD-PLATES §2.7 tiers), applied consistently below
126
+ # ---------------------------------------------------------------------------
127
+ # regex the lint-round-trippable printed form: [A-Z]{2} for the
128
+ # canton, `[- ]?` for the point, and 1-6 digits. The SIX-DIGIT
129
+ # bound is the only number claim in this file that is NOT in
130
+ # the ordinance — see the gap note on `common.numbering`.
131
+ # regex_strict the sourced narrowing: the 26 canton codes of Art. 84 Abs. 1
132
+ # as a literal alternation, plus no-leading-zeros where
133
+ # Art. 84 Abs. 2's "beginnt ... in der Regel mit der Zahl 1"
134
+ # supports it (flagged as an INFERENCE, not a quotation).
135
+ # regex_statutory the outer legal bound: the ordinance caps NOTHING, so the
136
+ # statutory twin drops the digit ceiling entirely — and, for
137
+ # the U and Z plates, admits the marking letter in any of the
138
+ # positions the ordinance leaves open, because it prescribes
139
+ # the LETTER and not its place.
140
+ jurisdiction: ch
141
+ authority:
142
+ name: Bundesamt für Strassen (ASTRA) / kantonale Strassenverkehrsämter — Verkehrszulassungsverordnung (VZV)
143
+ url: "https://www.fedlex.admin.ch/eli/cc/1976/2423_2423_2423/de"
144
+ binding: owner
145
+ binding_note: >-
146
+ Art. 87 Abs. 1 VZV: "Die einmal zugeteilte Schildnummer bleibt für den Halter
147
+ reserviert." The plate is allocated to the KEEPER and follows the keeper, not
148
+ the vehicle; Art. 87 Abs. 5 keeps ownership of the physical plate with the
149
+ authority. This is the jurisdiction PRD-PLATES §2.4 names when it introduces
150
+ `binding:`; every series in this file inherits `owner` unless it says otherwise.
151
+ instrument:
152
+ citation: "Verordnung vom 27. Oktober 1976 über die Zulassung von Personen und Fahrzeugen zum Strassenverkehr (Verkehrszulassungsverordnung, VZV), SR 741.51, Stand am 1. Januar 2026"
153
+ ausfertigungsdatum: "1976-10-27"
154
+ entry_in_force: "1977-01-01"
155
+ stand: "2026-01-01"
156
+ companion_instruments:
157
+ - "Verkehrsversicherungsverordnung vom 20. November 1959 (VVV), SR 741.31, Stand am 1. Januar 2026"
158
+ - "Verordnung vom 19. Juni 1995 über die technischen Anforderungen an Strassenfahrzeuge (VTS), SR 741.41, Stand am 1. Januar 2026"
159
+ - "Bundesgesetz vom 21. Juni 2013 über den Schutz des Schweizerwappens und anderer öffentlicher Zeichen (Wappenschutzgesetz, WSchG), SR 232.21"
160
+ source: "https://www.fedlex.admin.ch/eli/cc/1976/2423_2423_2423/de # front matter: 'vom 27. Oktober 1976 (Stand am 1. Januar 2026)', SR-Nummer 741.51; dateEntryInForce 1977-01-01 per fedlex.data.admin.ch"
161
+
162
+ # ---------------------------------------------------------------------------
163
+ # Jurisdiction-wide facts, cited once and referenced per series.
164
+ # ---------------------------------------------------------------------------
165
+ common:
166
+ canton_codes: [AG, AI, AR, BE, BL, BS, FR, GE, GL, GR, JU, LU, NE, NW, OW, SG, SH, SO, SZ, TG, TI, UR, VD, VS, ZG, ZH]
167
+ canton_codes_note: >-
168
+ The 26 codes of Art. 84 Abs. 1 VZV, sorted alphabetically here for regex
169
+ derivation; the ordinance prints them in the constitutional order of
170
+ precedence (ZH BE LU UR SZ OW NW GL ZG FR SO BS BL SH AR AI SG GR AG TG TI VD
171
+ VS NE GE JU), which plates/_decode/ch-cantons.yml preserves. Closed list: the
172
+ ordinance says "Jeder Kanton wird mit zwei grossen Buchstaben wie folgt
173
+ bezeichnet" and then enumerates, so there is no open tail and no delegation —
174
+ the contrast with § 9 Abs. 3 FZV (Germany, ~400 codes in the Bundesanzeiger)
175
+ could not be sharper.
176
+ canton_codes_source: "https://www.fedlex.admin.ch/eli/cc/1976/2423_2423_2423/de # Art. 84 Abs. 1 VZV, the 26-row table, with the Jura footnote 'Kanton eingefügt durch Ziff. I der V vom 15. Nov. 1978, in Kraft seit 1. Jan. 1979 (AS 1978 1805)'"
177
+ numbering:
178
+ rule: >-
179
+ Art. 84 Abs. 2 VZV, verbatim: "Die Nummerierung beginnt für Motorwagen,
180
+ Motoreinachser und Anhänger einerseits und Motorräder, Klein- und
181
+ dreirädrige Motorfahrzeuge anderseits separat sowie für jede Schilderart
182
+ nach Grundfarbe und besonderer Kennzeichnung getrennt in der Regel mit der
183
+ Zahl 1."
184
+ consequences:
185
+ - "Number spaces are per CANTON x per BACKGROUND COLOUR x per SPECIAL MARKING, and additionally split between the motorcar/single-axle/trailer family and the motorcycle/small/three-wheeler family. A number therefore repeats across series and colours: 'ZH 12345' can exist simultaneously as a white car plate, a light-blue work-vehicle plate and a light-green agricultural plate."
186
+ - "TRAILERS SHARE THE MOTORCAR NUMBER SPACE. Art. 84 Abs. 2 groups 'Motorwagen, Motoreinachser und Anhänger' as one series, so a Swiss trailer registration is not distinguishable from a car registration by its string — only by the plate it is printed on."
187
+ - "No leading zeros: the numbering BEGINS at 1 and counts upward. Recorded as an INFERENCE from 'in der Regel mit der Zahl 1', not as a quotation of a no-leading-zero rule — 'in der Regel' expressly leaves room for exceptions. It lives in regex_strict, never in regex."
188
+ digit_ceiling: null
189
+ digit_ceiling_note: >-
190
+ RECORDED GAP, and the most important one in this file. NOTHING in the VZV,
191
+ the VVV or the VTS caps the number of digits in a Kontrollnummer. Art. 85
192
+ Abs. 5 delegates the typography — "Das ASTRA bestimmt das Schriftbild und
193
+ die Abmessungen für Buchstaben und Zahlen" — and the ASTRA determination was
194
+ not retrievable from any government source in this pass. Every `regex` below
195
+ therefore uses \d{1,6} as a PRACTICAL bound (six digits is the widest form
196
+ observed on issued plates, in the largest cantons), and every
197
+ `regex_statutory` drops the ceiling to \d+ because that is the honest outer
198
+ legal bound. A verifier who pins the ASTRA rule should tighten `regex` and
199
+ delete this note.
200
+ source: "https://www.fedlex.admin.ch/eli/cc/1976/2423_2423_2423/de # Art. 84 Abs. 2 (separate numbering per colour, marking and vehicle family) and Art. 85 Abs. 5 (ASTRA sets the script and dimensions)"
201
+ colours:
202
+ rule: >-
203
+ Art. 82 Abs. 1 VZV is an exhaustive list of the six background colours, and
204
+ it is the whole Swiss colour system: "Es werden abgegeben: a. Kontrollschilder
205
+ mit weissem Grund und schwarzer Schrift für Motorwagen, Motorräder, Klein-
206
+ und dreirädrige Motorfahrzeuge, Motoreinachser und Anhänger; b. ... mit
207
+ hellblauem Grund ... für Arbeitsfahrzeuge; c. ... mit hellbraunem Grund ...
208
+ für Ausnahmefahrzeuge; d. ... mit hellgrünem Grund ... für land- und
209
+ forstwirtschaftliche Fahrzeuge; e. ... mit gelbem Grund ... für
210
+ Kleinmotorräder und Leichtmotorfahrzeuge; f. Kontrollschilder mit
211
+ schattenschwarzem Grund und weisser Schrift für Armeefahrzeuge."
212
+ hex_basis_note: >-
213
+ The ordinance NAMES colours and gives no RAL or RGB value anywhere — the
214
+ same situation de.yml records for the German green and red plates. Every hex
215
+ below is therefore `hex_basis: observed`, chosen as the standard web colour
216
+ for the German colour word, and must not be treated as a spec value.
217
+ source: "https://www.fedlex.admin.ch/eli/cc/1976/2423_2423_2423/de # Art. 82 Abs. 1 lit. a-f"
218
+ special_markings:
219
+ rule: >-
220
+ Art. 82 Abs. 2 VZV, the closed list of specially-marked plates: "Besonders
221
+ gekennzeichnet werden: a. die Schilder für die provisorische Zulassung nach
222
+ Artikel 18 VVV; b. ...; c. die Händlerschilder mit dem Buchstaben «U»;
223
+ d. die Schilder für Fahrzeuge von Haltern mit diplomatischen oder
224
+ konsularischen Vorrechten und Immunitäten mit dem Zeichen «CD», «CC» oder
225
+ «AT» auf dunkelgrünem oder dunkelblauem Feld."
226
+ lit_b_repealed: "Aufgehoben durch Ziff. I der V vom 11. April 2001, mit Wirkung seit 1. Juni 2001 (AS 2001 1387) — the Mietwagen (rental-car) marking; modelled as ch-rental-1977, ENDED 2001."
227
+ consequence: >-
228
+ Anything NOT on this list carries an ordinary, unmarked plate. That is a
229
+ sourced NEGATIVE and it kills four series a naive reading would invent:
230
+ Tagesschilder (day plates, VVV Art. 20) are unmarked ordinary plates;
231
+ Wechselschilder (VVV Art. 13-15) are unmarked ordinary plates; police and
232
+ cantonal government fleets carry ordinary cantonal plates; and federal
233
+ administration vehicles are expressly registered "mit kantonalen
234
+ Kontrollschildern" (VFBF Art. 24 Abs. 1). Each is recorded as a variant or a
235
+ note, never as a series.
236
+ source: "https://www.fedlex.admin.ch/eli/cc/1976/2423_2423_2423/de # Art. 82 Abs. 2 lit. a-d and the footnote repealing lit. b"
237
+ dimensions:
238
+ rule: >-
239
+ Art. 83 Abs. 3 VZV: "Die Kontrollschilder weisen folgende Formate auf, wobei
240
+ die Ecken mit einem Radius von 1 cm abgerundet sind: a. Das vordere Schild
241
+ für Motorwagen sowie das Schild für Motoreinachser, land- und
242
+ forstwirtschaftliche Fahrzeuge und Arbeitsanhänger haben eine Länge von 30 cm
243
+ und eine Höhe von 8 cm. b. Das hintere Schild für Motorwagen sowie das Schild
244
+ für Transportanhänger an Motorwagen haben entweder eine Länge von 30 cm und
245
+ eine Höhe von 16 cm (Hochformat) oder eine Länge von 50 cm und eine Höhe von
246
+ 11 cm (Langformat). c. Das Schild für Motorräder, Klein- und dreirädrige
247
+ Motorfahrzeuge sowie für ihre Anhänger hat eine Länge von 18 cm und eine Höhe
248
+ von 14 cm. d. Das Schild für Kleinmotorräder und Leichtmotorfahrzeuge sowie
249
+ für ihre Anhänger hat eine Länge von 10 cm und eine Höhe von 14 cm."
250
+ front_motorcar: { w: 300, h: 80, unit: mm, corner_radius_mm: 10 }
251
+ rear_motorcar_hochformat: { w: 300, h: 160, unit: mm, corner_radius_mm: 10 }
252
+ rear_motorcar_langformat: { w: 500, h: 110, unit: mm, corner_radius_mm: 10 }
253
+ motorcycle: { w: 180, h: 140, unit: mm, corner_radius_mm: 10 }
254
+ light_and_small_motorcycle: { w: 100, h: 140, unit: mm, corner_radius_mm: 10 }
255
+ military_trailer: "Art. 83 Abs. 5: the two-line plate takes the motorcycle format, the single-line plate the front motorcar format"
256
+ diplomatic: "Art. 83 Abs. 4: for vehicles of keepers with diplomatic or consular privileges and immunities the ASTRA may set deviating formats"
257
+ source: "https://www.fedlex.admin.ch/eli/cc/1976/2423_2423_2423/de # Art. 83 Abs. 3 lit. a-d, Abs. 4, Abs. 5"
258
+ material:
259
+ rule: >-
260
+ Art. 83 Abs. 1 VZV: "Die Kontrollschilder bestehen aus korrosionsbeständigem
261
+ Metall; sie können mit einem rückstrahlenden Belag versehen sein. Das ASTRA
262
+ kann andere geeignete Materialien zulassen und Minimalanforderungen für das
263
+ rückstrahlende Material festlegen." Art. 83 Abs. 2: "Wappen, Buchstaben und
264
+ Zahlen sind auf 1,5 mm erhaben gepresst. Die Wappen müssen der offiziellen
265
+ Gestaltung entsprechen."
266
+ retroreflective_regime: >-
267
+ RETROREFLECTION IS OPTIONAL AND CANTONAL, which is unusual in Europe and is
268
+ the reason `finish` is `retroreflective-optional` throughout. Art. 87a VZV:
269
+ "Die Kantone stellen Schilder mit reflektierendem Belag zur Verfügung. Sie
270
+ entscheiden, ob solche Schilder für alle Fahrzeuge oder nur auf Ersuchen des
271
+ Halters abgegeben oder umgetauscht werden." Art. 87a was INSERTED by the
272
+ amendment of 15 April 1987, in force 1 May 1987 (AS 1987 628) — see the
273
+ period note on ch-standard. The single exception is the moped plate, where
274
+ Art. 94 Abs. 6 makes a yellow reflective coating mandatory.
275
+ embossing: "raised 1.5 mm — arms, letters and numbers alike (Art. 83 Abs. 2); Swiss plates are pressed metal, not printed"
276
+ source: "https://www.fedlex.admin.ch/eli/cc/1976/2423_2423_2423/de # Art. 83 Abs. 1-2 and Art. 87a"
277
+ font:
278
+ name: null
279
+ statutory_basis: >-
280
+ Art. 85 Abs. 5 VZV, verbatim and in its entirety: "Das ASTRA bestimmt das
281
+ Schriftbild und die Abmessungen für Buchstaben und Zahlen." No typeface is
282
+ named in the ordinance, no drawing is annexed to it, and the ASTRA's
283
+ determination was not retrievable from any government source in this pass.
284
+ licence: >-
285
+ NO LICENSABLE FONT IS MANDATED — the same finding the EU dossier records for
286
+ the UK, Germany and Spain, reached here by a different route: Switzerland
287
+ does not even publish a Schriftmuster in the ordinance, it delegates. Per
288
+ PRD-PLATES §6 the render layer therefore uses the schematic fallback and
289
+ records the substitution; no third-party "Swiss plate font" TTF is touched.
290
+ gap: "the ASTRA Schriftbild determination is a RECORDED GAP — unpinned, and the reason no character heights or stroke widths appear in this file"
291
+ source: "https://www.fedlex.admin.ch/eli/cc/1976/2423_2423_2423/de # Art. 85 Abs. 5"
292
+ country_sign:
293
+ letters: "CH"
294
+ shape: ellipse
295
+ background: "#FFFFFF"
296
+ foreground: "#000000"
297
+ min_ellipse: { w: 175, h: 115, unit: mm }
298
+ min_letters: { h: 80, w: 40, stroke: 10, unit: mm }
299
+ rule: >-
300
+ VTS Art. 45 Abs. 1: "Motorfahrzeuge und Anhänger, die ins Ausland fahren,
301
+ müssen hinten ein Landeszeichen nach Anhang 4 tragen." VTS Anhang 4 Ziff. 4:
302
+ "Das Landeszeichen setzt sich aus den zwei lateinischen grossen Buchstaben
303
+ «CH» zusammen. Sie müssen schwarz auf einer elliptischen weissen Fläche
304
+ angebracht sein, deren Hauptachse waagrecht liegt." — with the minimum
305
+ dimensions above. It is a SEPARATE OBJECT stuck on the vehicle, not a field
306
+ on the plate; Switzerland has no Euro band and no national strip.
307
+ source: "https://www.fedlex.admin.ch/eli/cc/1995/4425_4425_4425/de # VTS Art. 45 Abs. 1 and Anhang 4 Ziff. 4 (Mindestmasse: Höhe der Ellipse 11,5 cm, Breite 17,5 cm, Höhe der Buchstaben 8 cm, Breite 4 cm, Strichbreite 1 cm)"
308
+ display:
309
+ motorcar: "VTS Art. 96: 'Motorwagen müssen vorn und hinten das für diese Stellen bestimmte Kontrollschild tragen.' — front AND rear, and the two are physically different plates (see structural fact 3)"
310
+ motorcycle: "VTS Art. 136 Abs. 4: 'Bei Motorrädern, Leicht-, Klein- und dreirädrigen Motorfahrzeugen muss das Kontrollschild hinten angebracht werden.' — rear only, one plate"
311
+ agricultural: "VTS Art. 162 Abs. 1: agricultural and forestry motor vehicles carry ONE plate, front or rear as convenient; agricultural EXCEPTIONAL vehicles must carry one front and one rear"
312
+ single_axle: "VTS Art. 167: 'Das Kontrollschild muss gut sichtbar angebracht sein.'"
313
+ placement: "VTS Art. 45 Abs. 2: readable and as near vertical as possible; tilt at most 30° up / 15° down; lower edge at least 0.20 m and upper edge at most 1.50 m (0.10 m lower-edge minimum for M and N class front plates); the rear plate readable within 30° either side of the longitudinal axis"
314
+ source: "https://www.fedlex.admin.ch/eli/cc/1995/4425_4425_4425/de # VTS Art. 45 Abs. 2, Art. 96, Art. 136 Abs. 4, Art. 162 Abs. 1, Art. 167"
315
+ arms:
316
+ federal: { present: true, rendered: placeholder }
317
+ cantonal: { present: true, rendered: placeholder, count: 26 }
318
+ rule: "Art. 83 Abs. 2 VZV: 'Die Wappen müssen der offiziellen Gestaltung entsprechen.' Art. 85 Abs. 1-4 fixes WHERE they go (structural fact 3)."
319
+ licence_posture: >-
320
+ WSchG Art. 8 Abs. 1 reserves the Swiss and cantonal arms to the polity they
321
+ belong to; Abs. 3: "Die Zeichen nach den Absätzen 1 und 2 können nicht
322
+ lizenziert und nicht übertragen werden." There is no licensable route to the
323
+ artwork, so PRD-PLATES §3's placeholder is mandatory rather than merely
324
+ prudent. Abs. 4 lit. a's reference-work exception is noted, not relied on.
325
+ source: "https://www.fedlex.admin.ch/eli/cc/2015/613/20250701/de # WSchG Art. 8 Abs. 1, 3, 4 lit. a"
326
+ not_modelled:
327
+ - "EXPORT PLATES DO NOT EXIST. Art. 82 Abs. 1-2 VZV is exhaustive and has no export series; a vehicle permanently leaving Switzerland is simply deregistered. The nearest regime is the PROVISIONAL immatriculation of VVV Art. 16-19 (vehicles whose Standort is in Switzerland only for a limited time), which is modelled as ch-provisional. Sourced negative, not an omission."
328
+ - "HISTORIC / VETERAN PLATES DO NOT EXIST as a plate class. Art. 82's colour list has no historic entry and no VZV or VTS provision creates one; Swiss veteran vehicles carry ordinary white plates. (The administrative 'Veteranenfahrzeug' status is an entry in the Fahrzeugausweis; its federal basis was NOT located in the VZV or VTS text fetched here and is a recorded gap.) This is the only L1 core class Switzerland genuinely lacks."
329
+ - "TAXI PLATES DO NOT EXIST. Professional passenger transport is authorised on the driving licence (VZV Art. 25), not on the plate."
330
+ - "CANTONAL NUMBER AUCTIONS AND CHOSEN NUMBERS are cantonal law, outside the federal instruments read here, and are not modelled (PRD-PLATES §2.5 scope discipline)."
331
+
332
+ region_encoding_tables:
333
+ cantons:
334
+ reference: "plates/_decode/ch-cantons.yml"
335
+ inline_codes: [AG, AI, AR, BE, BL, BS, FR, GE, GL, GR, JU, LU, NE, NW, OW, SG, SH, SO, SZ, TG, TI, UR, VD, VS, ZG, ZH]
336
+ note: >-
337
+ 26 rows, closed, primary, and small enough for PRD-PLATES §2.4's "inline
338
+ table" branch — the codes are inlined here for regex derivation and the full
339
+ table with German/French/Italian names and the Jura period row lives in the
340
+ decode file. Two decode traps a parse API must carry: (1) the two-letter
341
+ canton code is fixed-width, so there is no maximal-munch problem of the
342
+ Spanish kind; (2) the code identifies the canton of the KEEPER's Standort
343
+ (VZV Art. 77), not where the vehicle is, and it follows the keeper on a
344
+ move — VZV Art. 120 (Standortwechsel) sends the annulled certificate and the
345
+ plates back to the former canton when a vehicle is admitted in another, and
346
+ VZV Art. 95 Abs. 2 states the moped equivalent expressly ("Wird der Standort
347
+ eines Motorfahrrads in einen andern Kanton verlegt, so ist beim neuen
348
+ Standortkanton ein neues Kontrollschild einzuholen").
349
+ source: "https://www.fedlex.admin.ch/eli/cc/1976/2423_2423_2423/de # Art. 84 Abs. 1"
350
+
351
+ series:
352
+
353
+ # =========================================================================
354
+ # THE STANDARD SERIES — white ground, black script, canton letters + number.
355
+ # =========================================================================
356
+ - id: ch-standard
357
+ class: standard
358
+ categories: [car, van, truck, bus]
359
+ period: { start: 1977 }
360
+ period_evidence: instrument-in-force
361
+ matching: strict
362
+ format:
363
+ pattern: "LL 999999"
364
+ regex: '\A[A-Z]{2}[- ]?\d{1,6}\z'
365
+ regex_strict: '\A(?:AG|AI|AR|BE|BL|BS|FR|GE|GL|GR|JU|LU|NE|NW|OW|SG|SH|SO|SZ|TG|TI|UR|VD|VS|ZG|ZH)[- ]?[1-9]\d{0,5}\z'
366
+ regex_statutory: '\A[A-Z]{2}[- ]?\d+\z'
367
+ charset:
368
+ letters: "exactly two, and only the 26 canton codes of Art. 84 Abs. 1 VZV"
369
+ notes: >-
370
+ The letter pair is NOT a free alphabet: Art. 84 Abs. 1 enumerates the 26
371
+ codes and nothing else may appear. regex keeps [A-Z]{2} only because the
372
+ lint round-trips it against the pattern's L placeholders; regex_strict
373
+ carries the enumeration, which is the sourced grammar.
374
+ progression: >-
375
+ Art. 84 Abs. 2: numbering starts at 1 per canton, per background colour,
376
+ per special marking, and separately for the motorcar/single-axle/trailer
377
+ family. Consequence for era inference: a Swiss plate encodes NO date
378
+ whatsoever — only the keeper's canton — and a low number means an early
379
+ allocation only within one canton's one colour, never nationally.
380
+ separator_note: >-
381
+ Printed as "ein Punkt auf halber Höhe" (Art. 85 Abs. 1) on the front and
382
+ long-format plates, and as a LINE BREAK on the Hochformat rear plate. The
383
+ pattern spells a space; the regex accepts hyphen, space or nothing. See
384
+ structural fact 6.
385
+ design:
386
+ plate: { w: 300, h: 80, unit: mm, note: "FRONT plate, corners rounded r=10 mm" }
387
+ plate_variants:
388
+ - { w: 300, h: 160, unit: mm, note: "REAR Hochformat (two-line)" }
389
+ - { w: 500, h: 110, unit: mm, note: "REAR Langformat (single-line)" }
390
+ background: { color: "#FFFFFF", finish: retroreflective-optional, hex_basis: observed, spec_note: "Art. 82 Abs. 1 lit. a names 'weissem Grund und schwarzer Schrift' with no RAL/RGB value; Art. 87a leaves retroreflection to the cantons" }
391
+ foreground: "#000000"
392
+ band: { side: none }
393
+ band_note: "no Euro band, no national strip — see structural fact 5; the 'CH' oval is a separate sticker under VTS Art. 45 Abs. 1 and is required only for journeys abroad"
394
+ emblem:
395
+ present: true
396
+ rendered: placeholder
397
+ note: "federal arms + the arms of the allocating canton, on the REAR plate only; WSchG Art. 8 Abs. 3 makes them unlicensable, so the placeholder rule is mandatory (structural fact 4)"
398
+ layout_front: "left to right: canton letters, a point at half height, the number. NO ARMS (Art. 85 Abs. 1)."
399
+ layout_rear: "Hochformat — upper part left to right: federal arms, canton letters, canton arms; lower part: the number. Langformat — left to right: federal arms, canton letters, point at half height, number, canton arms (Art. 85 Abs. 2)."
400
+ rear_differs: true
401
+ rear_differs_note: >-
402
+ TRUE, and structurally so: the Swiss front plate is 300x80 mm with no arms
403
+ at all, the rear plate is 300x160 or 500x110 mm and carries two coats of
404
+ arms. This is the UK-style asymmetry PRD-PLATES §2.2 introduced
405
+ `rear_differs` for, arriving in a stronger form than in the UK — there the
406
+ difference is colour, here it is size, layout and emblem content.
407
+ display: "front and rear (VTS Art. 96)"
408
+ region_encoding: "plates/_decode/ch-cantons.yml"
409
+ region_encoding_mechanism: >-
410
+ The two letters are the canton of the keeper's Standort — "der Ort, wo das
411
+ Fahrzeug nach Gebrauch in der Regel für die Nacht abgestellt wird"
412
+ (VZV Art. 77 Abs. 1), with the keeper's domicile deemed the Standort in the
413
+ three cases of Art. 77 Abs. 2. Closed 26-row table, primary, in Art. 84
414
+ Abs. 1 itself. Because the plate binds to the keeper, the code decodes the
415
+ KEEPER's canton and not the vehicle's location or origin.
416
+ variants:
417
+ - class: standard
418
+ note: >-
419
+ WECHSELSCHILDER (interchangeable plates, VVV Art. 13-15). One plate or
420
+ plate pair serves TWO vehicles of the same keeper with Standort in the
421
+ same canton — "Wechselschilder werden für höchstens zwei Fahrzeuge
422
+ erteilt. Diese Einschränkung gilt nicht für Arbeitsmotorwagen und
423
+ Anhänger" (Art. 13 Abs. 2) — and only that vehicle currently carrying the
424
+ plate may be used on public roads (Art. 14 Abs. 1). Motor vehicles pair
425
+ only with motor vehicles and trailers only with trailers, and both must
426
+ be able to carry the same KIND of plate (Art. 13 Abs. 3). A SUB-ENTRY and
427
+ not a series because the plate is ordinary and unmarked: Art. 82 Abs. 2's
428
+ list of specially-marked plates does not include it. Each vehicle still
429
+ gets its own Fahrzeugausweis (Art. 13 Abs. 4).
430
+ sources:
431
+ - "https://www.fedlex.admin.ch/eli/cc/1959/1271_1321_1317/de # VVV Art. 13 Abs. 2-4 (same keeper, same canton, at most two vehicles, motor-with-motor / trailer-with-trailer, separate Fahrzeugausweis), Art. 14 Abs. 1 (only the vehicle carrying the plate may run), Art. 15 (separate insurance proof per vehicle)"
432
+ - class: temporary
433
+ note: >-
434
+ TAGESSCHILDER (day plates, VVV Art. 20-21). Plates issued with a
435
+ Tagesausweis "für eine Gültigkeitsdauer von 24, 48, 72 oder 96 Stunden"
436
+ (Art. 20 Abs. 4), returnable at expiry (Abs. 5), for unpaid journeys only
437
+ with at most eight occupants besides the driver (Art. 20a Abs. 1). A
438
+ SUB-ENTRY and not a series, on the same sourced negative: Art. 82 Abs. 2
439
+ does not mark them, so they are ordinary plates from the canton's
440
+ ordinary number space.
441
+ sources:
442
+ - "https://www.fedlex.admin.ch/eli/cc/1959/1271_1321_1317/de # VVV Art. 20 Abs. 4-5 (24/48/72/96 hours, return at expiry), Art. 20a (unpaid journeys, occupant limit, dangerous-goods and heavy-goods exclusions), Art. 21 (collective liability insurance, surcharge for late return)"
443
+ - class: government
444
+ note: >-
445
+ POLICE, CANTONAL AND FEDERAL FLEETS carry ordinary cantonal plates.
446
+ Art. 82 Abs. 2 marks no government series, and the VFBF says so
447
+ affirmatively for the Confederation: "Verwaltungsfahrzeuge werden mit
448
+ kantonalen Kontrollschildern immatrikuliert" (Art. 24 Abs. 1). Only
449
+ ARMY vehicles get their own plates (ch-military-m). A sub-entry recording
450
+ a negative, so that a consumer does not go looking for a Swiss government
451
+ series that does not exist.
452
+ sources:
453
+ - "https://www.fedlex.admin.ch/eli/cc/2005/163/20240401/de # VFBF Art. 24 Abs. 1 (federal administration vehicles on cantonal plates), Art. 28 (only military vehicles, NDB and Armasuisse vehicles get Militärkontrollschilder)"
454
+ sources:
455
+ - "https://www.fedlex.admin.ch/eli/cc/1976/2423_2423_2423/de # VZV Art. 82 Abs. 1 lit. a (white ground, black script, for Motorwagen etc.); Art. 83 Abs. 1-3 (metal, 1.5 mm embossing, the four formats, 10 mm corner radius); Art. 84 Abs. 1-2 (the 26 canton codes; numbering per colour/marking/family from 1); Art. 85 Abs. 1-2 (front layout without arms, rear layouts with federal and cantonal arms); Art. 87 Abs. 1 and 5 (number reserved for the keeper; plates stay the authority's property); Art. 87a (cantonal discretion on retroreflective plates)"
456
+ - "https://www.fedlex.admin.ch/eli/cc/1995/4425_4425_4425/de # VTS Art. 96 (front and rear on Motorwagen); Art. 45 Abs. 2 (placement geometry)"
457
+ notes: >-
458
+ THE SWISS STANDARD SERIES. period.start 1977 is the VZV's own entry into
459
+ force (1 January 1977) and is marked `instrument-in-force` for the reason
460
+ de.yml marks its German equivalent: the canton-letters-plus-number system is
461
+ far older than the VZV — the federal Motorfahrzeuggesetz of 1932 is the
462
+ usual attribution — and NO PRIMARY for that origin date was secured in this
463
+ pass, so it is not asserted. What the consolidated ordinance does date is the
464
+ surrounding regime: Art. 83 Abs. 1-2 and Art. 85 Abs. 2's long-format layout
465
+ sentence take their present wording from the amendment of 15 April 1987, in
466
+ force 1 May 1987 (AS 1987 628), and the same amendment INSERTED Art. 87a
467
+ (cantons must make retroreflective plates available) and restated Art. 151
468
+ Abs. 5 ("Kontrollschilder früherer Formate sind zu ersetzen, wenn die
469
+ zuständige Behörde den Fahrzeughalter dazu auffordert"). So 1 May 1987 is a
470
+ real design boundary — before it there was no reflective-plate duty at all —
471
+ but the pre-1987 TEXT was not retrievable (fedlex publishes no machine-
472
+ readable consolidation before 2000 and the AS 1987 628 scan was unreachable),
473
+ so no pre-1987 design is described here and no separate pre-1987 series is
474
+ invented. That boundary is the single highest-value item on the verifier's
475
+ list. FORMAT STABILITY, stated plainly: unlike NL sidecodes or the Spanish
476
+ 2000 cutover, the Swiss STRING has not changed shape since at least 1977, so
477
+ a Swiss plate carries no era signal at all.
478
+
479
+ - id: ch-standard-trailer
480
+ class: trailer
481
+ categories: [trailer, semitrailer]
482
+ period: { start: 1977 }
483
+ period_evidence: instrument-in-force
484
+ matching: strict
485
+ format:
486
+ pattern: "LL 999999"
487
+ regex: '\A[A-Z]{2}[- ]?\d{1,6}\z'
488
+ regex_strict: '\A(?:AG|AI|AR|BE|BL|BS|FR|GE|GL|GR|JU|LU|NE|NW|OW|SG|SH|SO|SZ|TG|TI|UR|VD|VS|ZG|ZH)[- ]?[1-9]\d{0,5}\z'
489
+ regex_statutory: '\A[A-Z]{2}[- ]?\d+\z'
490
+ charset: { notes: "identical grammar to ch-standard — and, per Art. 84 Abs. 2, drawn from the SAME number space as motorcars" }
491
+ design:
492
+ plate: { w: 300, h: 160, unit: mm, note: "Transportanhänger an Motorwagen — Hochformat, or 500x110 Langformat" }
493
+ plate_variants:
494
+ - { w: 500, h: 110, unit: mm, note: "Transportanhänger, Langformat" }
495
+ - { w: 300, h: 80, unit: mm, note: "ARBEITSANHÄNGER take the front-plate format and the front-plate layout: letters, point, number, no arms (Art. 83 Abs. 3 lit. a + Art. 85 Abs. 1)" }
496
+ background: { color: "#FFFFFF", finish: retroreflective-optional, hex_basis: observed }
497
+ foreground: "#000000"
498
+ band: { side: none }
499
+ emblem: { present: true, rendered: placeholder, note: "federal + cantonal arms on Transport- und Ausnahmeanhänger plates (Art. 85 Abs. 2); ABSENT on Arbeitsanhänger plates (Art. 85 Abs. 1)" }
500
+ layout_rear: "Transport- und Ausnahmeanhänger: upper part federal arms, canton letters, canton arms; lower part the number (Art. 85 Abs. 2). Arbeitsanhänger: letters, point, number, no arms (Art. 85 Abs. 1)."
501
+ rear_differs: false
502
+ display: "one plate, at the rear"
503
+ region_encoding: "plates/_decode/ch-cantons.yml"
504
+ sources:
505
+ - "https://www.fedlex.admin.ch/eli/cc/1976/2423_2423_2423/de # VZV Art. 82 Abs. 1 lit. a (Anhänger take the white plate); Art. 83 Abs. 3 lit. a-b (Arbeitsanhänger 30x8, Transportanhänger 30x16 or 50x11); Art. 84 Abs. 2 (trailers share the motorcar number space); Art. 85 Abs. 1-2 (the two different layouts)"
506
+ - "https://www.fedlex.admin.ch/eli/cc/1959/1271_1321_1317/de # VVV Art. 13 Abs. 2 (Wechselschilder for trailers are not capped at two vehicles); Art. 22 Abs. 2bis (a towing vehicle's rear dealer plate may serve as the trailer's plate)"
507
+ notes: >-
508
+ SWISS TRAILER PLATES. Its own series rather than a variant of ch-standard for
509
+ one reason and one only: the DESIGN differs by trailer type — an
510
+ Arbeitsanhänger carries the armless 300x80 front-plate form while a
511
+ Transportanhänger carries the armed rear-plate form — which is exactly the
512
+ PRD-PLATES §2.3 test. The STRING, by contrast, is indistinguishable from a
513
+ car's: Art. 84 Abs. 2 puts "Motorwagen, Motoreinachser und Anhänger" in ONE
514
+ number space, so no consumer can tell a Swiss trailer registration from a car
515
+ registration by parsing it. Recorded here because a parse API that scores
516
+ ch-standard and ch-standard-trailer must return BOTH with equal confidence
517
+ and say why. Trailers up to and including 750 kg still need their own plate
518
+ in Switzerland — the Dutch "repeat the tractor's number on a white plate"
519
+ rule has no Swiss equivalent — except that VZV Art. 72 Abs. 1 lit. c exempts
520
+ certain agricultural and works trailers from registration altogether.
521
+
522
+ # =========================================================================
523
+ # MOTORCYCLES — same white plate, its own number space, 180x140 mm.
524
+ # =========================================================================
525
+ - id: ch-motorcycle
526
+ class: motorcycle
527
+ categories: [motorcycle, quadricycle]
528
+ period: { start: 1977 }
529
+ period_evidence: instrument-in-force
530
+ matching: strict
531
+ format:
532
+ pattern: "LL 999999"
533
+ regex: '\A[A-Z]{2}[- ]?\d{1,6}\z'
534
+ regex_strict: '\A(?:AG|AI|AR|BE|BL|BS|FR|GE|GL|GR|JU|LU|NE|NW|OW|SG|SH|SO|SZ|TG|TI|UR|VD|VS|ZG|ZH)[- ]?[1-9]\d{0,5}\z'
535
+ regex_statutory: '\A[A-Z]{2}[- ]?\d+\z'
536
+ progression: >-
537
+ SEPARATE NUMBER SPACE, and this is the one Swiss fact that partially
538
+ rescues plate-string disambiguation: Art. 84 Abs. 2 numbers "Motorräder,
539
+ Klein- und dreirädrige Motorfahrzeuge" apart from the motorcar family, so
540
+ the same canton runs two independent counters. A string alone still cannot
541
+ say which counter it came from — only the plate's SIZE can.
542
+ separator_note: "on the two-line motorcycle plate the letters and the number are on different lines (Art. 85 Abs. 2), so there is no printed point at all"
543
+ design:
544
+ plate: { w: 180, h: 140, unit: mm, corner_radius_mm: 10 }
545
+ background: { color: "#FFFFFF", finish: retroreflective-optional, hex_basis: observed }
546
+ foreground: "#000000"
547
+ band: { side: none }
548
+ emblem: { present: true, rendered: placeholder, note: "federal arms, canton letters, canton arms across the upper part (Art. 85 Abs. 2)" }
549
+ layout_rear: "upper part left to right: federal arms, canton letters, canton arms; lower part: the number (Art. 85 Abs. 2)"
550
+ rear_differs: false
551
+ display: "rear only, one plate (VTS Art. 136 Abs. 4)"
552
+ region_encoding: "plates/_decode/ch-cantons.yml"
553
+ sources:
554
+ - "https://www.fedlex.admin.ch/eli/cc/1976/2423_2423_2423/de # VZV Art. 82 Abs. 1 lit. a (Motorräder, Klein- und dreirädrige Motorfahrzeuge on the white plate); Art. 83 Abs. 3 lit. c (18 cm x 14 cm, also for their trailers); Art. 84 Abs. 2 (separate number space); Art. 85 Abs. 2 (two-line layout with both arms)"
555
+ - "https://www.fedlex.admin.ch/eli/cc/1995/4425_4425_4425/de # VTS Art. 136 Abs. 4 (rear plate only on Motorräder, Leicht-, Klein- und dreirädrige Motorfahrzeuge)"
556
+ notes: >-
557
+ MOTORCYCLE AND SMALL/THREE-WHEELER PLATES. Covers Motorräder, Kleinmotorfahrzeuge
558
+ and dreirädrige Motorfahrzeuge (the last two being the Swiss quadricycle and
559
+ trike categories), plus their trailers, all on the 180x140 mm two-line white
560
+ plate. NOT covered here: Kleinmotorräder and Leichtmotorfahrzeuge, which
561
+ Art. 82 Abs. 1 lit. e puts on the YELLOW plate — see ch-lightmotor-yellow.
562
+ The Swiss category boundary is genuinely counter-intuitive: "Kleinmotorrad"
563
+ (yellow) and "Klein- und dreirädriges Motorfahrzeug" (white) are different
564
+ legal animals whose names differ by two words.
565
+
566
+ # =========================================================================
567
+ # YELLOW — Kleinmotorräder and Leichtmotorfahrzeuge.
568
+ # =========================================================================
569
+ - id: ch-lightmotor-yellow
570
+ class: moped
571
+ categories: [moped, quadricycle]
572
+ period: { start: 1977 }
573
+ period_evidence: instrument-in-force
574
+ matching: strict
575
+ format:
576
+ pattern: "LL 999999"
577
+ regex: '\A[A-Z]{2}[- ]?\d{1,6}\z'
578
+ regex_strict: '\A(?:AG|AI|AR|BE|BL|BS|FR|GE|GL|GR|JU|LU|NE|NW|OW|SG|SH|SO|SZ|TG|TI|UR|VD|VS|ZG|ZH)[- ]?[1-9]\d{0,5}\z'
579
+ regex_statutory: '\A[A-Z]{2}[- ]?\d+\z'
580
+ charset: { notes: "same canton-plus-number grammar; the distinguishing feature is the yellow ground, not the string" }
581
+ design:
582
+ plate: { w: 100, h: 140, unit: mm, corner_radius_mm: 10 }
583
+ background: { color: "#FFFF00", finish: retroreflective-optional, hex_basis: observed, spec_note: "Art. 82 Abs. 1 lit. e names 'gelbem Grund und schwarzer Schrift'; no RAL/RGB in the ordinance" }
584
+ foreground: "#000000"
585
+ band: { side: none }
586
+ emblem: { present: true, rendered: placeholder, note: "Art. 85 Abs. 2 lists Kleinmotorräder and Leichtmotorfahrzeuge among the two-line plates carrying federal arms, canton letters and canton arms in the upper part" }
587
+ layout_rear: "upper part left to right: federal arms, canton letters, canton arms; lower part: the number (Art. 85 Abs. 2)"
588
+ rear_differs: false
589
+ display: "rear only (VTS Art. 136 Abs. 4)"
590
+ region_encoding: "plates/_decode/ch-cantons.yml"
591
+ sources:
592
+ - "https://www.fedlex.admin.ch/eli/cc/1976/2423_2423_2423/de # VZV Art. 82 Abs. 1 lit. e (yellow ground, black script, for Kleinmotorräder und Leichtmotorfahrzeuge — 'Fassung gemäss Anhang 1 Ziff. II 10 der V vom 19. Juni 1995 ..., in Kraft seit 1. Okt. 1995 (AS 1995 4425)'); Art. 83 Abs. 3 lit. d (10 cm x 14 cm, also for their trailers — 'Fassung gemäss Ziff. I der V vom 30. Nov. 2012, in Kraft seit 1. Juli 2013 (AS 2012 7149)'); Art. 84 Abs. 2 (own number space per colour); Art. 85 Abs. 2"
593
+ notes: >-
594
+ THE YELLOW PLATE FOR KLEINMOTORRÄDER AND LEICHTMOTORFAHRZEUGE. period.start
595
+ 1977 is the VZV's entry into force, because Art. 82 Abs. 1's structure is
596
+ original 1976 text; what IS separately dated is lit. e's present WORDING
597
+ (in force 1 October 1995, AS 1995 4425) and the 100x140 mm format of Art. 83
598
+ Abs. 3 lit. d (in force 1 July 2013, AS 2012 7149). Neither predecessor
599
+ wording was retrievable, so neither is described and no earlier series is
600
+ invented — the 2013 dimension change in particular is a candidate for a
601
+ pre-2013 series once AS 2012 7149's own text is read. DO NOT CONFUSE with
602
+ ch-motorfahrrad: both plates are yellow and both are 100x140 mm, but the
603
+ Motorfahrrad plate carries a mandatory reflective coating and an annual
604
+ insurance vignette and the Kleinmotorrad plate carries the two coats of arms.
605
+
606
+ # =========================================================================
607
+ # MOTORFAHRRÄDER — the yellow moped plate with the insurance vignette.
608
+ # =========================================================================
609
+ - id: ch-motorfahrrad
610
+ class: moped
611
+ categories: [moped]
612
+ period: { start: 1978 }
613
+ period_evidence: transitional-provision
614
+ matching: strict
615
+ format:
616
+ pattern: "LL 999999"
617
+ regex: '\A[A-Z]{2}[- ]?\d{1,6}\z'
618
+ regex_strict: '\A(?:AG|AI|AR|BE|BL|BS|FR|GE|GL|GR|JU|LU|NE|NW|OW|SG|SH|SO|SZ|TG|TI|UR|VD|VS|ZG|ZH)[- ]?[1-9]\d{0,5}\z'
619
+ regex_statutory: '\A[A-Z]{2}[- ]?\d+\z'
620
+ separator_note: "letters in the upper third, number in the lower part (Art. 94 Abs. 6) — a line break, not a printed point"
621
+ design:
622
+ plate: { w: 100, h: 140, unit: mm }
623
+ background: { color: "#FFFF00", finish: retroreflective, hex_basis: observed, spec_note: "Art. 94 Abs. 6: 'weisen einen gelb reflektierenden Belag auf' — the ONE Swiss plate where retroreflection is mandatory rather than cantonal" }
624
+ foreground: "#000000"
625
+ band: { side: none }
626
+ emblem: { present: false, note: "Art. 94 Abs. 6 places only the canton letters and the number; no arms are prescribed for cantonal moped plates. Federal moped plates DO carry a mark — see the variant." }
627
+ layout_rear: "upper third, left: the letters allocated to the canton; lower part: the number — both black and raised (Art. 94 Abs. 6). The insurance vignette goes in the upper third beside the letters (VVV Art. 35 Abs. 3)."
628
+ extra_field:
629
+ name: Versicherungsvignette
630
+ position: "upper third of the plate"
631
+ content: "the last two digits of the issue year plus an individual number"
632
+ validity: "1 January of the printed year to 31 May of the following year (VVV Art. 36 Abs. 1)"
633
+ note: >-
634
+ The Swiss moped plate is the only plate in this file that carries a
635
+ DATE, and it carries it on a sticker rather than in the serial: VVV
636
+ Art. 35 Abs. 1-3 makes the vignette the proof of liability insurance and
637
+ requires it to "die beiden letzten Ziffern des Abgabejahres sowie eine
638
+ individuelle Nummer tragen". A parse API cannot read it from the string;
639
+ an image pipeline can, and it dates the vehicle's insurance year exactly.
640
+ rear_differs: false
641
+ display: "one plate"
642
+ region_encoding: "plates/_decode/ch-cantons.yml"
643
+ variants:
644
+ - class: government
645
+ note: >-
646
+ FEDERAL MOPEDS carry a different mark: VZV Art. 96 Abs. 1 lit. a — the
647
+ plates are issued by the office competent under the VFBF, "sind
648
+ unbefristet gültig und tragen im obern Drittel von links nach rechts ein
649
+ weisses Schweizer Kreuz und die Buchstaben gemäss der VFBF", and no proof
650
+ of insurance is required. The VFBF calls them "Post- und Regie-
651
+ Kontrollschilder (PR-Schilder)" (Art. 27) but does NOT publish the letter
652
+ set, which is a RECORDED GAP — the letters are therefore not modelled and
653
+ no pattern is guessed. Cantonal mopeds for which no liability insurance
654
+ is taken out get "ordentliche kantonale Kontrollschilder einer besonderen
655
+ vom Kanton zu bestimmenden Nummernserie" (Art. 96 Abs. 2) — a cantonal
656
+ sub-series with no federal grammar.
657
+ sources:
658
+ - "https://www.fedlex.admin.ch/eli/cc/1976/2423_2423_2423/de # VZV Art. 96 Abs. 1 lit. a-c and Abs. 2"
659
+ - "https://www.fedlex.admin.ch/eli/cc/2005/163/20240401/de # VFBF Art. 27 (mopeds of the Confederation on PR-Schilder)"
660
+ sources:
661
+ - "https://www.fedlex.admin.ch/eli/cc/1976/2423_2423_2423/de # VZV Art. 90 (a moped is admitted with its Fahrzeugausweis, the plate named in it and a valid insurance vignette); Art. 94 Abs. 1-6 (issuing canton, one number reusable across several mopeds of the same keeper, 30-day substitute rule, transfer on vehicle change, and the 14x10 cm yellow reflective plate with the letters in the upper third left and the number below); Art. 95 Abs. 2 (a new plate from the new canton when the Standort moves); Art. 151 Abs. 6 (mopeds imported or made in Switzerland FROM 1 JANUARY 1978 must carry a Fahrzeugausweis and Kontrollschild under this ordinance; earlier ones ran on the old-law Etikette and transferable insurance mark until 31 December 1983)"
662
+ - "https://www.fedlex.admin.ch/eli/cc/1959/1271_1321_1317/de # VVV Art. 35 Abs. 1-4 (the vignette IS the insurance proof; design per Anhang 3; last two digits of the issue year plus an individual number; placed in the upper third of the plate; minimum cover CHF 2 million), Art. 36 Abs. 1 (valid 1 January of the printed year to 31 May of the following year)"
663
+ notes: >-
664
+ THE MOPED PLATE — and the one Swiss series with a genuinely dated start.
665
+ period.start 1978 is not an instrument date but a rule: VZV Art. 151 Abs. 6
666
+ requires mopeds imported or manufactured in Switzerland from 1 January 1978
667
+ to carry a Fahrzeugausweis and a Kontrollschild under the VZV, while mopeds
668
+ imported before that date stayed on the OLD regime — "Etikette,
669
+ übertragbares Versicherungskennzeichen" — until 31 December 1983. That old
670
+ regime is the true "one series back" for this class, and it is deliberately
671
+ NOT modelled as a series: a label and a transferable insurance mark have no
672
+ serial grammar to write a pattern for, and the instrument that created them
673
+ was repealed by VZV Art. 152 and not retrieved. Art. 94's present wording
674
+ dates from 1 January 2012 (AS 2011 4941). THE OWNER-BINDING IS SHARPEST
675
+ HERE: Art. 94 Abs. 3 lets the SAME plate number be entered in the
676
+ Fahrzeugausweise of several mopeds of the same keeper in the same canton,
677
+ and Abs. 4 lets it move to a substitute moped for up to 30 days without any
678
+ authorisation at all.
679
+
680
+ # =========================================================================
681
+ # LIGHT BLUE — Arbeitsfahrzeuge (work vehicles).
682
+ # =========================================================================
683
+ - id: ch-workvehicle-blue
684
+ class: standard
685
+ categories: [machine, truck]
686
+ period: { start: 1977 }
687
+ period_evidence: instrument-in-force
688
+ matching: strict
689
+ format:
690
+ pattern: "LL 999999"
691
+ regex: '\A[A-Z]{2}[- ]?\d{1,6}\z'
692
+ regex_strict: '\A(?:AG|AI|AR|BE|BL|BS|FR|GE|GL|GR|JU|LU|NE|NW|OW|SG|SH|SO|SZ|TG|TI|UR|VD|VS|ZG|ZH)[- ]?[1-9]\d{0,5}\z'
693
+ regex_statutory: '\A[A-Z]{2}[- ]?\d+\z'
694
+ charset: { notes: "same grammar; own number space per Art. 84 Abs. 2's per-colour split" }
695
+ design:
696
+ plate: { w: 300, h: 80, unit: mm, note: "front; rear 300x160 or 500x110 as for ch-standard" }
697
+ plate_variants:
698
+ - { w: 300, h: 160, unit: mm }
699
+ - { w: 500, h: 110, unit: mm }
700
+ background: { color: "#ADD8E6", finish: retroreflective-optional, hex_basis: observed, spec_note: "Art. 82 Abs. 1 lit. b names 'hellblauem Grund und schwarzer Schrift'; the hex is the standard web colour for the German colour word, NOT a spec value" }
701
+ foreground: "#000000"
702
+ band: { side: none }
703
+ emblem: { present: true, rendered: placeholder }
704
+ layout_front: "letters, point at half height, number; no arms (Art. 85 Abs. 1)"
705
+ layout_rear: "as ch-standard (Art. 85 Abs. 2)"
706
+ rear_differs: true
707
+ display: "front and rear on Motorwagen (VTS Art. 96)"
708
+ region_encoding: "plates/_decode/ch-cantons.yml"
709
+ sources:
710
+ - "https://www.fedlex.admin.ch/eli/cc/1976/2423_2423_2423/de # VZV Art. 82 Abs. 1 lit. b (light-blue ground, black script, for Arbeitsfahrzeuge — original 1976 text, no amending footnote); Art. 82 Abs. 3 (a plate change is required when the vehicle's classification changes, except for classification changes lasting at most six months on vehicles up to 3500 kg or three months on others); Art. 84 Abs. 2 (own number space per background colour)"
711
+ notes: >-
712
+ THE LIGHT-BLUE WORK-VEHICLE PLATE. CLASS CAVEAT, and it is a real one:
713
+ _meta/classes.yml has no value for a work vehicle (mobile crane, concrete
714
+ pump, construction machine), so `standard` is recorded as the least-wrong fit
715
+ and a VOCABULARY GAP is flagged for the L1 report — the natural additions are
716
+ `work-vehicle` for this series and `oversize` for ch-exceptional-brown.
717
+ Art. 82 Abs. 3 is worth a claims model's attention: the plate follows the
718
+ vehicle's CLASSIFICATION, so a vehicle that changes class must change plates
719
+ — with an explicit six-month (up to 3500 kg) or three-month (heavier)
720
+ tolerance. This is a Swiss series in the fullest sense: distinct colour,
721
+ distinct number space, same string grammar.
722
+
723
+ # =========================================================================
724
+ # LIGHT BROWN — Ausnahmefahrzeuge (vehicles exceeding the general limits).
725
+ # =========================================================================
726
+ - id: ch-exceptional-brown
727
+ class: standard
728
+ categories: [truck, machine, trailer]
729
+ period: { start: 1977 }
730
+ period_evidence: instrument-in-force
731
+ matching: strict
732
+ format:
733
+ pattern: "LL 999999"
734
+ regex: '\A[A-Z]{2}[- ]?\d{1,6}\z'
735
+ regex_strict: '\A(?:AG|AI|AR|BE|BL|BS|FR|GE|GL|GR|JU|LU|NE|NW|OW|SG|SH|SO|SZ|TG|TI|UR|VD|VS|ZG|ZH)[- ]?[1-9]\d{0,5}\z'
736
+ regex_statutory: '\A[A-Z]{2}[- ]?\d+\z'
737
+ design:
738
+ plate: { w: 300, h: 80, unit: mm, note: "front; rear 300x160 or 500x110" }
739
+ plate_variants:
740
+ - { w: 300, h: 160, unit: mm }
741
+ - { w: 500, h: 110, unit: mm }
742
+ background: { color: "#D2B48C", finish: retroreflective-optional, hex_basis: observed, spec_note: "Art. 82 Abs. 1 lit. c names 'hellbraunem Grund und schwarzer Schrift'; the hex is the standard web tone for the colour word, NOT a spec value" }
743
+ foreground: "#000000"
744
+ band: { side: none }
745
+ emblem: { present: true, rendered: placeholder }
746
+ layout_rear: "as ch-standard; Ausnahmeanhänger take the two-line layout with both arms (Art. 85 Abs. 2)"
747
+ rear_differs: true
748
+ region_encoding: "plates/_decode/ch-cantons.yml"
749
+ sources:
750
+ - "https://www.fedlex.admin.ch/eli/cc/1976/2423_2423_2423/de # VZV Art. 82 Abs. 1 lit. c (light-brown ground, black script, for Ausnahmefahrzeuge — original 1976 text); Art. 85 Abs. 2 (Ausnahmeanhänger among the two-line plates); Art. 84 Abs. 2"
751
+ - "https://www.fedlex.admin.ch/eli/cc/1959/1271_1321_1317/de # VVV Art. 22 Abs. 3 (a special authorisation is still required for Ausnahmefahrzeuge even when running on dealer plates)"
752
+ notes: >-
753
+ THE LIGHT-BROWN EXCEPTIONAL-VEHICLE PLATE. An "Ausnahmefahrzeug" is a vehicle
754
+ that exceeds the general dimension or weight limits and runs on a special
755
+ authorisation. SAME CLASS CAVEAT as ch-workvehicle-blue: `standard` is a
756
+ least-wrong fit for a vocabulary that has no `oversize` value, and the gap is
757
+ flagged rather than papered over. The colour is the whole identification —
758
+ the string is the ordinary canton-plus-number, from its own per-colour number
759
+ space.
760
+
761
+ # =========================================================================
762
+ # LIGHT GREEN — land- und forstwirtschaftliche Fahrzeuge.
763
+ # =========================================================================
764
+ - id: ch-agricultural-green
765
+ class: agricultural
766
+ categories: [tractor, machine, trailer]
767
+ period: { start: 1977 }
768
+ period_evidence: instrument-in-force
769
+ matching: strict
770
+ format:
771
+ pattern: "LL 999999"
772
+ regex: '\A[A-Z]{2}[- ]?\d{1,6}\z'
773
+ regex_strict: '\A(?:AG|AI|AR|BE|BL|BS|FR|GE|GL|GR|JU|LU|NE|NW|OW|SG|SH|SO|SZ|TG|TI|UR|VD|VS|ZG|ZH)[- ]?[1-9]\d{0,5}\z'
774
+ regex_statutory: '\A[A-Z]{2}[- ]?\d+\z'
775
+ design:
776
+ plate: { w: 300, h: 80, unit: mm, note: "Art. 83 Abs. 3 lit. a puts land- und forstwirtschaftliche Fahrzeuge on the 30x8 single-line form" }
777
+ background: { color: "#90EE90", finish: retroreflective-optional, hex_basis: observed, spec_note: "Art. 82 Abs. 1 lit. d names 'hellgrünem Grund und schwarzer Schrift'; no RAL/RGB in the ordinance" }
778
+ foreground: "#000000"
779
+ band: { side: none }
780
+ emblem: { present: false, note: "Art. 85 Abs. 1 puts agricultural and forestry vehicles on the ARMLESS layout — letters, point, number" }
781
+ layout_front: "left to right: canton letters, point at half height, number. No arms (Art. 85 Abs. 1)."
782
+ rear_differs: false
783
+ display: "ONE plate, front or rear at the operator's convenience; agricultural EXCEPTIONAL vehicles must carry one at each end (VTS Art. 162 Abs. 1)"
784
+ region_encoding: "plates/_decode/ch-cantons.yml"
785
+ sources:
786
+ - "https://www.fedlex.admin.ch/eli/cc/1976/2423_2423_2423/de # VZV Art. 82 Abs. 1 lit. d (light-green ground, black script, for land- und forstwirtschaftliche Fahrzeuge — 'Fassung gemäss Anhang 1 Ziff. II 10 der V vom 19. Juni 1995 ..., in Kraft seit 1. Okt. 1995 (AS 1995 4425)'); Art. 83 Abs. 3 lit. a (30 cm x 8 cm); Art. 85 Abs. 1 (armless layout); Art. 84 Abs. 2"
787
+ - "https://www.fedlex.admin.ch/eli/cc/1995/4425_4425_4425/de # VTS Art. 162 Abs. 1 (one plate, front or rear; two for agricultural exceptional vehicles)"
788
+ notes: >-
789
+ THE LIGHT-GREEN AGRICULTURAL PLATE — the only Swiss colour whose class maps
790
+ cleanly onto _meta/classes.yml. Two design facts set it apart from every other
791
+ colour: it is a 300x80 mm SINGLE plate (not a front/rear pair), and Art. 85
792
+ Abs. 1 groups it with the front plate, so it carries NO coats of arms at all.
793
+ lit. d took its present wording on 1 October 1995 (AS 1995 4425); the earlier
794
+ wording was not retrieved and no pre-1995 series is invented. Note the sharp
795
+ contrast with Germany's green plate, which is a TAX-EXEMPTION marker with an
796
+ agricultural majority — the Swiss green plate really is about agriculture and
797
+ forestry, and the VZV says so in those words.
798
+
799
+ # =========================================================================
800
+ # MILITARY — schattenschwarz ground, white script, the letter M.
801
+ # =========================================================================
802
+ - id: ch-military-m
803
+ class: military
804
+ categories: [car, van, truck, bus, motorcycle, trailer]
805
+ period: { start: 1977 }
806
+ period_evidence: instrument-in-force
807
+ matching: strict
808
+ format:
809
+ pattern: "M 999999"
810
+ regex: '\AM[- ]?\d{1,6}\z'
811
+ regex_strict: '\AM[- ]?[1-9]\d{0,5}\z'
812
+ regex_statutory: '\AM[- ]?\d+\z'
813
+ charset:
814
+ fixed_letters: "M"
815
+ notes: >-
816
+ Art. 84 Abs. 3 VZV, verbatim: "Die Kontrollschilder des Bundes tragen nur
817
+ das eidgenössische Wappen und erhalten den Buchstaben M für
818
+ Militärkontrollschilder." One letter, not two — the only Swiss series
819
+ whose prefix is not a canton code, which makes it the single most
820
+ reliable string-level identification in this file.
821
+ group_note: >-
822
+ Art. 85 Abs. 3 gives a real grouping rule for MILITARY TRAILERS: on the
823
+ two-line plate "werden die ersten zwei Zahlen im oberen Teil neben dem
824
+ zugeteilten Buchstaben aufgeführt"; on the single-line plate "wird ein
825
+ grösserer Abstand zwischen der zweiten und dritten Zahl gemacht". A 2+n
826
+ digit grouping the single-`pattern` schema cannot express.
827
+ design:
828
+ plate: { w: 300, h: 80, unit: mm, note: "single-line form; two-line military trailer plates take the motorcycle format (Art. 83 Abs. 5)" }
829
+ plate_variants:
830
+ - { w: 180, h: 140, unit: mm, note: "two-line military trailer plate (Art. 83 Abs. 5)" }
831
+ background: { color: "#1C1C1C", finish: painted, hex_basis: observed, spec_note: "Art. 82 Abs. 1 lit. f names 'schattenschwarzem Grund und weisser Schrift'; 'schattenschwarz' has no RAL or RGB value in the ordinance and the hex is a reading of the word, not a spec" }
832
+ foreground: "#FFFFFF"
833
+ band: { side: none }
834
+ emblem: { present: true, rendered: placeholder, note: "the federal arms ONLY — Art. 84 Abs. 3; no cantonal arms, because the plate is federal. On military TRAILER plates 'das Wappen fällt weg' entirely (Art. 85 Abs. 3)." }
835
+ painted_on_body: >-
836
+ Art. 82 Abs. 1 lit. f carries a provision no other European plate law in
837
+ this dataset has: "lassen sich diese Kontrollschilder nicht zweckmässig
838
+ anbringen, so werden Wappen, Buchstabe und Nummer in einem schattenschwarzen
839
+ Feld auf die Karosserie aufgemalt" — where a physical plate cannot sensibly
840
+ be fitted, the arms, letter and number are PAINTED ON THE BODYWORK in a
841
+ shadow-black field. A render layer must be able to emit a plate that is not
842
+ a plate.
843
+ rear_differs: false
844
+ binding: government
845
+ region_encoding: none
846
+ sources:
847
+ - "https://www.fedlex.admin.ch/eli/cc/1976/2423_2423_2423/de # VZV Art. 82 Abs. 1 lit. f (shadow-black ground, white script, army vehicles, and the paint-on-bodywork fallback); Art. 83 Abs. 5 (military trailer formats); Art. 84 Abs. 3 (federal plates carry only the federal arms and the letter M); Art. 85 Abs. 3 (military trailer digit grouping; no arms)"
848
+ - "https://www.fedlex.admin.ch/eli/cc/2005/163/20240401/de # VFBF Art. 28 (military vehicles and the vehicles of the Federal Intelligence Service and Armasuisse are registered by the SVSAA on Militärkontrollschilder); Art. 24 Abs. 1 (ordinary administration vehicles use CANTONAL plates instead); Art. 29 Übergangsbestimmung ('Fahrzeuge des Grenzwachtkorps und der Zolluntersuchungsbehörden dürfen noch bis spätestens am 31. Dezember 2023 mit militärischen Fahrzeugausweisen und Militärkontrollschildern verkehren')"
849
+ notes: >-
850
+ MILITÄRKONTROLLSCHILDER. `binding: government` overrides the file-level
851
+ `owner`: these plates are neither keeper-reserved nor cantonal — they are
852
+ issued and administered federally by the SVSAA under the VFBF. Two
853
+ boundaries a consumer must not blur: VFBF Art. 24 Abs. 1 puts ordinary
854
+ federal ADMINISTRATION vehicles on cantonal plates, so "federal vehicle" does
855
+ not imply an M plate; and VFBF Art. 29 required Grenzwachtkorps and customs
856
+ investigation vehicles to leave the military registers by 31 December 2023,
857
+ which is an ENDED sub-population inside a live series and exactly the kind of
858
+ row-level period discipline PRD-PLATES §2.4 warns about.
859
+
860
+ # =========================================================================
861
+ # DIPLOMATIC AND CONSULAR — CD, CC, AT on a dark green or dark blue field.
862
+ # =========================================================================
863
+ - id: ch-diplomatic-cd
864
+ class: diplomatic
865
+ categories: [car, van, motorcycle]
866
+ period: { start: 1977 }
867
+ period_evidence: instrument-in-force
868
+ matching: strict
869
+ format:
870
+ pattern: "CD LL 999-999"
871
+ regex: '\ACD[- ]?[A-Z]{2}[- ]?\d{1,4}[- ]\d{1,4}\z'
872
+ regex_strict: '\ACD[- ]?(?:AG|AI|AR|BE|BL|BS|FR|GE|GL|GR|JU|LU|NE|NW|OW|SG|SH|SO|SZ|TG|TI|UR|VD|VS|ZG|ZH)[- ]?\d{1,4}[- ]\d{1,4}\z'
873
+ regex_statutory: '\ACD[- ]?[A-Z]{2}[- ]?\d+[- ]\d+\z'
874
+ fields:
875
+ - { name: sign, value: "CD", note: "on a dark green or dark blue field (Art. 82 Abs. 2 lit. d)" }
876
+ - { name: canton, note: "the two canton letters, in BLACK — Art. 84 Abs. 4" }
877
+ - { name: mission_serial, note: "first number group: 'Ordnungsnummer innerhalb der Mission, des Postens, der Delegation oder der Organisation'; the LOWEST numbers are reserved for the head of mission and the deputies (Art. 84 Abs. 4)" }
878
+ - { name: state_code, note: "second number group: 'bezeichnet den einzelnen Staat oder die Organisation' — the country/organisation code. The code TABLE is an FDFA allocation and is NOT published in the VZV: recorded gap, deliberately not guessed (PRD-PLATES puts diplomatic decode tables at L4)." }
879
+ separator_note: >-
880
+ Art. 84 Abs. 4 prescribes "die Zahlen und der Punkt" and Art. 85 Abs. 4
881
+ "die durch einen Punkt getrennten zwei Zahlengruppen" — the group
882
+ separator is again a point the dataset cannot emit, spelled here as a
883
+ hyphen in the pattern and as an emitted-separator class in the regex.
884
+ digit_bound_note: "the ordinance caps NEITHER group; \\d{1,4} is a practical bound and regex_statutory drops it"
885
+ design:
886
+ plate: { w: 300, h: 80, unit: mm, note: "front; Art. 83 Abs. 4 lets the ASTRA set deviating formats for these plates" }
887
+ plate_variants:
888
+ - { w: 500, h: 110, unit: mm, note: "rear Langformat" }
889
+ - { w: 300, h: 160, unit: mm, note: "rear Hochformat" }
890
+ background: { color: "#FFFFFF", finish: retroreflective-optional, hex_basis: observed }
891
+ foreground: "#000000"
892
+ sign_field: { color: "#006400", alt_color: "#00008B", foreground: "#FFFFFF", hex_basis: observed, note: "Art. 82 Abs. 2 lit. d requires the CD/CC/AT sign to sit 'auf dunkelgrünem oder dunkelblauem Feld' but does NOT say which sign takes which colour — RECORDED GAP; the widely repeated green-for-CD / blue-for-CC-and-AT split is NOT sourced here and is flagged as folklore" }
893
+ band: { side: none }
894
+ emblem: { present: false, note: "Art. 84 Abs. 4, verbatim: the plates 'enthalten keine Wappen, jedoch Kantonsbuchstaben in schwarzer Farbe' — the ONLY Swiss road plates with no coat of arms at all" }
895
+ layout_front: "left to right: the field bearing the sign, the canton letters, then the two number groups separated by a point (Art. 85 Abs. 4)"
896
+ layout_rear: "Langformat as the front; Hochformat — upper part the sign field and the canton letters, lower part the two number groups (Art. 85 Abs. 4)"
897
+ manufacture: "Art. 84 Abs. 4: the sign and letters may be photographically and indelibly set into the metal; the numbers and the point in black may be applied the same way OR consist of stamped aluminium pieces riveted onto the plate — the only Swiss plate that is not necessarily embossed"
898
+ rear_differs: true
899
+ binding: owner
900
+ region_encoding: "plates/_decode/ch-cantons.yml"
901
+ sources:
902
+ - "https://www.fedlex.admin.ch/eli/cc/1976/2423_2423_2423/de # VZV Art. 82 Abs. 2 lit. d (CD/CC/AT on a dark green or dark blue field — 'Eingefügt durch Anhang 1 Ziff. II 10 der V vom 19. Juni 1995 ..., in Kraft seit 1. Okt. 1995 (AS 1995 4425)'); Art. 83 Abs. 4 (ASTRA may set deviating formats); Art. 84 Abs. 4 (no arms, black canton letters, the two dot-separated number groups and what each means, photographic or riveted manufacture); Art. 85 Abs. 4 (front / long-rear / high-rear layouts); Art. 86 Abs. 1 (who gets CD); Art. 87 Abs. 4 (issued in agreement with the FDFA)"
903
+ - "https://www.fedlex.admin.ch/eli/cc/1995/4425_4425_4425/de # VTS Art. 33 Abs. 6 (vehicles of keepers with diplomatic or consular privileges are exempt from periodic inspection)"
904
+ notes: >-
905
+ THE CD SERIES. Art. 86 Abs. 1 defines eligibility exactly: service cars of
906
+ diplomatic missions and the private vehicles of their diplomatic staff; the
907
+ same for permanent missions to intergovernmental organisations; and service
908
+ cars of institutional beneficiaries under Art. 2 Abs. 1 lit. a, b, i, j, k, l
909
+ and m of the Gaststaatgesetz (SR 192.12) plus the vehicles of their most
910
+ senior officials who enjoy diplomatic status in Switzerland. Art. 86 Abs. 4
911
+ forbids the use of a SEPARATE "CD" or "AT" sign (a loose badge) outright.
912
+ TWO RECORDED GAPS, both deliberate: the country/organisation code table
913
+ behind the second number group is an FDFA allocation and is not in the VZV;
914
+ and the ordinance does not assign the dark-green and dark-blue fields to
915
+ particular signs. Neither was guessed. The Swiss design choice is the mirror
916
+ image of Germany's: Germany hides diplomatic status in an ordinary-looking
917
+ plate, Switzerland puts a coloured sign field on the plate and takes the
918
+ coats of arms off.
919
+
920
+ - id: ch-consular-cc
921
+ class: consular
922
+ categories: [car, van, motorcycle]
923
+ period: { start: 1977 }
924
+ period_evidence: instrument-in-force
925
+ matching: strict
926
+ format:
927
+ pattern: "CC LL 999-999"
928
+ regex: '\ACC[- ]?[A-Z]{2}[- ]?\d{1,4}[- ]\d{1,4}\z'
929
+ regex_strict: '\ACC[- ]?(?:AG|AI|AR|BE|BL|BS|FR|GE|GL|GR|JU|LU|NE|NW|OW|SG|SH|SO|SZ|TG|TI|UR|VD|VS|ZG|ZH)[- ]?\d{1,4}[- ]\d{1,4}\z'
930
+ regex_statutory: '\ACC[- ]?[A-Z]{2}[- ]?\d+[- ]\d+\z'
931
+ charset: { notes: "identical structure to ch-diplomatic-cd; only the sign differs" }
932
+ design:
933
+ plate: { w: 300, h: 80, unit: mm }
934
+ plate_variants:
935
+ - { w: 500, h: 110, unit: mm }
936
+ - { w: 300, h: 160, unit: mm }
937
+ background: { color: "#FFFFFF", finish: retroreflective-optional, hex_basis: observed }
938
+ foreground: "#000000"
939
+ sign_field: { color: "#00008B", alt_color: "#006400", foreground: "#FFFFFF", hex_basis: observed, note: "dark blue OR dark green per Art. 82 Abs. 2 lit. d; the assignment is a recorded gap — see ch-diplomatic-cd" }
940
+ band: { side: none }
941
+ emblem: { present: false, note: "no arms (Art. 84 Abs. 4)" }
942
+ layout_front: "sign field, canton letters, two dot-separated number groups (Art. 85 Abs. 4)"
943
+ rear_differs: true
944
+ binding: owner
945
+ region_encoding: "plates/_decode/ch-cantons.yml"
946
+ sources:
947
+ - "https://www.fedlex.admin.ch/eli/cc/1976/2423_2423_2423/de # VZV Art. 86 Abs. 2 ('Das Zeichen «CC» ist für Dienstwagen der von einem Berufsbeamten geleiteten konsularischen Posten und für Motorfahrzeuge von Berufskonsularbeamten bestimmt'); Art. 86 Abs. 4 (separate CC signs allowed for at most one car of each honorary head of post holding the Federal Council's exequatur, with 'CC-Zeichen bewilligt' entered in the Fahrzeugausweis); Art. 82 Abs. 2 lit. d; Art. 84 Abs. 4; Art. 85 Abs. 4"
948
+ notes: >-
949
+ THE CC SERIES — career consular posts and career consular officers. Its own
950
+ series rather than a variant of CD because the printed sign is part of the
951
+ string. The one asymmetry worth recording: Art. 86 Abs. 4 bans separate
952
+ (loose) "CD" and "AT" signs absolutely, but permits a separate "CC" sign for
953
+ at most one car of each HONORARY head of post who has been granted the
954
+ exequatur — with the permission noted in the Fahrzeugausweis. So a Swiss "CC"
955
+ badge on a car is not necessarily a CC PLATE, which is a distinction an image
956
+ pipeline will meet before a string parser does.
957
+
958
+ - id: ch-diplomatic-at
959
+ class: diplomatic
960
+ categories: [car, van, motorcycle]
961
+ period: { start: 1977 }
962
+ period_evidence: instrument-in-force
963
+ matching: strict
964
+ format:
965
+ pattern: "AT LL 999-999"
966
+ regex: '\AAT[- ]?[A-Z]{2}[- ]?\d{1,4}[- ]\d{1,4}\z'
967
+ regex_strict: '\AAT[- ]?(?:AG|AI|AR|BE|BL|BS|FR|GE|GL|GR|JU|LU|NE|NW|OW|SG|SH|SO|SZ|TG|TI|UR|VD|VS|ZG|ZH)[- ]?\d{1,4}[- ]\d{1,4}\z'
968
+ regex_statutory: '\AAT[- ]?[A-Z]{2}[- ]?\d+[- ]\d+\z'
969
+ design:
970
+ plate: { w: 300, h: 80, unit: mm }
971
+ plate_variants:
972
+ - { w: 500, h: 110, unit: mm }
973
+ - { w: 300, h: 160, unit: mm }
974
+ background: { color: "#FFFFFF", finish: retroreflective-optional, hex_basis: observed }
975
+ foreground: "#000000"
976
+ sign_field: { color: "#00008B", alt_color: "#006400", foreground: "#FFFFFF", hex_basis: observed, note: "dark blue OR dark green per Art. 82 Abs. 2 lit. d; assignment is a recorded gap" }
977
+ band: { side: none }
978
+ emblem: { present: false }
979
+ layout_front: "sign field, canton letters, two dot-separated number groups (Art. 85 Abs. 4)"
980
+ rear_differs: true
981
+ binding: owner
982
+ region_encoding: "plates/_decode/ch-cantons.yml"
983
+ sources:
984
+ - "https://www.fedlex.admin.ch/eli/cc/1976/2423_2423_2423/de # VZV Art. 86 Abs. 3 ('Das Zeichen «AT» ist für Motorfahrzeuge der Mitglieder des Verwaltungs- und technischen Personals der diplomatischen Missionen bestimmt'); Art. 86 Abs. 4 (separate AT signs forbidden); Art. 82 Abs. 2 lit. d; Art. 84 Abs. 4; Art. 85 Abs. 4"
985
+ notes: >-
986
+ THE AT SERIES — administrative and technical staff of diplomatic missions.
987
+ Recorded as `class: diplomatic` because _meta/classes.yml has no finer value;
988
+ the legal category is narrower than CD and sits below it in the privileges
989
+ hierarchy, which the sign itself is designed to show. Switzerland is unusual
990
+ in giving A&T staff their own SIGN at all: most jurisdictions fold them into
991
+ the diplomatic or the ordinary series.
992
+
993
+ # =========================================================================
994
+ # PROVISIONAL REGISTRATION — the red bar, the control sticker, and "Z".
995
+ # =========================================================================
996
+ - id: ch-provisional
997
+ class: temporary
998
+ categories: [car, van, truck, bus, motorcycle, trailer]
999
+ period: { start: 1977 }
1000
+ period_evidence: instrument-in-force
1001
+ matching: strict
1002
+ format:
1003
+ pattern: "LL 999999"
1004
+ regex: '\A[A-Z]{2}[- ]?\d{1,6}\z'
1005
+ regex_strict: '\A(?:AG|AI|AR|BE|BL|BS|FR|GE|GL|GR|JU|LU|NE|NW|OW|SG|SH|SO|SZ|TG|TI|UR|VD|VS|ZG|ZH)[- ]?[1-9]\d{0,5}\z'
1006
+ regex_statutory: '\A[A-Z]{2}[- ]?\d+\z'
1007
+ charset:
1008
+ notes: >-
1009
+ Same string grammar as an ordinary plate — the special marking is the RED
1010
+ BAR, which is a design element and not a character. VVV Anhang 2 A Ziff. 1:
1011
+ "Die Schilder für provisorisch immatrikulierte Motorfahrzeuge werden
1012
+ unabhängig von den übrigen Kontrollschildern nummeriert. Mit der
1013
+ Nummerierung kann von vorne begonnen werden, wenn Gewähr besteht, dass
1014
+ sich nicht gleichzeitig zwei verschiedene provisorisch immatrikulierte
1015
+ Motorwagen oder Motorräder mit gültigen Kontrollschildern gleicher Nummer
1016
+ in Verkehr befinden." — an independently restartable number space, the
1017
+ only one in this file that may legally REUSE a number.
1018
+ design:
1019
+ plate: { w: 300, h: 80, unit: mm, note: "VVV Anhang 2 A Ziff. 2: these plates are of THIN SHEET METAL and otherwise follow VZV Art. 83 and 85" }
1020
+ plate_variants:
1021
+ - { w: 500, h: 110, unit: mm }
1022
+ - { w: 300, h: 160, unit: mm }
1023
+ - { w: 180, h: 140, unit: mm, note: "motorcycle" }
1024
+ background: { color: "#FFFFFF", finish: retroreflective-optional, hex_basis: observed }
1025
+ foreground: "#000000"
1026
+ band: { side: none }
1027
+ emblem: { present: true, rendered: placeholder, note: "as the ordinary plates — VVV Anhang 2 A Ziff. 2 applies VZV Art. 83 and 85 unchanged" }
1028
+ extra_field:
1029
+ name: "roter Balken"
1030
+ position: "immediately after the control number"
1031
+ color: "#FF0000"
1032
+ hex_basis: observed
1033
+ raised: true
1034
+ dimensions: { front_and_motorcycle: { w: 33, h: 67, unit: mm }, rear_motorcar: { w: 36, h: 75, unit: mm } }
1035
+ content: "the year BEFORE the year of expiry, impressed into the bar (VVV Anhang 2 A Ziff. 4)"
1036
+ note: >-
1037
+ VVV Anhang 2 A Ziff. 3, verbatim: "Die Schilder für provisorisch
1038
+ immatrikulierte Motorfahrzeuge tragen anschliessend an die Kontrollnummer
1039
+ einen erhaben gepressten, senkrechten roten Balken ... Auf den vorderen
1040
+ Schildern für Motorwagen und den Schildern für Motorräder und für
1041
+ Kleinmotorräder ist der rote Balken 33 mm breit und 67 mm hoch, auf den
1042
+ hinteren Schildern für Motorwagen 36 mm breit und 75 mm hoch."
1043
+ control_sticker:
1044
+ name: Kontrollmarke
1045
+ placement: "stuck onto the red bar"
1046
+ dimensions: { w: 30, h: 50, unit: mm, corner_radius_mm: 2 }
1047
+ background: "#FF0000"
1048
+ content: "the expiry MONTH in black, 33 mm high with a 4.5 mm stroke, centred; the last two digits of the expiry YEAR in white"
1049
+ note: "VVV Art. 18 Abs. 2 and Anhang 2 B Ziff. 1-2; the stickers are procured by the cantons (B Ziff. 3)"
1050
+ rear_differs: true
1051
+ validity:
1052
+ max_months: 12
1053
+ note: >-
1054
+ VVV Art. 17 Abs. 1-2: the Fahrzeugausweis for a provisionally registered
1055
+ vehicle is time-limited so that it expires at latest on the day given in
1056
+ the insurance proof and ALWAYS at the end of a month; validity must end at
1057
+ latest in the twelfth month following issue, except that certificates
1058
+ issued in October or November may run to the end of the FOLLOWING year.
1059
+ The plates lose validity with the certificate (Art. 18 Abs. 1) and,
1060
+ uniquely, need not be handed back — VZV Art. 87 Abs. 5 excludes exactly
1061
+ these plates from the rule that plates stay the authority's property.
1062
+ region_encoding: "plates/_decode/ch-cantons.yml"
1063
+ sources:
1064
+ - "https://www.fedlex.admin.ch/eli/cc/1959/1271_1321_1317/de # VVV Art. 16 (a vehicle is provisionally registered when its Standort is in Switzerland only, or only still, for a limited time; uncleared vehicles only provisionally and only with customs consent); Art. 17 Abs. 1-5 (validity, extension, Standort, fees); Art. 18 Abs. 1-2 (special plates per Anhang 2 A; the control sticker per Anhang 2 B); Art. 19 (insurance); Anhang 2 A Ziff. 1-4 and B Ziff. 1-3 (independent numbering, thin sheet metal, the red bar and its dimensions, the impressed year, the sticker)"
1065
+ - "https://www.fedlex.admin.ch/eli/cc/1976/2423_2423_2423/de # VZV Art. 82 Abs. 2 lit. a (plates for provisional registration are specially marked); Art. 87 Abs. 5 (provisional plates are the exception to authority ownership); Art. 79 Abs. 2-3 (validity governed by the VVV)"
1066
+ notes: >-
1067
+ PROVISORISCHE IMMATRIKULATION. Switzerland's answer to the export and transit
1068
+ plate — and it is deliberately NOT either: the criterion is that the vehicle's
1069
+ Standort is in Switzerland only temporarily (VVV Art. 16 Abs. 1), whether it
1070
+ is arriving or leaving. The plate is an ordinary cantonal plate with a raised
1071
+ vertical RED BAR after the number, a year impressed into the bar and a
1072
+ month/year sticker on top of it, so a Swiss provisional plate carries a date
1073
+ that no string parser can see. Its number space may be restarted from 1,
1074
+ which no other Swiss series may do. period.start 1977 is the VZV/VVV regime
1075
+ date; Anhang 2 took its present form from the amendment of 15 April 1987
1076
+ (AS 1987 628) and was last revised with effect from 1 February 2019
1077
+ (AS 2019 249) — neither earlier text was retrieved.
1078
+
1079
+ - id: ch-provisional-z
1080
+ class: temporary
1081
+ categories: [car, van, truck, bus, motorcycle]
1082
+ period: { start: 1987 }
1083
+ period_evidence: instrument-in-force
1084
+ matching: strict
1085
+ format:
1086
+ pattern: "LL 999999Z"
1087
+ regex: '\A[A-Z]{2}[- ]?\d{1,6}[- ]?Z\z'
1088
+ regex_strict: '\A(?:AG|AI|AR|BE|BL|BS|FR|GE|GL|GR|JU|LU|NE|NW|OW|SG|SH|SO|SZ|TG|TI|UR|VD|VS|ZG|ZH)[- ]?[1-9]\d{0,5}[- ]?Z\z'
1089
+ regex_statutory: '\A(?:Z[- ]?[A-Z]{2}[- ]?\d+|[A-Z]{2}[- ]?Z[- ]?\d+|[A-Z]{2}[- ]?\d+[- ]?Z)\z'
1090
+ charset:
1091
+ fixed_letters: "Z"
1092
+ notes: >-
1093
+ VVV Anhang 2 A Ziff. 3, second half: "Schilder unverzollter Fahrzeuge
1094
+ tragen zusätzlich den Buchstaben «Z»." The letter is prescribed; its
1095
+ POSITION is not, anywhere in the VVV or the VZV. `regex` writes the
1096
+ trailing position, which is the observed printed form; `regex_statutory`
1097
+ admits every position the text leaves open. Recorded gap.
1098
+ design:
1099
+ plate: { w: 300, h: 80, unit: mm }
1100
+ plate_variants:
1101
+ - { w: 500, h: 110, unit: mm }
1102
+ - { w: 300, h: 160, unit: mm }
1103
+ - { w: 180, h: 140, unit: mm, note: "motorcycle" }
1104
+ background: { color: "#FFFFFF", finish: retroreflective-optional, hex_basis: observed }
1105
+ foreground: "#000000"
1106
+ band: { side: none }
1107
+ emblem: { present: true, rendered: placeholder }
1108
+ extra_field:
1109
+ name: "roter Balken"
1110
+ color: "#FF0000"
1111
+ hex_basis: observed
1112
+ note: "as ch-provisional — the Z is ADDITIONAL to the red bar, not instead of it"
1113
+ rear_differs: true
1114
+ validity: { max_months: 12, note: "as ch-provisional; VVV Art. 17 Abs. 3 additionally lets customs authorise up to 48 hours' use on re-entry after the provisional registration expired abroad, against a frontier insurance under Art. 44" }
1115
+ region_encoding: "plates/_decode/ch-cantons.yml"
1116
+ sources:
1117
+ - "https://www.fedlex.admin.ch/eli/cc/1959/1271_1321_1317/de # VVV Anhang 2 A Ziff. 3 (the red bar, its dimensions, and 'Schilder unverzollter Fahrzeuge tragen zusätzlich den Buchstaben «Z»' — footnoted AS 1987 1350); Art. 16 Abs. 2 (uncleared vehicles may be registered only provisionally and only with the customs authorities' consent); Art. 17 Abs. 3 (the 48-hour customs tolerance)"
1118
+ - "https://www.fedlex.admin.ch/eli/cc/1976/2423_2423_2423/de # VZV Art. 79 Abs. 3 (a provisional certificate for an uncleared vehicle may exceed the customs authorisation only where the authorisation expressly says so)"
1119
+ notes: >-
1120
+ THE "Z" PLATE — provisional registration of an UNCLEARED (unverzollt) vehicle,
1121
+ the Swiss plate every plate-spotter asks about. Its own series and not a
1122
+ variant of ch-provisional because the printed string differs by a character.
1123
+ period.start 1987 follows Anhang 2's footnoted amendment (AS 1987 1350); the
1124
+ Anhang as a whole took its present form from the amendment of 15 April 1987
1125
+ (AS 1987 628). THE POSITION OF THE Z IS A RECORDED GAP: the ordinance
1126
+ prescribes the letter and is silent on where it goes, so `regex` carries the
1127
+ observed trailing form and `regex_statutory` carries the full legal latitude
1128
+ — the honest use of the §2.7 tier that the German file uses for statutes that
1129
+ are wider than practice.
1130
+
1131
+ # =========================================================================
1132
+ # DEALER — Händlerschilder with the letter "U", and their 1977 predecessors.
1133
+ # =========================================================================
1134
+ - id: ch-dealer-u
1135
+ class: dealer
1136
+ categories: [car, van, truck, bus, motorcycle, moped, trailer, tractor, machine]
1137
+ period: { start: 1977 }
1138
+ period_evidence: transitional-provision
1139
+ matching: strict
1140
+ format:
1141
+ pattern: "LL 999999U"
1142
+ regex: '\A[A-Z]{2}[- ]?\d{1,6}[- ]?U\z'
1143
+ regex_strict: '\A(?:AG|AI|AR|BE|BL|BS|FR|GE|GL|GR|JU|LU|NE|NW|OW|SG|SH|SO|SZ|TG|TI|UR|VD|VS|ZG|ZH)[- ]?[1-9]\d{0,5}[- ]?U\z'
1144
+ regex_statutory: '\A(?:U[- ]?[A-Z]{2}[- ]?\d+|[A-Z]{2}[- ]?U[- ]?\d+|[A-Z]{2}[- ]?\d+[- ]?U)\z'
1145
+ charset:
1146
+ fixed_letters: "U"
1147
+ notes: >-
1148
+ VZV Art. 82 Abs. 2 lit. c, verbatim and in full: "die Händlerschilder mit
1149
+ dem Buchstaben «U»". That is the entire federal rule — the letter is
1150
+ mandated and its POSITION is not stated in the VZV, the VVV or the VTS.
1151
+ Same treatment as ch-provisional-z: `regex` writes the observed trailing
1152
+ U, `regex_statutory` admits the three positions the text leaves open, and
1153
+ the position is a recorded gap for the verifier.
1154
+ progression: "own number space: Art. 84 Abs. 2 splits numbering by SPECIAL MARKING as well as by colour, so the U series counts from 1 independently in each canton"
1155
+ design:
1156
+ plate: { w: 300, h: 80, unit: mm, note: "front; rear 300x160 or 500x110" }
1157
+ plate_variants:
1158
+ - { w: 500, h: 110, unit: mm }
1159
+ - { w: 300, h: 160, unit: mm }
1160
+ - { w: 180, h: 140, unit: mm, note: "motorcycle dealer plate" }
1161
+ - { w: 100, h: 140, unit: mm, note: "Kleinmotorrad dealer plate" }
1162
+ background: { color: "#FFFFFF", finish: retroreflective-optional, hex_basis: observed, spec_note: "the ground colour follows the vehicle family the Kollektiv-Fahrzeugausweis covers — light green for land- und forstwirtschaftliche Motorfahrzeuge, light blue for Arbeitsmotorfahrzeuge (VVV Art. 22 Abs. 1 lit. d-e read with VZV Art. 82 Abs. 1)" }
1163
+ foreground: "#000000"
1164
+ band: { side: none }
1165
+ emblem: { present: true, rendered: placeholder }
1166
+ rear_differs: true
1167
+ binding: business
1168
+ binding_note: >-
1169
+ OVERRIDES the file-level `owner`. A Händlerschild hangs on a KOLLEKTIV-
1170
+ FAHRZEUGAUSWEIS issued to a BUSINESS (VVV Art. 23 Abs. 1) and is fitted to
1171
+ whatever qualifying vehicle the business needs to move — "Der Kollektiv-
1172
+ Fahrzeugausweis berechtigt zum Anbringen der darin genannten Händlerschilder
1173
+ an geprüften und nichtgeprüften ... Fahrzeugen der im Ausweis genannten Art"
1174
+ (Art. 24 Abs. 1). Neither vehicle-keyed nor keeper-keyed consumers may join
1175
+ on it.
1176
+ validity: { note: "VZV Art. 79 Abs. 1: the Kollektiv-Fahrzeugausweis is valid for an indefinite period, unlike the Tagesausweis and the provisional certificate" }
1177
+ region_encoding: "plates/_decode/ch-cantons.yml"
1178
+ sources:
1179
+ - "https://www.fedlex.admin.ch/eli/cc/1976/2423_2423_2423/de # VZV Art. 82 Abs. 2 lit. c (Händlerschilder carry the letter U); Art. 84 Abs. 2 (separate numbering per special marking); Art. 79 Abs. 1 (indefinite validity); Art. 151 Abs. 4 ('Kontrollschilder mit besonderer Kennzeichnung nach Artikel 82 Absatz 2 Buchstaben b und c werden ab 1. Juli 1977 abgegeben.')"
1180
+ - "https://www.fedlex.admin.ch/eli/cc/1959/1271_1321_1317/de # VVV Art. 22 (dealer plates are issued for Motorwagen, Motorräder, Kleinmotorräder, agricultural and forestry motor vehicles, work motor vehicles and trailers, with the cross-use table of Abs. 2 and the towing-vehicle rear-plate rule of Abs. 2bis); Art. 23 (issued to businesses meeting the Anhang 4 conditions); Art. 23a (withdrawal); Art. 24 Abs. 1-6 (permitted uses, the 3.5 t goods-transport restrictions, documentation); Art. 25 (who may drive; the two-year log for unaccompanied test drives by prospective buyers); Art. 26 (insurance)"
1181
+ notes: >-
1182
+ HÄNDLERSCHILDER — the Swiss dealer plate, and the ONLY series in this file
1183
+ with a start date that is a real issuance date rather than an instrument
1184
+ date. VZV Art. 151 Abs. 4 says it in terms: specially-marked plates under
1185
+ Art. 82 Abs. 2 lit. b and c "werden ab 1. Juli 1977 abgegeben", so 1 July
1186
+ 1977 is the earliest possible U plate and `period_evidence` is
1187
+ `transitional-provision`, not `instrument-in-force`. The compensating audit
1188
+ trail Germany builds into its 06 plate has a Swiss analogue in VVV Art. 25
1189
+ Abs. 3: a business that lets a prospective buyer take an unaccompanied test
1190
+ drive must keep a register of those journeys for TWO YEARS and show it to
1191
+ the enforcement authorities on demand.
1192
+
1193
+ - id: ch-dealer-pre1977
1194
+ class: dealer
1195
+ categories: [car, van, truck, bus, motorcycle, trailer]
1196
+ period: { start: 1977, end: 1980 }
1197
+ period_evidence: transitional-window
1198
+ matching: recall-only
1199
+ format:
1200
+ pattern: "LL 999999"
1201
+ regex: '\A[A-Z]{2}[- ]?\d{1,6}\z'
1202
+ pattern_note: >-
1203
+ RECALL-ONLY, and for the §2.7 reason exactly: these are the pre-VZV dealer
1204
+ and test plates, which by definition carried NO special marking, so their
1205
+ printed form is the ordinary canton-letters-plus-number shape and the regex
1206
+ is the ordinary standard-series regex. A match says only "this string has
1207
+ the shape of a Swiss cantonal registration" — never that it is a pre-1977
1208
+ dealer plate. There is no narrowing available and, per §2.7, a recall-only
1209
+ series may not carry a regex_strict.
1210
+ design:
1211
+ plate: { w: 300, h: 80, unit: mm, note: "format not separately sourced; the VZV's own transitional rule (Art. 151 Abs. 5) contemplates 'Kontrollschilder früherer Formate' still in circulation" }
1212
+ background: { color: "#FFFFFF", finish: unspecified, hex_basis: observed }
1213
+ foreground: "#000000"
1214
+ band: { side: none }
1215
+ emblem: { present: true, rendered: placeholder }
1216
+ rear_differs: true
1217
+ binding: business
1218
+ region_encoding: "plates/_decode/ch-cantons.yml"
1219
+ sources:
1220
+ - "https://www.fedlex.admin.ch/eli/cc/1976/2423_2423_2423/de # VZV Art. 151 Abs. 4, verbatim: 'Die bisherigen Schilder für Mietwagen, Händler- und Versuchsschilder sind innerhalb dreier Jahre seit Inkrafttreten dieser Verordnung gegen Schilder mit besonderer Kennzeichnung auszutauschen.'; Art. 151 Abs. 5 ('Kontrollschilder früherer Formate sind zu ersetzen, wenn die zuständige Behörde den Fahrzeughalter dazu auffordert'); Art. 152 (repealing the pre-VZV Bundesratsbeschlüsse, including the BRB of 22 January 1969 on diplomatic and consular plates)"
1221
+ notes: >-
1222
+ THE ONE SERIES BACK, for the dealer class — and the honest limits of it.
1223
+ PERIOD SEMANTICS, stated plainly: `start: 1977` is NOT this series' start.
1224
+ These plates ("die bisherigen Schilder für Mietwagen, Händler- und
1225
+ Versuchsschilder") predate the VZV and their own start date is unsourced,
1226
+ because the instruments that created them were repealed by VZV Art. 152 and
1227
+ their texts were not retrievable from fedlex in this pass. What the period
1228
+ records is the WINDOW in which they remained lawfully on Swiss roads under
1229
+ the VZV's own transitional rule: from the VZV's entry into force on 1 January
1230
+ 1977 until the three-year exchange deadline expired on 1 January 1980. That
1231
+ is a hard, primary, dated close — `end: 1980` is sourced, `start: 1977` is a
1232
+ floor. A verifier who reaches AS 1976 2423's printed original, or the
1233
+ pre-1977 Bundesratsbeschlüsse listed in Art. 152, can replace the floor with
1234
+ a real start and should.
1235
+
1236
+ - id: ch-rental-1977
1237
+ class: dealer
1238
+ categories: [car, van, bus]
1239
+ period: { start: 1977, end: 2001 }
1240
+ period_evidence: transitional-provision
1241
+ matching: recall-only
1242
+ format:
1243
+ pattern: "LL 999999"
1244
+ regex: '\A[A-Z]{2}[- ]?\d{1,6}\z'
1245
+ pattern_note: >-
1246
+ RECALL-ONLY. Art. 82 Abs. 2 lit. b required rental-car plates to be
1247
+ specially marked but the repealing amendment took the DESCRIPTION of the
1248
+ marking out with the letter, so the consolidated text now reads "b. …" and
1249
+ no primary in reach says what the mark was. The regex is therefore the
1250
+ ordinary cantonal shape and a match is a shape hit only. Guessing the
1251
+ marking letter was declined.
1252
+ design:
1253
+ plate: { w: 300, h: 80, unit: mm }
1254
+ background: { color: "#FFFFFF", finish: retroreflective-optional, hex_basis: observed }
1255
+ foreground: "#000000"
1256
+ band: { side: none }
1257
+ emblem: { present: true, rendered: placeholder }
1258
+ rear_differs: true
1259
+ region_encoding: "plates/_decode/ch-cantons.yml"
1260
+ sources:
1261
+ - "https://www.fedlex.admin.ch/eli/cc/1976/2423_2423_2423/de # VZV Art. 82 Abs. 2 lit. b, now shown as repealed with the footnote 'Aufgehoben durch Ziff. I der V vom 11. April 2001, mit Wirkung seit 1. Juni 2001 (AS 2001 1387)'; Art. 151 Abs. 4 (specially-marked plates under Abs. 2 lit. b and c issued from 1 July 1977)"
1262
+ notes: >-
1263
+ THE MIETWAGEN (RENTAL-CAR) SERIES — ENDED, and the cleanest dated pair of
1264
+ brackets in this file: it begins on 1 July 1977 with Art. 151 Abs. 4's
1265
+ issuance date for specially-marked plates under Art. 82 Abs. 2 lit. b, and it
1266
+ ends on 1 June 2001 with lit. b's repeal (AS 2001 1387). Both dates come from
1267
+ the consolidated ordinance's own apparatus. CLASS CAVEAT: recorded as
1268
+ `dealer` because the VZV itself grouped rental plates with dealer and test
1269
+ plates in Art. 151 Abs. 4 and because the marking attached to a BUSINESS, but
1270
+ a rental car's plate was vehicle-fitted, not floating like a Händlerschild —
1271
+ a vocabulary gap worth a `rental` value if another jurisdiction produces one.
1272
+ Since 1 June 2001 Swiss rental cars have carried ordinary plates, which is
1273
+ why no live successor series exists.