vehicles 0.6.1 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (186) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop_todo.yml +164 -0
  3. data/CHANGELOG.md +274 -0
  4. data/README.md +55 -10
  5. data/data/PROVENANCE-vehicles.md +12 -0
  6. data/data/plates/PROVENANCE.md +5 -4
  7. data/data/plates/_decode/at-districts.yml +287 -0
  8. data/data/plates/_decode/ch-cantons.yml +110 -0
  9. data/data/plates/_decode/cn-issuing-offices.yml +463 -0
  10. data/data/plates/_decode/cn-provinces.yml +614 -0
  11. data/data/plates/_decode/cz-kraj.yml +159 -0
  12. data/data/plates/_decode/dk-serial-blocks.yml +327 -0
  13. data/data/plates/_decode/fr-departements.yml +191 -0
  14. data/data/plates/_decode/gb-age-identifiers.yml +170 -0
  15. data/data/plates/_decode/gb-memory-tags.yml +202 -0
  16. data/data/plates/_decode/gr-prefectures.yml +1408 -0
  17. data/data/plates/_decode/hr-cities.yml +315 -0
  18. data/data/plates/_decode/ie-counties.yml +227 -0
  19. data/data/plates/_decode/in-state-codes.yml +169 -0
  20. data/data/plates/_decode/is-districts-1938.yml +116 -0
  21. data/data/plates/_decode/it-provinces.yml +348 -0
  22. data/data/plates/_decode/jp-office-marks.yml +960 -0
  23. data/data/plates/_decode/jp-use-marks.yml +205 -0
  24. data/data/plates/_decode/kr-authority-marks.yml +146 -0
  25. data/data/plates/_decode/kr-use-syllables.yml +194 -0
  26. data/data/plates/_decode/lu-series-order.yml +638 -0
  27. data/data/plates/_decode/mx-entity-series.yml +380 -0
  28. data/data/plates/_decode/my-index-marks.yml +271 -0
  29. data/data/plates/_decode/no-counties-1913.yml +148 -0
  30. data/data/plates/_decode/no-districts.yml +901 -0
  31. data/data/plates/_decode/pl-powiats.yml +567 -0
  32. data/data/plates/_decode/pt-trailer-services.yml +96 -0
  33. data/data/plates/_decode/ro-counties.yml +213 -0
  34. data/data/plates/_decode/se-diplomatic.yml +220 -0
  35. data/data/plates/_decode/si-regions.yml +123 -0
  36. data/data/plates/_decode/sk-districts.yml +314 -0
  37. data/data/plates/_decode/th-registration-elements.yml +208 -0
  38. data/data/plates/_decode/ua-regions.yml +393 -0
  39. data/data/plates/_decode/za-licence-marks.yml +215 -0
  40. data/data/plates/_meta/classes.yml +1 -0
  41. data/data/plates/_meta/separators.yml +102 -0
  42. data/data/plates/ad.yml +961 -0
  43. data/data/plates/ar.yml +762 -0
  44. data/data/plates/at.yml +1424 -0
  45. data/data/plates/au-act.yml +472 -0
  46. data/data/plates/au-nsw.yml +282 -0
  47. data/data/plates/au-nt.yml +431 -0
  48. data/data/plates/au-qld.yml +272 -0
  49. data/data/plates/au-sa.yml +248 -0
  50. data/data/plates/au-tas.yml +302 -0
  51. data/data/plates/au-vic.yml +215 -0
  52. data/data/plates/au-wa.yml +309 -0
  53. data/data/plates/be.yml +1840 -0
  54. data/data/plates/br.yml +1152 -0
  55. data/data/plates/ca-ab.yml +430 -0
  56. data/data/plates/ca-bc.yml +697 -0
  57. data/data/plates/ca-mb.yml +499 -0
  58. data/data/plates/ca-nb.yml +537 -0
  59. data/data/plates/ca-nl.yml +743 -0
  60. data/data/plates/ca-ns.yml +808 -0
  61. data/data/plates/ca-nt.yml +610 -0
  62. data/data/plates/ca-nu.yml +280 -0
  63. data/data/plates/ca-on.yml +881 -0
  64. data/data/plates/ca-pe.yml +592 -0
  65. data/data/plates/ca-qc.yml +1036 -0
  66. data/data/plates/ca-sk.yml +256 -0
  67. data/data/plates/ca-yt.yml +656 -0
  68. data/data/plates/ch.yml +1273 -0
  69. data/data/plates/cn.yml +1431 -0
  70. data/data/plates/cy.yml +688 -0
  71. data/data/plates/cz.yml +1179 -0
  72. data/data/plates/de.yml +553 -118
  73. data/data/plates/dk.yml +1647 -0
  74. data/data/plates/ee.yml +1275 -0
  75. data/data/plates/es.yml +228 -32
  76. data/data/plates/fi.yml +1271 -0
  77. data/data/plates/fr.yml +1265 -0
  78. data/data/plates/gb.yml +1188 -0
  79. data/data/plates/gr.yml +721 -0
  80. data/data/plates/hr.yml +860 -0
  81. data/data/plates/hu.yml +959 -0
  82. data/data/plates/ie.yml +775 -0
  83. data/data/plates/in.yml +1172 -0
  84. data/data/plates/is.yml +667 -0
  85. data/data/plates/it.yml +1317 -0
  86. data/data/plates/jp.yml +3650 -0
  87. data/data/plates/kr.yml +1375 -0
  88. data/data/plates/li.yml +1010 -0
  89. data/data/plates/lt.yml +879 -0
  90. data/data/plates/lu.yml +842 -0
  91. data/data/plates/lv.yml +924 -0
  92. data/data/plates/mc.yml +1024 -0
  93. data/data/plates/mt.yml +854 -0
  94. data/data/plates/mx.yml +1372 -0
  95. data/data/plates/my.yml +685 -0
  96. data/data/plates/nl.yml +44 -0
  97. data/data/plates/no.yml +1018 -0
  98. data/data/plates/nz.yml +1699 -0
  99. data/data/plates/pl.yml +1296 -0
  100. data/data/plates/pt.yml +847 -0
  101. data/data/plates/ro.yml +785 -0
  102. data/data/plates/se.yml +1091 -0
  103. data/data/plates/si.yml +1105 -0
  104. data/data/plates/sk.yml +1439 -0
  105. data/data/plates/sm.yml +1119 -0
  106. data/data/plates/th.yml +1150 -0
  107. data/data/plates/ua.yml +1672 -0
  108. data/data/plates/us-ak.yml +763 -0
  109. data/data/plates/us-al.yml +457 -0
  110. data/data/plates/us-ar.yml +427 -0
  111. data/data/plates/us-as.yml +454 -0
  112. data/data/plates/us-az.yml +430 -0
  113. data/data/plates/us-ca.yml +892 -0
  114. data/data/plates/us-co.yml +452 -0
  115. data/data/plates/us-ct.yml +427 -0
  116. data/data/plates/us-dc.yml +614 -0
  117. data/data/plates/us-de.yml +551 -0
  118. data/data/plates/us-fl.yml +319 -96
  119. data/data/plates/us-ga.yml +644 -0
  120. data/data/plates/us-gu.yml +658 -0
  121. data/data/plates/us-hi.yml +585 -0
  122. data/data/plates/us-ia.yml +438 -0
  123. data/data/plates/us-id.yml +531 -0
  124. data/data/plates/us-il.yml +516 -0
  125. data/data/plates/us-in.yml +324 -0
  126. data/data/plates/us-ks.yml +351 -0
  127. data/data/plates/us-ky.yml +770 -0
  128. data/data/plates/us-la.yml +568 -0
  129. data/data/plates/us-ma.yml +379 -0
  130. data/data/plates/us-md.yml +536 -0
  131. data/data/plates/us-me.yml +445 -0
  132. data/data/plates/us-mi.yml +408 -0
  133. data/data/plates/us-mn.yml +411 -0
  134. data/data/plates/us-mo.yml +356 -0
  135. data/data/plates/us-mp.yml +402 -0
  136. data/data/plates/us-ms.yml +432 -0
  137. data/data/plates/us-mt.yml +619 -0
  138. data/data/plates/us-nc.yml +602 -0
  139. data/data/plates/us-nd.yml +419 -0
  140. data/data/plates/us-ne.yml +483 -0
  141. data/data/plates/us-nh.yml +394 -0
  142. data/data/plates/us-nj.yml +547 -0
  143. data/data/plates/us-nm.yml +574 -0
  144. data/data/plates/us-nv.yml +655 -0
  145. data/data/plates/us-ny.yml +592 -0
  146. data/data/plates/us-oh.yml +404 -0
  147. data/data/plates/us-ok.yml +513 -0
  148. data/data/plates/us-or.yml +392 -0
  149. data/data/plates/us-pa.yml +506 -0
  150. data/data/plates/us-pr.yml +507 -0
  151. data/data/plates/us-ri.yml +445 -0
  152. data/data/plates/us-sc.yml +605 -0
  153. data/data/plates/us-sd.yml +428 -0
  154. data/data/plates/us-tn.yml +471 -0
  155. data/data/plates/us-tx.yml +535 -0
  156. data/data/plates/us-ut.yml +384 -0
  157. data/data/plates/us-va.yml +567 -0
  158. data/data/plates/us-vi.yml +489 -0
  159. data/data/plates/us-vt.yml +458 -0
  160. data/data/plates/us-wa.yml +484 -0
  161. data/data/plates/us-wi.yml +509 -0
  162. data/data/plates/us-wv.yml +446 -0
  163. data/data/plates/us-wy.yml +523 -0
  164. data/data/plates/va.yml +604 -0
  165. data/data/plates/za.yml +1141 -0
  166. data/data/vehicles.json +160653 -105090
  167. data/lib/vehicles/configuration.rb +17 -3
  168. data/lib/vehicles/dataset.rb +73 -18
  169. data/lib/vehicles/fuzzy.rb +115 -0
  170. data/lib/vehicles/http.rb +48 -0
  171. data/lib/vehicles/make.rb +36 -6
  172. data/lib/vehicles/mcp_server.rb +5 -5
  173. data/lib/vehicles/model.rb +21 -2
  174. data/lib/vehicles/plates/series.rb +172 -18
  175. data/lib/vehicles/plates/template_fill.rb +188 -0
  176. data/lib/vehicles/plates/templates.rb +162 -0
  177. data/lib/vehicles/plates.rb +12 -0
  178. data/lib/vehicles/providers/hosted_provider.rb +28 -55
  179. data/lib/vehicles/validators/vehicle_make_validator.rb +3 -1
  180. data/lib/vehicles/validators/vehicle_model_validator.rb +1 -1
  181. data/lib/vehicles/version.rb +1 -1
  182. data/lib/vehicles.rb +32 -16
  183. data/rakelib/data_refresh.rake +109 -0
  184. data/rakelib/plates_refresh.rake +29 -0
  185. data/sig/vehicles.rbs +18 -0
  186. metadata +164 -2
@@ -0,0 +1,685 @@
1
+ # plates/my.yml — Malaysia (PRD-PLATES gate L3). DRAFT for verification.
2
+ #
3
+ # ===========================================================================
4
+ # THE CENTRAL SOURCING FACT, STATED FIRST BECAUSE IT SHAPES EVERY ENTRY
5
+ # ===========================================================================
6
+ # THE COMPOSITION OF A MALAYSIAN REGISTRATION NUMBER IS NOT IN ANY INSTRUMENT
7
+ # THIS PASS COULD OBTAIN. The Road Transport Act 1987 (Act 333) creates the
8
+ # object and then delegates every detail of it. Section 11(1)(a), verbatim
9
+ # from the Attorney General's Chambers updated text as at 15 October 2023:
10
+ #
11
+ # "Upon the registration of a motor vehicle, the Director shall—
12
+ # (a) assign to the motor vehicle THE PRESCRIBED INDEX MARK indicating the
13
+ # registration area in which the vehicle is registered or the status of
14
+ # the owner of the motor vehicle AND A SEPARATE NUMBER (in this Act such
15
+ # mark and number are referred to collectively as 'the registration
16
+ # number'), and such registration number shall continue to be the
17
+ # registration number of such motor vehicle until it is broken up,
18
+ # destroyed or sent permanently out of Malaysia, and such registration
19
+ # number shall not be assigned to any other motor vehicle"
20
+ #
21
+ # Read that clause closely: it fixes the STRUCTURE — an index mark plus a
22
+ # separate number — and the SEMANTICS of the mark (registration area, or owner
23
+ # status), and it fixes the binding (to the vehicle, for life). It does not
24
+ # say A is Perak. "Prescribed" means prescribed by rules, and the rules are the
25
+ # Motor Vehicles (Registration and Licensing) Rules 1959, which the AGC's own
26
+ # federal-legislation portal DOES NOT CARRY: its subsidiary-legislation index
27
+ # for Act 333 returns 727 records and the oldest is from 2000, with the
28
+ # Registration and Licensing Rules present only as AMENDMENTS (P.U. (A) 79 and
29
+ # 94 of 2012, 100/2018, 98 and 177/2019, 36/2023, 177/2024, 464/2025). The
30
+ # PRINCIPAL 1959 rules are not digitised anywhere this pass could reach.
31
+ #
32
+ # CONSEQUENCE, AND IT IS THE GERMAN RESULT AGAIN: the index-mark table — the
33
+ # single most valuable decode dimension in this jurisdiction — is sourced to
34
+ # the AUTHORITY'S OWN PUBLISHED SYSTEM rather than to the instrument that
35
+ # legally prescribes it. plates/_decode/my-index-marks.yml carries it, keyed to
36
+ # the JPJ portal's own location API, with `evidence: agency-api` on every row
37
+ # and the instrument gap stated at the top. Exactly as § 9 FZV delegates the
38
+ # German district codes to the Bundesanzeiger and VERA 1994 leaves the British
39
+ # memory tag to INF104, Act 333 leaves the Malaysian index mark to a 1959
40
+ # statutory rule nobody has put online.
41
+ #
42
+ # Display is delegated the same way. Section 14(1), verbatim:
43
+ #
44
+ # "The registration number assigned to a motor vehicle upon registration or a
45
+ # new registration number assigned under section 11 shall be displayed and
46
+ # illuminated on the number plate IN THE MANNER PRESCRIBED BY RULES MADE
47
+ # UNDER THIS ACT."
48
+ #
49
+ # and the rule-making power, section 66(1)(s), verbatim:
50
+ #
51
+ # "to prescribe the size, shape and character of the registration number and
52
+ # signs to be displayed on any motor vehicle and the manner in which those
53
+ # registration numbers or signs are to be fixed, displayed, illuminated and
54
+ # rendered easily distinguishable, whether by night or day, and to provide
55
+ # for a distinctive registration number or other sign to be carried by
56
+ # public service vehicles or goods vehicles, or by public service vehicles
57
+ # or goods vehicles licensed for a particular purpose"
58
+ #
59
+ # So Malaysia's law fixes: that there is an index mark; that it means area or
60
+ # owner status; that the number stays with the vehicle for life; that public
61
+ # service and goods vehicles MAY be given a distinctive number or sign; and
62
+ # that the Minister prescribes size, shape and character. Everything a plate
63
+ # dataset actually wants is one layer below that, in an unreachable instrument.
64
+ # Every series below therefore separates, in its own sources block, what comes
65
+ # from THE ACT, what comes from THE AUTHORITY'S PAGES, and what comes from
66
+ # secondary sources — and tags the last of those honestly.
67
+ #
68
+ # ===========================================================================
69
+ # THE ONE PIECE OF LIVE PRIMARY EVIDENCE, AND IT IS UNUSUALLY GOOD
70
+ # ===========================================================================
71
+ # JPJ operates a public "Semakan Nombor Pendaftaran Terkini" (latest
72
+ # registration number enquiry) service backed by a JSON API at
73
+ # portal-api.jpj.gov.my. Two endpoints were called directly:
74
+ # * /api/locations -> the CLOSED list of 32 registration
75
+ # offices/areas with their codes
76
+ # * /api/semak-no-pendaftaran-terkini -> for each code, THE REGISTRATION
77
+ # NUMBER CURRENTLY BEING ISSUED there
78
+ # The second call is a dated observation of the authority's own live counter,
79
+ # captured 3 August 2026 00:47–00:49 (+08), and it is the evidence that pins
80
+ # the CURRENT format of every Malaysian state in one pass. Its readings are
81
+ # recorded per row in plates/_decode/my-index-marks.yml and drive the two
82
+ # standard series below. This is as close to a registration-corpus test
83
+ # (PRD-PLATES §5.2) as a jurisdiction without open registry data can get.
84
+ #
85
+ # WHAT THE SNAPSHOT PROVES, mechanically, from 28 successful readings:
86
+ # * TWO live arrangements coexist nationwide, not one.
87
+ # - PREFIX FORM, no suffix: KGH 3943 (Kedah), MEG 6121 (Melaka),
88
+ # NEL 2986 (Negeri Sembilan), CFH 3542 (Pahang), PSE 4213 (Penang),
89
+ # APK 4191 (Perak), BSS 3435 (Selangor), TDH 3264 (Terengganu),
90
+ # DFQ 9814 (Kelantan), SJT 4199 (Kota Kinabalu), SMW 5063 (Sandakan),
91
+ # SWR 9584 (Tawau), SPA 3076 (Lahad Datu), QAB 3426P is not this form,
92
+ # QBH 8695 (Betong), QRY 2592 (Sarikei), QLG 4546 (Lawas),
93
+ # QCW 4437 (Kota Samarahan), QPD 9177 (Kapit), VRJ 7380 (Kuala Lumpur),
94
+ # LH 6757 (Labuan).
95
+ # - SUFFIX FORM, a single trailing letter: JB 6419 J (Johor),
96
+ # KV 859 F (Langkawi), SK 4097 H (Kudat), SB 1644 L (Beaufort),
97
+ # SU 7665 Q (Keningau), QS 5608 Y (Mukah), QM 5771 U (Miri),
98
+ # QAB 3426 P (Kuching).
99
+ # Both are current. Neither is historic. A dataset that models only the
100
+ # three-letter prefix form is wrong for eight of the twenty-eight areas
101
+ # JPJ itself lists.
102
+ # * KUALA LUMPUR IS KEYED "W" AND ISSUES "V". Querying the area code W
103
+ # ("Wilayah Persekutuan Kuala Lumpur") returns VRJ7380. That is the
104
+ # authority's own confirmation, in one datum, that the V series is the
105
+ # continuation of the W registration area rather than a new area — the
106
+ # fact every secondary account states and none of them sources.
107
+ # * THE SUFFIX LETTER IS NOT A CHECK DIGIT and carries no visible arithmetic
108
+ # relation to the number (J on 6419, F on 859, H on 4097, L on 1644,
109
+ # Q on 7665, Y on 5608, U on 5771, P on 3426). It is a series counter.
110
+ #
111
+ # ===========================================================================
112
+ # THE EXCLUDED LETTERS — AND A FOLKLORE CORRECTION THIS FILE MAKES EXPLICITLY
113
+ # ===========================================================================
114
+ # The rule Malaysia actually runs, per both the English and Malay Wikipedia
115
+ # articles (the mandatory finding aid, PRD-PLATES §4) and CONSISTENT WITH every
116
+ # one of the 28 live JPJ readings above: the letters I and O are never issued
117
+ # (confusable with 1 and 0) and Z is reserved for military vehicles. The Malay
118
+ # article states it directly — "Huruf I dan O ditiadakan daripada urutan abjad
119
+ # kerana persamaannya dengan nombor 1 dan 0. Huruf Z ditinggalkan dan
120
+ # dikhaskan untuk digunakan pada kenderaan tentera Malaysia."
121
+ #
122
+ # THERE IS NO "NO VOWELS" RULE IN MALAYSIA, and the claim that there is — which
123
+ # circulates in plate-format lists and was carried into this programme's own
124
+ # briefing — is FALSE ON THE AUTHORITY'S OWN DATA. A is a state mark (Perak);
125
+ # the live snapshot contains SPA, QAB and APK; E and U appear freely in
126
+ # suffixes (SU 7665 Q, QM 5771 U). Only I and O are dropped, and only Z is
127
+ # reserved. Recorded here as a folklore correction, with the counter-evidence,
128
+ # rather than silently omitted. See dossier-my.md §6.
129
+ #
130
+ # NOTE THE ONE PLACE THE EXCLUSION IS NOT VISIBLE: it is an ISSUING rule, not a
131
+ # spelling rule, so `format.regex` cannot carry it (the lint generates "I" and
132
+ # "O" from `pattern`). It lives in `format.regex_strict` on every series that
133
+ # has one, which is exactly what PRD-PLATES §2.7 built the twin for.
134
+ #
135
+ # ===========================================================================
136
+ # WHAT IS DELIBERATELY NOT MODELLED
137
+ # ===========================================================================
138
+ # THE SPECIAL-SERIES OCEAN. JPJ runs a continuous programme of bid-for special
139
+ # registration series through JPJeBid, with statutory footing in Act 333
140
+ # s. 66(1)(jj) ("to prescribe the procedures relating to tender of registration
141
+ # numbers"). Well over a hundred series have been released — anniversary series
142
+ # (FA, FB, FC, FD, FE, FF, FFF, FG, FH), university series, NGO series, event
143
+ # series, the national "MALAYSIA 1-9999" series. Each is an ORDINARY
144
+ # registration whose mark was auctioned; none has its own format, design or
145
+ # period. PRD-PLATES §2.5 excludes exactly this, so the programme is recorded
146
+ # once, as a class note on my-standard-prefix (see `special_series` in
147
+ # `common`), and no series is authored for any individual release. The one
148
+ # exception is `my-jpjeplate-ev-2024`, which is a genuinely different PLATE
149
+ # rather than a different mark.
150
+ #
151
+ # PLATE DIMENSIONS ARE ABSENT FROM THIS FILE AND THEIR ABSENCE IS A FINDING.
152
+ # Act 333 s. 66(1)(s) empowers the Minister to prescribe "the size, shape and
153
+ # character" of the registration number, but the rules that do so were not
154
+ # obtained; JPJ's own "Plate Number Specification" knowledge-base article
155
+ # carries the measurements ONLY as an image ("Examples of Vehicle Plate
156
+ # Measures") with no text equivalent. No `design.plate` block is written
157
+ # anywhere below rather than invent millimetres, and the same posture applies
158
+ # to the typeface: no instrument located names one. This is plates/gb.yml's
159
+ # posture for the same reason (there, BS AU 145e is paywalled; here, the rules
160
+ # are simply not online).
161
+ jurisdiction: my
162
+ authority:
163
+ name: Jabatan Pengangkutan Jalan Malaysia (JPJ) — Road Transport Department Malaysia, for the Minister of Transport
164
+ url: "https://www.jpj.gov.my/"
165
+ binding: vehicle
166
+ binding_note: >-
167
+ Act 333 s. 11(1)(a), verbatim: the registration number "shall continue to be
168
+ the registration number of such motor vehicle UNTIL IT IS BROKEN UP,
169
+ DESTROYED OR SENT PERMANENTLY OUT OF MALAYSIA, and such registration number
170
+ shall not be assigned to any other motor vehicle". The same subsection then
171
+ carries Malaysia's cherished-transfer proviso: a registered owner may,
172
+ "subject to any terms and conditions which may be prescribed, and on payment
173
+ of the prescribed fee, have the number assigned to such motor vehicle
174
+ assigned to another motor vehicle of which he applies to be registered as
175
+ owner and which has not previously been registered", whereupon the Director
176
+ assigns a new number to the first vehicle. Structurally identical to the UK
177
+ retention scheme, and in the ACT rather than in guidance.
178
+
179
+ instrument:
180
+ citation: "Road Transport Act 1987 (Act 333), Laws of Malaysia"
181
+ royal_assent: "1987-08-30"
182
+ gazetted: "1987-09-24"
183
+ text_status: >-
184
+ The text used is the Attorney General's Chambers ONLINE VERSION OF UPDATED
185
+ TEXT OF REPRINT, "As at 15 October 2023", latest amendment Act A1684 in
186
+ operation 15 October 2023. AGC's own front matter warns: "This text is ONLY
187
+ AN UPDATED TEXT of the Road Transport Act 1987 by the Attorney General's
188
+ Chambers. Unless and until reprinted pursuant to the powers of the
189
+ Commissioner of Law Revision under subsection 14(1) of the Revision of Laws
190
+ Act 1968 [Act 1], this text is NOT AN AUTHENTIC TEXT." Recorded because
191
+ PRD-PLATES §5.3 says the authority is the authority: this is the authority's
192
+ own updated text, published by the authority, flagged by the authority as
193
+ non-authentic. Every quotation above and below is from it.
194
+ sections_used:
195
+ - "s. 11(1)(a) — assignment of the prescribed index mark and a separate number; lifetime binding to the vehicle; the cherished-transfer proviso"
196
+ - "s. 11(1A) — re-assignment of a number from a lost/stolen/destroyed/exported vehicle, on the Director General's prescribed terms"
197
+ - "s. 14(1) — display and illumination of the registration number on the number plate 'in the manner prescribed by rules made under this Act'"
198
+ - "s. 14(3) — a drawn trailer must display BOTH its own registration number and that of the drawing vehicle"
199
+ - "s. 14(4) — penalty for non-display: fine of not less than RM300 and not more than RM3,000"
200
+ - "s. 66(1)(s) — the rule-making power over size, shape and character of the registration number, and over distinctive numbers or signs for public service and goods vehicles"
201
+ - "s. 66(1)(jj) — 'to prescribe the procedures relating to tender of registration numbers', the statutory footing of JPJeBid"
202
+ subsidiary_gap: >-
203
+ THE MOTOR VEHICLES (REGISTRATION AND LICENSING) RULES 1959 — the instrument
204
+ that actually prescribes the index marks and the plate — WAS NOT OBTAINED.
205
+ AGC's json-subsid endpoint for Act 333 was called directly and enumerated:
206
+ it holds 727 subsidiary instruments, none earlier than 2000, and the
207
+ Registration and Licensing Rules appear only through their amendments
208
+ (P.U. (A) 79/2012, 94/2012, 100/2018, 98/2019, 177/2019, 36/2023, 177/2024,
209
+ 464/2025). No instrument in the index prescribes plates, index marks,
210
+ registration numbers or tender procedure by title.
211
+ source: "https://lom.agc.gov.my/ilims/upload/portal/akta/outputaktap/1871744_BI/Act%20333_Final_15%20Oct%202023%20(25.3.24).pdf # Road Transport Act 1987 (Act 333), AGC updated text as at 15 Oct 2023, 204 pp — ss. 11, 14, 66 quoted above. Accessed 2026-08-02"
212
+ source_subsidiary_index: "https://lom.agc.gov.my/json-subsid-2024.php?act=333 # AGC subsidiary-legislation index for Act 333, 727 records, enumerated 2026-08-02: earliest 2000, no principal 1959 Rules, no plate-specification instrument"
213
+
214
+ charset_defaults:
215
+ letters: [A, B, C, D, E, F, G, H, J, K, L, M, N, P, Q, R, S, T, U, V, W, X, Y]
216
+ excluded_letters: [I, O, Z]
217
+ excluded_letters_note: >-
218
+ I and O are never issued (confusable with the numerals 1 and 0); Z is
219
+ reserved for the Malaysian Armed Forces and is issued only as
220
+ my-military-z. NO VOWEL IS EXCLUDED — see the folklore correction in the
221
+ file header. The rule is not in any instrument located; it is stated by
222
+ the Malay- and English-language Wikipedia articles and is CONSISTENT WITH
223
+ all 28 live JPJ readings of 3 August 2026, none of which contains I, O or
224
+ Z. Tagged `secondary-wikipedia` wherever it is load-bearing, per
225
+ PRD-PLATES §4.
226
+ digits_note: >-
227
+ "No leading zeroes permitted" is stated by the English Wikipedia article
228
+ and is corroborated by every one of the 28 live JPJ readings (859, 1644,
229
+ 2592, 3076, 3426, 3435, 3542, 3943, 4097, 4199, 4213, 4437, 4546, 5063,
230
+ 5608, 5771, 6121, 6419, 6757, 7380, 7665, 8695, 9177, 9584, 9814, 4191,
231
+ 2986, 3264 — not one begins with 0). Carried in `regex_strict` as
232
+ `[1-9]\d{0,3}`, never in `regex`.
233
+ source: "https://ms.wikipedia.org/wiki/Plat_pendaftaran_kenderaan_Malaysia # 'Huruf I dan O ditiadakan daripada urutan abjad kerana persamaannya dengan nombor 1 dan 0. Huruf Z ditinggalkan dan dikhaskan untuk digunakan pada kenderaan tentera Malaysia.' Accessed 2026-08-02. period_evidence: secondary-wikipedia wherever used"
234
+
235
+ common:
236
+ colours:
237
+ jpj_statement: >-
238
+ JPJ's own "Vehicle Number Plate Specifications" page, verbatim as
239
+ published in English in 2013: "3 types of number plates that are allowed
240
+ for use — White alphabets and numbers, embossed or glued on a black
241
+ plate. White alphabets and numbers, embossed or glued on a red plate for
242
+ vehicles belonging to embassies, the UN and the International Natural
243
+ Rubber Association. Black alphabets and numbers, embossed or glued on a
244
+ white plate for taxicabs and hired cars."
245
+ current_wording: >-
246
+ The same article on the current JPJ portal (knowledge base, "Plate Number
247
+ Specification", captured 2023) says the same thing in a rougher machine
248
+ translation: "3 Form of Vehicle Registration Number: White letters and
249
+ numbers are affixed or bounced over a black frame. White letters and
250
+ numbers are affixed or embossed over red frames for embassy vehicles,
251
+ United Nations and the International Natural Rubber Association. Black
252
+ letters and numbers are bounced over white frame for taxi or rental car."
253
+ Both wordings are recorded because the 2013 English is the better text and
254
+ the 2023 page is the live one.
255
+ reading: >-
256
+ THREE plate forms, exhaustively, on the authority's own page: white on
257
+ black (everything ordinary), white on red (embassies, the UN, and — a
258
+ genuine curiosity worth keeping — the INTERNATIONAL NATURAL RUBBER
259
+ ORGANIZATION, which was headquartered in Kuala Lumpur), black on white
260
+ (taxis and hire cars). Note what is NOT there: no reflectivity
261
+ requirement, no colour coordinates, no dimensions in text, no front/rear
262
+ distinction. Every hex below is `hex_basis: observed` inside a named
263
+ colour, the same posture plates/gb.yml and plates/gr.yml take.
264
+ front_rear: >-
265
+ Malaysia is a WHITE-ON-BLACK jurisdiction front and rear — one of very
266
+ few left worldwide, and the single most recognisable thing about a
267
+ Malaysian plate. `rear_differs: false` throughout.
268
+ sources:
269
+ - "https://web.archive.org/web/20130516074518/http://www.jpj.gov.my/web/eng/specifications-of-vehicle-number-plates # JPJ, 'Vehicle Number Plate Specifications', the three permitted plate forms, English. Accessed 2026-08-02"
270
+ - "https://web.archive.org/web/20230527152350/https://www.jpj.gov.my/en/web/main-site/kenderaan1-en/-/knowledge_base/vehicle/plate-number-registration # JPJ knowledge base, 'Plate Number Specification' — same three forms; the dimensions appear only as an image ('Examples of Vehicle Plate Measures') with no text equivalent. Accessed 2026-08-02"
271
+ materials:
272
+ note: >-
273
+ Not prescribed by anything located. Malaysian plates are overwhelmingly
274
+ MOULDED PLASTIC with applied characters rather than pressed metal, which
275
+ is why kerning-tightening to defeat cameras is a live Malaysian
276
+ enforcement problem and why JPJ has repeatedly floated standardised
277
+ pressed plates. Recorded as context, not as a dataset claim.
278
+ special_series:
279
+ note: >-
280
+ JPJeBid: JPJ tenders "special" registration marks continuously, under
281
+ Act 333 s. 66(1)(jj). Each release (FA/FB/FC/FD/FE/FF/FFF/FG/FH
282
+ anniversary series, university and NGO series, the national
283
+ "MALAYSIA 1-9999" series, and well over a hundred others) is an ORDINARY
284
+ registration under my-standard-prefix or my-standard-suffix whose mark
285
+ was auctioned rather than allocated in sequence. No separate series is
286
+ authored for any of them (PRD-PLATES §2.5); a consumer wanting the
287
+ programme index should treat it as the Malaysian analogue of a US
288
+ specialty-plate index, which PRD-PLATES puts at L2/L4.
289
+ statutory_basis: "Act 333 s. 66(1)(jj), verbatim: 'to prescribe the procedures relating to tender of registration numbers'"
290
+ source: "https://lom.agc.gov.my/ilims/upload/portal/akta/outputaktap/1871744_BI/Act%20333_Final_15%20Oct%202023%20(25.3.24).pdf # s. 66(1)(jj). Accessed 2026-08-02"
291
+
292
+ series:
293
+
294
+ - id: my-standard-prefix
295
+ class: standard
296
+ categories: [car, van, truck, bus, motorcycle]
297
+ period: { start: 1987 }
298
+ period_evidence: instrument-in-force
299
+ matching: strict
300
+ format:
301
+ pattern: "LLL 9999"
302
+ regex: '\A[A-Z]{1,3}[- ]?\d{1,4}\z'
303
+ regex_strict: '\A[ABCDFJKLMNPQRSTVW][A-HJ-NP-Y]{0,2}[- ]?[1-9]\d{0,3}\z'
304
+ charset:
305
+ first_letter_note: >-
306
+ The first letter is the STATE OR TERRITORY INDEX MARK and comes from
307
+ the closed set JPJ's own location API publishes: A B C D F J K L M N P
308
+ R T W (peninsular states and federal territories), V (Kuala Lumpur's
309
+ second series), Q (Sarawak) and S (Sabah). E G H U X Y do not open an
310
+ ordinary registration — E was Sabah's pre-1963 mark, H is the hire
311
+ prefix (my-taxi), Z is military (my-military-z) — and I and O are
312
+ never issued at all.
313
+ See plates/_decode/my-index-marks.yml.
314
+ excluded: [I, O, Z]
315
+ no_leading_zero: true
316
+ progression: >-
317
+ The letters after the index mark advance alphabetically, skipping I, O
318
+ and Z, and the number runs 1-9999 within each letter combination:
319
+ A 1 … A 9999, AA 1 … AA 9999, AB 1 …, and so on to AY 9999, then AAA 1.
320
+ This is the mechanism every secondary account gives and the live JPJ
321
+ readings are consistent with it (Perak is at APK, Selangor at BSS,
322
+ Kelantan at DFQ — three letters deep in each case). The mechanism itself
323
+ is not in any instrument located: recorded as mechanism, not as law.
324
+ separator_note: >-
325
+ NO SEPARATOR GLYPH is prescribed by anything located, and Malaysian
326
+ plates print a GAP between the letter group and the number group. The
327
+ space in `pattern` is that gap; every regex accepts it as optional and
328
+ also accepts a hyphen, per PRD-PLATES §2.8 (a separator-only class).
329
+ design:
330
+ background: { color: "#000000", finish: non-reflective, hex_basis: observed }
331
+ foreground: "#FFFFFF"
332
+ band: { side: none }
333
+ emblem: { present: false }
334
+ rear_differs: false
335
+ plate_note: >-
336
+ NO `design.plate` BLOCK: no located instrument or authority text gives
337
+ millimetres. See the file header — JPJ publishes the measurements only
338
+ as an image. Recorded gap, deliberately not estimated.
339
+ font_note: >-
340
+ NO TYPEFACE IS PRESCRIBED by anything located. JPJ's specification page
341
+ carries a diagram which secondary accounts read as naming a compact
342
+ Arial Bold with Calisto MT Italic and Franklin Gothic Bold as
343
+ alternates; the diagram is an image and was not read in this pass.
344
+ Charles Wright and FE-Schrift are both common in the wild and both are
345
+ aftermarket choices, not standards. PRD-PLATES §6's schematic-render
346
+ fallback applies.
347
+ region_encoding: "plates/_decode/my-index-marks.yml"
348
+ sources:
349
+ - "https://lom.agc.gov.my/ilims/upload/portal/akta/outputaktap/1871744_BI/Act%20333_Final_15%20Oct%202023%20(25.3.24).pdf # Road Transport Act 1987 s. 11(1)(a) — 'the prescribed index mark indicating the registration area ... and a separate number', which is this format's structure and the whole of what statute gives; s. 14(1) display. Accessed 2026-08-02"
350
+ - "https://web.archive.org/web/20130516074518/http://www.jpj.gov.my/web/eng/specifications-of-vehicle-number-plates # JPJ: 'White alphabets and numbers, embossed or glued on a black plate' — the ordinary plate's colours. Accessed 2026-08-02"
351
+ - "https://portal-api.jpj.gov.my/api/semak-no-pendaftaran-terkini # JPJ live 'latest registration number' API, queried per area code 2026-08-03 00:47-00:49 (+08): KGH 3943 Kedah, MEG 6121 Melaka, NEL 2986 Negeri Sembilan, CFH 3542 Pahang, PSE 4213 Penang, APK 4191 Perak, BSS 3435 Selangor, TDH 3264 Terengganu, DFQ 9814 Kelantan, VRJ 7380 Kuala Lumpur, LH 6757 Labuan, SJT 4199 Kota Kinabalu, SMW 5063 Sandakan, SWR 9584 Tawau, SPA 3076 Lahad Datu, QBH 8695 Betong, QRY 2592 Sarikei, QLG 4546 Lawas, QCW 4437 Kota Samarahan, QPD 9177 Kapit — the prefix form, in issue now"
352
+ - "https://ms.wikipedia.org/wiki/Plat_pendaftaran_kenderaan_Malaysia # the I/O/Z exclusion carried in regex_strict. period_evidence: secondary-wikipedia. Accessed 2026-08-02"
353
+ notes: >-
354
+ THE ORDINARY MALAYSIAN PLATE, prefix form: one to three letters, a gap,
355
+ one to four digits, white on black, front and rear. period.start 1987 is
356
+ the Road Transport Act 1987, which is the instrument currently in force
357
+ and NOT the date the format began — the index-mark system runs back
358
+ through the Road Traffic Ordinance 1958 to the 1948 rationalisation of
359
+ the state marks (PK->A, JB->J and the rest), and this file makes no claim
360
+ about those dates because no instrument for them was obtained.
361
+ `period_evidence: instrument-in-force` is therefore the honest tag and the
362
+ pre-1987 boundary is a recorded gap. Runs in PARALLEL with
363
+ my-standard-suffix, which is a different arrangement of the same
364
+ statutory mark-plus-number and is equally current — eight of JPJ's
365
+ twenty-eight live areas were issuing the suffix form on 3 August 2026.
366
+
367
+ - id: my-standard-suffix
368
+ class: standard
369
+ categories: [car, van, truck, bus, motorcycle]
370
+ period: { start: 1987 }
371
+ period_evidence: instrument-in-force
372
+ matching: strict
373
+ format:
374
+ pattern: "LLL 9999 L"
375
+ regex: '\A[A-Z]{1,3}[- ]?\d{1,4}[- ]?[A-Z]\z'
376
+ regex_strict: '\A[ABCDFJKLMNPQRSTVW][A-HJ-NP-Y]{0,2}[- ]?[1-9]\d{0,3}[- ]?[A-HJ-NP-Y]\z'
377
+ charset:
378
+ excluded: [I, O, Z]
379
+ no_leading_zero: true
380
+ suffix_note: >-
381
+ The trailing letter is a SERIES COUNTER, not a check digit and not a
382
+ locality code: the live JPJ readings pair J with 6419, F with 859, H
383
+ with 4097, L with 1644, Q with 7665, Y with 5608, U with 5771 and P
384
+ with 3426, and no arithmetic relation survives that. Secondary
385
+ accounts add that Q and S are avoided as suffixes in Sabah and
386
+ Sarawak to prevent collision with the division prefixes; that
387
+ refinement is NOT carried in regex_strict because the live sample
388
+ contains a Q suffix (SU 7665 Q, Keningau) which contradicts it.
389
+ Recorded as a disagreement, not averaged (PRD-PLATES §5.3).
390
+ separator_note: "two printed gaps, both optional in the regexes and both spelled as separator-only classes"
391
+ design:
392
+ background: { color: "#000000", finish: non-reflective, hex_basis: observed }
393
+ foreground: "#FFFFFF"
394
+ band: { side: none }
395
+ emblem: { present: false }
396
+ rear_differs: false
397
+ region_encoding: "plates/_decode/my-index-marks.yml"
398
+ sources:
399
+ - "https://portal-api.jpj.gov.my/api/semak-no-pendaftaran-terkini # JPJ live API, queried per area code 2026-08-03 00:47-00:49 (+08): JB 6419 J Johor, KV 859 F Langkawi, QAB 3426 P Kuching, QS 5608 Y Mukah, QM 5771 U Miri, SK 4097 H Kudat, SB 1644 L Beaufort, SU 7665 Q Keningau — eight of twenty-eight areas issuing the SUFFIX form on that date"
400
+ - "https://lom.agc.gov.my/ilims/upload/portal/akta/outputaktap/1871744_BI/Act%20333_Final_15%20Oct%202023%20(25.3.24).pdf # Road Transport Act 1987 s. 11(1)(a), s. 14(1) — same statutory frame as my-standard-prefix. Accessed 2026-08-02"
401
+ - "https://web.archive.org/web/20130516074518/http://www.jpj.gov.my/web/eng/specifications-of-vehicle-number-plates # colours. Accessed 2026-08-02"
402
+ notes: >-
403
+ THE ORDINARY MALAYSIAN PLATE, suffix form: index mark, number, then a
404
+ single trailing letter — SK 4097 H, QM 5771 U, JB 6419 J. Historically the
405
+ Sabah and Sarawak arrangement, it is now also Johor's (the J…J series),
406
+ Langkawi's (KV) and was Kuala Lumpur's during the W run-out before the V
407
+ series began. Separate series from my-standard-prefix because the FORMAT
408
+ differs (PRD-PLATES §2.3); same statutory frame, same colours, same
409
+ period, and both are live — which is why both carry distinct notes and
410
+ the lint's overlap rule is satisfied honestly rather than by accident.
411
+ period.start 1987 is the Act in force, not the arrangement's origin; the
412
+ suffix form is materially older in East Malaysia and its start is a
413
+ recorded gap.
414
+
415
+ - id: my-taxi
416
+ class: taxi
417
+ categories: [car]
418
+ period: { start: 1987 }
419
+ period_evidence: agency-page-in-force
420
+ matching: strict
421
+ format:
422
+ pattern: "LLL 9999"
423
+ regex: '\A[A-Z]{1,3}[- ]?\d{1,4}\z'
424
+ regex_strict: '\AH[A-HJ-NP-Y]{1,2}[- ]?[1-9]\d{0,3}\z'
425
+ charset:
426
+ first_letter: [H]
427
+ note: >-
428
+ H for HIRE, followed by the state letter — HW for Kuala Lumpur, HP for
429
+ Penang, and so on. THE H PREFIX IS NOT SOURCED TO ANY INSTRUMENT OR
430
+ AUTHORITY PAGE: it is stated by the English Wikipedia article and
431
+ corroborated by photographs. It is carried in `regex_strict` and
432
+ flagged here; the COLOURS, which are the sourced part, are in
433
+ `design`. period_evidence records the sourcing of the SERIES (JPJ's
434
+ own page), not of the prefix.
435
+ excluded: [I, O, Z]
436
+ design:
437
+ background: { color: "#FFFFFF", finish: non-reflective, hex_basis: observed }
438
+ foreground: "#000000"
439
+ band: { side: none }
440
+ emblem: { present: false }
441
+ rear_differs: false
442
+ region_encoding: "plates/_decode/my-index-marks.yml"
443
+ sources:
444
+ - "https://web.archive.org/web/20130516074518/http://www.jpj.gov.my/web/eng/specifications-of-vehicle-number-plates # JPJ, verbatim: 'Black alphabets and numbers, embossed or glued on a white plate for taxicabs and hired cars.' — the inverted colours, one of only three plate forms JPJ recognises. Accessed 2026-08-02"
445
+ - "https://lom.agc.gov.my/ilims/upload/portal/akta/outputaktap/1871744_BI/Act%20333_Final_15%20Oct%202023%20(25.3.24).pdf # Road Transport Act 1987 s. 66(1)(s), which expressly empowers rules 'to provide for a distinctive registration number or other sign to be carried by public service vehicles or goods vehicles' — the statutory hook for a distinct taxi plate. Accessed 2026-08-02"
446
+ - "https://en.wikipedia.org/wiki/Vehicle_registration_plates_of_Malaysia # the H (hire) prefix and its state second letters. period_evidence: secondary-wikipedia. Accessed 2026-08-02"
447
+ notes: >-
448
+ TAXIS AND HIRE CARS: black on white, the exact inverse of the ordinary
449
+ plate, and one of the three plate forms JPJ's own specification page
450
+ recognises. The colour inversion is sourced to the authority; the H
451
+ prefix is secondary and is tagged as such inside `format.charset`. Note
452
+ the statutory hook in s. 66(1)(s) — Malaysian law expressly contemplates
453
+ a distinctive number or sign for public service vehicles, which is
454
+ unusually explicit for a common-law road traffic act.
455
+
456
+ - id: my-diplomatic-dc
457
+ class: diplomatic
458
+ categories: [car]
459
+ period: { start: 1987 }
460
+ period_evidence: agency-page-in-force
461
+ matching: strict
462
+ format:
463
+ pattern: "99-99-DC"
464
+ regex: '\A\d{1,3}[- ]\d{1,4}[- ]DC\z'
465
+ pattern_note: >-
466
+ Country code, rank/serial number, and the literal DC. The two numeric
467
+ groups and the DC marking are printed as three groups; the country-code
468
+ group's own table is a RECORDED GAP (PRD-PLATES puts diplomatic decode
469
+ tables at L4) and \d{1,3} is a practical bound, not a sourced one. The
470
+ RANK BLOCK of the second group IS sourced, in detail, and is carried in
471
+ plates/_decode/my-index-marks.yml.
472
+ fields:
473
+ - { name: country_code, note: "the sending state's code — table not located, recorded gap" }
474
+ - { name: rank_number, note: "allocated by diplomatic rank: 01 head of mission's official car, 02/03 head of mission's personal car, 04 deputy chief of mission / deputy high commissioner / minister, 05 minister counsellor, 06-09 counsellor, 10-19 first secretary, 20-29 second secretary, 30-39 third secretary, 40-59 attaché (including military advisers, trade representatives and defence advisers), 60-99 a diplomat's SECOND duty-free car, 101 and above vehicles registered in the name of the mission — Wisma Putra, Protocol Department, paras 6.4, 6.6, 6.8" }
475
+ - { name: marking, value: "DC", note: "Diplomatic Corps" }
476
+ separator_note: "printed as three groups; the regexes spell the gap as an emitted separator class per PRD-PLATES §2.8"
477
+ design:
478
+ background: { color: "#CC0000", finish: non-reflective, hex_basis: observed }
479
+ foreground: "#FFFFFF"
480
+ band: { side: none }
481
+ emblem: { present: false }
482
+ rear_differs: false
483
+ variants:
484
+ - class: diplomatic
485
+ design: { background: { color: "#000000", finish: non-reflective, hex_basis: observed }, foreground: "#FFFFFF" }
486
+ note: >-
487
+ MISSION-REGISTERED VEHICLES GET THE BLACK PLATE, NOT THE RED ONE, and
488
+ this is the distinction most accounts of Malaysian diplomatic plates
489
+ miss. Wisma Putra para 6.9, verbatim: "All motor vehicles for
490
+ diplomats and the Chief Representative from the Regional Office of the
491
+ United Nations will bear WHITE NUMBERS ON RED FIELD with the markings
492
+ of 'DC' or 'UN' respectively." / "All motor vehicles for the foreign
493
+ mission including the consular corps and Offices of the United Nations
494
+ will bear WHITE NUMBERS ON BLACK FIELD with the markings of 'DC', 'CC'
495
+ or 'UN' respectively." So RED means a PERSON (an accredited diplomat);
496
+ BLACK means an INSTITUTION (the mission, the consular corps, a UN
497
+ office). Colour-only variant of the same format and period, hence a
498
+ sub-entry per PRD-PLATES §2.3.
499
+ sources:
500
+ - "https://web.archive.org/web/20140714163606/http://www.kln.gov.my/web/guest/diplomat # Ministry of Foreign Affairs Malaysia, Protocol > Foreign Missions > Diplomat, 'MOTOR VEHICLES' para 6.9 'Colour Identification Of Registration Plate'. Accessed 2026-08-02"
501
+ region_encoding: "plates/_decode/my-index-marks.yml"
502
+ sources:
503
+ - "https://web.archive.org/web/20140714163606/http://www.kln.gov.my/web/guest/diplomat # Ministry of Foreign Affairs Malaysia (Wisma Putra), 'MOTOR VEHICLES' paras 6.4 (the full DC rank allocation table), 6.5 (a diplomat keeps his DC number across vehicles), 6.6 (second car 60-99), 6.7 (chargés d'affaires numbered by rank), 6.8 (mission-registered vehicles from 101), 6.9 (red vs black fields). Accessed 2026-08-02"
504
+ - "https://web.archive.org/web/20130516074518/http://www.jpj.gov.my/web/eng/specifications-of-vehicle-number-plates # JPJ, verbatim: 'White alphabets and numbers, embossed or glued on a red plate for vehicles belonging to embassies, the UN and the International Natural Rubber Association.' — the ROAD AUTHORITY's own statement of the red plate, independent of the foreign ministry's. Accessed 2026-08-02"
505
+ - "https://en.wikipedia.org/wiki/Vehicle_registration_plates_of_Malaysia # the printed group arrangement 'NN-NN-DC'. period_evidence: secondary-wikipedia. Accessed 2026-08-02"
506
+ notes: >-
507
+ DIPLOMATIC CORPS. TWO INDEPENDENT AUTHORITIES SOURCE THIS PLATE and they
508
+ agree, which is rare: JPJ (the road authority) publishes the red plate as
509
+ one of the three permitted plate forms, and Wisma Putra (the foreign
510
+ ministry) publishes the allocation rules and the red/black split. What is
511
+ sourced: the colours, the red-for-person / black-for-institution rule, and
512
+ the complete RANK-TO-NUMBER table. What is NOT sourced: the country-code
513
+ table and the exact printed group order, which come from secondary
514
+ accounts. Wisma Putra para 6.5 also gives Malaysia a small cherished-number
515
+ rule of its own — a diplomat "is required to retain the number plate even
516
+ when he disposes [of the car] after 18 months or more as the same number
517
+ will be given to his new car".
518
+
519
+ - id: my-consular-cc
520
+ class: consular
521
+ categories: [car]
522
+ period: { start: 1987 }
523
+ period_evidence: agency-page-in-force
524
+ matching: strict
525
+ format:
526
+ pattern: "99-99-CC"
527
+ regex: '\A\d{1,3}[- ]\d{1,4}[- ]CC\z'
528
+ fields:
529
+ - { name: country_code, note: "table not located, recorded gap" }
530
+ - { name: allocation_number, note: "allocated BY CONSULAR DISTRICT, not by rank alone — Kuala Lumpur 01 / 10-19 / 100-199, Penang 02 / 20-29 / 200-299, Kota Bharu 03 / 30-39 / 300-399, Kota Kinabalu 04 / 40-49 / 400-499, Kuching 05 / 50-59 / 500-599, further missions 06-09 / 60-99 / 600-999; the three columns are respectively the head of consular mission, the heads of consular offices, and vehicles registered in the mission's name. Full table in plates/_decode/my-index-marks.yml" }
531
+ - { name: marking, value: "CC", note: "Consular Corps" }
532
+ design:
533
+ background: { color: "#000000", finish: non-reflective, hex_basis: observed }
534
+ foreground: "#FFFFFF"
535
+ band: { side: none }
536
+ emblem: { present: false }
537
+ rear_differs: false
538
+ region_encoding: "plates/_decode/my-index-marks.yml"
539
+ sources:
540
+ - "https://web.archive.org/web/20140714163606/http://www.kln.gov.my/web/guest/diplomat # Wisma Putra 'MOTOR VEHICLES' para 6.10, the full CC allocation table by consular district; para 6.9, consular corps vehicles bear white numbers on a BLACK field. Also: 'Honorary Consuls are only issued with ID cards' — Malaysia gives honorary consuls NO plate at all, in pointed contrast to Thailand's grey honorary-consul plate. Accessed 2026-08-02"
541
+ notes: >-
542
+ CONSULAR CORPS: white on black, marked CC. THE ALLOCATION IS GEOGRAPHIC,
543
+ which makes it a genuine decode dimension rather than a rank code — the
544
+ leading digit of a Malaysian CC number tells you the consular district
545
+ (1 Kuala Lumpur, 2 Penang, 3 Kota Bharu, 4 Kota Kinabalu, 5 Kuching), and
546
+ the magnitude tells you whether the car belongs to the head of mission,
547
+ an office head, or the mission itself. One sentence on the same page is
548
+ worth recording for what it rules OUT: "Honorary Consuls are only issued
549
+ with ID cards" — there is no Malaysian honorary-consul plate.
550
+
551
+ - id: my-un
552
+ class: diplomatic
553
+ categories: [car]
554
+ period: { start: 1987 }
555
+ period_evidence: agency-page-in-force
556
+ # RECALL-ONLY: the printed arrangement of the UN plate is only partly
557
+ # evidenced. Wisma Putra prints its agency allocations as "10 UN", "11 UN",
558
+ # "12 UN", "14 UN" — a single number and the marking — while the personal
559
+ # and office allocations run 01-99 and "101 and above", which implies at
560
+ # least one further group. The regex therefore accepts both a one-group and
561
+ # a two-group form, which makes it wider than any single issuing grammar.
562
+ matching: recall-only
563
+ format:
564
+ pattern: "99 UN"
565
+ regex: '\A\d{1,3}[- ]?\d{0,4}[- ]?UN\z'
566
+ fields:
567
+ - { name: agency_or_country_code, note: "Wisma Putra: UNDP = 10 UN, WHO = 11 UN, FAO = 12 UN, UNHCR = 14 UN — a closed, primary, four-row allocation, carried in plates/_decode/my-index-marks.yml. 13 is skipped and the page does not say why." }
568
+ - { name: allocation_number, note: "01 official car of the head of a UN office or specialised agency; 02-05 that head's personal car; 06-99 cars registered to other UN officials; 101 and above cars registered in the name of the office or agency (Wisma Putra para 6.11)" }
569
+ - { name: marking, value: "UN" }
570
+ design:
571
+ background: { color: "#CC0000", finish: non-reflective, hex_basis: observed }
572
+ foreground: "#FFFFFF"
573
+ band: { side: none }
574
+ emblem: { present: false }
575
+ rear_differs: false
576
+ variants:
577
+ - class: diplomatic
578
+ design: { background: { color: "#000000", finish: non-reflective, hex_basis: observed }, foreground: "#FFFFFF" }
579
+ note: >-
580
+ Offices of the United Nations take the BLACK field; only the Chief
581
+ Representative of the UN Regional Office takes the RED one
582
+ (Wisma Putra para 6.9) — the same person/institution split as DC.
583
+ sources:
584
+ - "https://web.archive.org/web/20140714163606/http://www.kln.gov.my/web/guest/diplomat # para 6.9. Accessed 2026-08-02"
585
+ region_encoding: "plates/_decode/my-index-marks.yml"
586
+ sources:
587
+ - "https://web.archive.org/web/20140714163606/http://www.kln.gov.my/web/guest/diplomat # Wisma Putra 'MOTOR VEHICLES' para 6.11, the UN allocation table and the four named agency numbers (UNDP 10, WHO 11, FAO 12, UNHCR 14); para 6.9 the red/black split. Accessed 2026-08-02"
588
+ - "https://web.archive.org/web/20130516074518/http://www.jpj.gov.my/web/eng/specifications-of-vehicle-number-plates # JPJ lists 'the UN' alongside embassies as entitled to the red plate. Accessed 2026-08-02"
589
+ notes: >-
590
+ UNITED NATIONS OFFICES AND SPECIALISED AGENCIES, marked UN. Malaysia is
591
+ one of few jurisdictions with a distinct UN marking beside DC and CC, and
592
+ the reason is historical: Kuala Lumpur hosted UN regional offices and, on
593
+ JPJ's own account, the INTERNATIONAL NATURAL RUBBER ORGANIZATION, which
594
+ JPJ names in the same breath as the UN when listing who may carry the red
595
+ plate. `matching: recall-only` because the printed group count is not
596
+ fully evidenced — see the comment above the key.
597
+
598
+ - id: my-military-z
599
+ class: military
600
+ categories: [car, van, truck, bus, motorcycle]
601
+ period: { start: 1987 }
602
+ period_evidence: secondary-wikipedia
603
+ matching: strict
604
+ format:
605
+ pattern: "LL 9999"
606
+ regex: '\A[A-Z]{2}[- ]?\d{1,4}\z'
607
+ regex_strict: '\AZ[A-HJ-NP-Y][- ]?[1-9]\d{0,3}\z'
608
+ charset:
609
+ first_letter: [Z]
610
+ note: >-
611
+ Z is reserved to the Malaysian Armed Forces and is issued as no
612
+ state's mark, which is why Z is missing from the ordinary alphabet.
613
+ The second letter advances (ZA, ZB, ZC …). NOT SOURCED TO ANY
614
+ INSTRUMENT OR AUTHORITY PAGE — the reservation is stated by both the
615
+ English and Malay Wikipedia articles ("Huruf Z ditinggalkan dan
616
+ dikhaskan untuk digunakan pada kenderaan tentera Malaysia") and is
617
+ consistent with Z's absence from JPJ's own live area/prefix data.
618
+ separator_note: "a printed gap, optional in the regexes"
619
+ design:
620
+ background: { color: "#000000", finish: non-reflective, hex_basis: observed }
621
+ foreground: "#FFFFFF"
622
+ band: { side: none }
623
+ emblem: { present: false }
624
+ rear_differs: false
625
+ region_encoding: none
626
+ sources:
627
+ - "https://ms.wikipedia.org/wiki/Plat_pendaftaran_kenderaan_Malaysia # 'Huruf Z ditinggalkan dan dikhaskan untuk digunakan pada kenderaan tentera Malaysia' — Z reserved for Malaysian military vehicles. period_evidence: secondary-wikipedia. Accessed 2026-08-02"
628
+ - "https://en.wikipedia.org/wiki/Vehicle_registration_plates_of_Malaysia # the ZA-prefixed arrangement and the white-on-black plate. period_evidence: secondary-wikipedia. Accessed 2026-08-02"
629
+ - "https://portal-api.jpj.gov.my/api/locations # NEGATIVE evidence, and the honest kind: JPJ's closed list of 32 registration areas contains no Z code, which is consistent with Z being outside the civil registration system entirely. Queried 2026-08-03"
630
+ notes: >-
631
+ MALAYSIAN ARMED FORCES (Angkatan Tentera Malaysia). THE WEAKEST-SOURCED
632
+ SERIES IN THIS FILE and labelled as such: no instrument and no authority
633
+ page located says anything about Z. It is carried because the RESERVATION
634
+ of Z is load-bearing elsewhere — it is why `regex_strict` on every
635
+ civilian series excludes Z — and because omitting it would leave that
636
+ exclusion unexplained. period.start 1987 is the Act in force, carrying no
637
+ claim about when the Z reservation began. A verifier with access to the
638
+ Malaysian Armed Forces' own regulations should expect to replace this
639
+ entry wholesale.
640
+
641
+ - id: my-jpjeplate-ev-2024
642
+ class: electric
643
+ categories: [car]
644
+ period: { start: 2024 }
645
+ period_evidence: secondary-first-issue
646
+ matching: strict
647
+ format:
648
+ pattern: "LLL 9999"
649
+ regex: '\A[A-Z]{1,3}[- ]?\d{1,4}\z'
650
+ regex_strict: '\A[ABCDFJKLMNPQRSTVW][A-HJ-NP-Y]{0,2}[- ]?[1-9]\d{0,3}\z'
651
+ note: >-
652
+ The MARK is an ordinary Malaysian registration — this is a different
653
+ PLATE, not a different numbering system, which is exactly the
654
+ PRD-PLATES §2.3 test for a series of its own (design differs, format
655
+ and period do not).
656
+ design:
657
+ plate_note: >-
658
+ "European-style" proportions are reported by every account and no
659
+ millimetres are sourced; none are recorded here.
660
+ background: { color: "#FFFFFF", finish: retroreflective, hex_basis: observed }
661
+ foreground: "#000000"
662
+ band: { side: left, color: "#009000", content: "green stripe + Jalur Gemilang (national flag) + the international distinguishing code MAL", hex_basis: observed }
663
+ emblem: { present: true, rendered: placeholder, note: "the national flag is a state emblem — PRD-PLATES §3 placeholder rule applies, artwork not reproduced" }
664
+ rear_differs: false
665
+ features: >-
666
+ Embossed characters in FE-Schrift on a white retroreflective ground with
667
+ an embedded RFID tag — the first Malaysian plate to prescribe a
668
+ typeface at all, and the first to leave white-on-black.
669
+ region_encoding: "plates/_decode/my-index-marks.yml"
670
+ sources:
671
+ - "https://soyacincau.com/2024/09/09/jpjeplate-ev-number-plate-malaysia-official-price/ # JPJePlate launch, September 2024: mandatory for newly registered electric cars, European-style plate, black FE-Schrift on white reflective ground, green stripe, Jalur Gemilang, MAL code, embedded RFID. period_evidence: secondary-first-issue. Accessed 2026-08-02"
672
+ - "https://en.wikipedia.org/wiki/Vehicle_registration_plates_of_Malaysia # 'The JPJePlate number plate was introduced in September 2024 ... compulsory for newly registered EVs from September 2024 onwards. Currently available for Electric powered cars only.' period_evidence: secondary-wikipedia. Accessed 2026-08-02"
673
+ notes: >-
674
+ JPJePLATE, the electric-vehicle plate, mandatory for EVs newly registered
675
+ from September 2024. THE FIRST BREAK IN MALAYSIA'S WHITE-ON-BLACK
676
+ CONVENTION IN THE MODERN ERA, and the first Malaysian plate with a named
677
+ typeface, an international distinguishing code and an RFID tag. ENTIRELY
678
+ SECONDARY-SOURCED: no instrument and no JPJ page carrying its
679
+ specification was located in this pass, and JPJ's own knowledge-base
680
+ article still describes only the three older plate forms. Recorded because
681
+ a current-standard file that omits the current EV plate is incomplete, and
682
+ tagged so a verifier knows precisely how much to re-check. A related 2026
683
+ development — the "Teksi Madani" scheme's red-on-white JPJePlate for taxis
684
+ from 3 July 2026 — is NOT authored here: it rests on a single secondary
685
+ mention and has no located specification.