@bsv/dpp-profiles 0.3.0-beta.1

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 (96) hide show
  1. package/LICENSE +58 -0
  2. package/README.md +64 -0
  3. package/dist/applicability.d.ts +96 -0
  4. package/dist/applicability.d.ts.map +1 -0
  5. package/dist/applicability.js +181 -0
  6. package/dist/applicability.js.map +1 -0
  7. package/dist/combinations.d.ts +30 -0
  8. package/dist/combinations.d.ts.map +1 -0
  9. package/dist/combinations.js +103 -0
  10. package/dist/combinations.js.map +1 -0
  11. package/dist/evidence-shapes.d.ts +198 -0
  12. package/dist/evidence-shapes.d.ts.map +1 -0
  13. package/dist/evidence-shapes.js +123 -0
  14. package/dist/evidence-shapes.js.map +1 -0
  15. package/dist/gs1-epc-binary.d.ts +81 -0
  16. package/dist/gs1-epc-binary.d.ts.map +1 -0
  17. package/dist/gs1-epc-binary.js +252 -0
  18. package/dist/gs1-epc-binary.js.map +1 -0
  19. package/dist/gs1-resolution.d.ts +392 -0
  20. package/dist/gs1-resolution.d.ts.map +1 -0
  21. package/dist/gs1-resolution.js +696 -0
  22. package/dist/gs1-resolution.js.map +1 -0
  23. package/dist/identifiers.d.ts +57 -0
  24. package/dist/identifiers.d.ts.map +1 -0
  25. package/dist/identifiers.js +117 -0
  26. package/dist/identifiers.js.map +1 -0
  27. package/dist/index.d.ts +235 -0
  28. package/dist/index.d.ts.map +1 -0
  29. package/dist/index.js +124 -0
  30. package/dist/index.js.map +1 -0
  31. package/dist/manifest-v2.d.ts +87 -0
  32. package/dist/manifest-v2.d.ts.map +1 -0
  33. package/dist/manifest-v2.js +31 -0
  34. package/dist/manifest-v2.js.map +1 -0
  35. package/dist/mapping.d.ts +84 -0
  36. package/dist/mapping.d.ts.map +1 -0
  37. package/dist/mapping.js +88 -0
  38. package/dist/mapping.js.map +1 -0
  39. package/dist/projections.d.ts +233 -0
  40. package/dist/projections.d.ts.map +1 -0
  41. package/dist/projections.js +466 -0
  42. package/dist/projections.js.map +1 -0
  43. package/frozen.json +42 -0
  44. package/generated/consumer/battery-v2.json +2248 -0
  45. package/generated/consumer/battery-v3.json +4354 -0
  46. package/generated/consumer/general-v1.json +9 -0
  47. package/generated/consumer/general-v2.json +714 -0
  48. package/generated/consumer/textile-v1.json +101 -0
  49. package/generated/consumer/textile-v2.json +1033 -0
  50. package/generated/consumer/textile-v3.json +2011 -0
  51. package/generated/index.json +86 -0
  52. package/generated/mapping/battery@2.md +116 -0
  53. package/generated/mapping/battery@3.md +130 -0
  54. package/generated/mapping/general@2.md +50 -0
  55. package/generated/mapping/textile@2.md +61 -0
  56. package/generated/mapping/textile@3.md +73 -0
  57. package/generated/payload-schema/battery@2.public.schema.json +609 -0
  58. package/generated/payload-schema/battery@2.restricted.schema.json +377 -0
  59. package/generated/payload-schema/battery@3.public.schema.json +1364 -0
  60. package/generated/payload-schema/battery@3.restricted.schema.json +1097 -0
  61. package/generated/payload-schema/general@1.public.schema.json +37 -0
  62. package/generated/payload-schema/general@1.restricted.schema.json +9 -0
  63. package/generated/payload-schema/general@2.public.schema.json +352 -0
  64. package/generated/payload-schema/general@2.restricted.schema.json +52 -0
  65. package/generated/payload-schema/textile@1.public.schema.json +82 -0
  66. package/generated/payload-schema/textile@1.restricted.schema.json +22 -0
  67. package/generated/payload-schema/textile@2.public.schema.json +464 -0
  68. package/generated/payload-schema/textile@2.restricted.schema.json +78 -0
  69. package/generated/payload-schema/textile@3.public.schema.json +1299 -0
  70. package/generated/payload-schema/textile@3.restricted.schema.json +78 -0
  71. package/manifests/battery@2.json +4047 -0
  72. package/manifests/battery@3.json +6164 -0
  73. package/manifests/exchange/untp-0.7.0-jose@1.json +191 -0
  74. package/manifests/exchange/vc-di-ecdsa-rdfc-2019@1.json +74 -0
  75. package/manifests/exchange/vsc-draft-compat@0.1.0.json +64 -0
  76. package/manifests/general@1.json +148 -0
  77. package/manifests/general@2.json +1266 -0
  78. package/manifests/interoperability/epcis-json@1.json +69 -0
  79. package/manifests/interoperability/epcis-vsc@1.json +64 -0
  80. package/manifests/interoperability/gs1-digital-link@1.json +71 -0
  81. package/manifests/operator/federated-operators@1.json +54 -0
  82. package/manifests/operator/single-operator@1.json +52 -0
  83. package/manifests/textile@1.json +383 -0
  84. package/manifests/textile@2.json +1682 -0
  85. package/manifests/textile@3.json +2763 -0
  86. package/package.json +59 -0
  87. package/schemas/exchange-profile.schema.json +134 -0
  88. package/schemas/gs1/NOTICE.md +11 -0
  89. package/schemas/gs1/resolver-description-file-schema-1.2.0.json +124 -0
  90. package/schemas/gs1/resolver-linkset-context-1.2.1.jsonld +39 -0
  91. package/schemas/gs1/resolver-linkset-schema-1.2.1.json +96 -0
  92. package/schemas/interoperability-profile.schema.json +347 -0
  93. package/schemas/operator-profile.schema.json +108 -0
  94. package/schemas/product-identity.schema.json +45 -0
  95. package/schemas/profile-manifest-v2.schema.json +1087 -0
  96. package/schemas/profile-manifest.schema.json +291 -0
@@ -0,0 +1,1266 @@
1
+ {
2
+ "manifestVersion": "1",
3
+ "kind": "industry",
4
+ "baseline": "native-baseline@1",
5
+ "roles": [
6
+ "passport-writer",
7
+ "attestation-issuer",
8
+ "registry",
9
+ "passport-reader"
10
+ ],
11
+ "schemaDialect": "https://json-schema.org/draft/2020-12/schema",
12
+ "accessPolicyRef": "spec/record-model.md#7-the-owner-tier-binding",
13
+ "accessTiers": [
14
+ {
15
+ "id": "public",
16
+ "description": "Anyone with the identifier.",
17
+ "storage": "on-chain public payload"
18
+ },
19
+ {
20
+ "id": "owner",
21
+ "description": "The current holder, travelling with possession rather than with an authorisation.",
22
+ "storage": "off-chain encrypted"
23
+ },
24
+ {
25
+ "id": "legitimate",
26
+ "description": "Persons with a legitimate interest, the Batteries Regulation Article 77(2) group generalised.",
27
+ "storage": "off-chain encrypted"
28
+ },
29
+ {
30
+ "id": "authority",
31
+ "description": "Notified bodies, market surveillance and other authorities.",
32
+ "storage": "off-chain encrypted"
33
+ }
34
+ ],
35
+ "extends": null,
36
+ "id": "general",
37
+ "version": 2,
38
+ "profile": "general@2",
39
+ "status": "current",
40
+ "title": "General product passport",
41
+ "description": "A voluntary profile. An obligation of \"must\" here means the record would not be a passport without the value, not that any law asks for it.",
42
+ "regulatoryLine": "No rule covers these products, and none is claimed. The record follows the same shape as the regulated profiles so a maker who later falls in scope is already close to it.",
43
+ "applicability": {
44
+ "categories": [
45
+ {
46
+ "value": "bicycle",
47
+ "label": "Bicycle"
48
+ },
49
+ {
50
+ "value": "watch",
51
+ "label": "Watch or clock"
52
+ },
53
+ {
54
+ "value": "instrument",
55
+ "label": "Musical instrument"
56
+ },
57
+ {
58
+ "value": "furniture",
59
+ "label": "Furniture"
60
+ },
61
+ {
62
+ "value": "luggage",
63
+ "label": "Luggage or leather goods"
64
+ },
65
+ {
66
+ "value": "jewellery",
67
+ "label": "Jewellery"
68
+ },
69
+ {
70
+ "value": "appliance",
71
+ "label": "Appliance or tool"
72
+ },
73
+ {
74
+ "value": "sportsEquipment",
75
+ "label": "Sports equipment"
76
+ },
77
+ {
78
+ "value": "artwork",
79
+ "label": "Artwork or object"
80
+ }
81
+ ],
82
+ "categoryKey": "category",
83
+ "jurisdictions": [],
84
+ "statements": [
85
+ {
86
+ "text": "No instrument requires a passport for these products, and none is cited as if one did; every field states that in its legal basis.",
87
+ "status": "needs-review"
88
+ }
89
+ ]
90
+ },
91
+ "schemaUri": "generated/payload-schema/general@2.public.schema.json",
92
+ "schemaDigest": "fa82ad26b73ddfb99b7fea20b464b20c6f2e4c58ef750f567c880f83f5fa8a6c",
93
+ "restrictedSchemaUri": "generated/payload-schema/general@2.restricted.schema.json",
94
+ "restrictedSchemaDigest": "4960025fb10a0fd274f9527ca1d0184adf22621d950a0a72dad6c339639c6c1f",
95
+ "contextRefs": [],
96
+ "stamps": [
97
+ {
98
+ "key": "notice",
99
+ "description": "The sample marker a demonstration record carries first; never product data.",
100
+ "valueType": "text"
101
+ },
102
+ {
103
+ "key": "profile",
104
+ "description": "The profile identifier the payload declares.",
105
+ "valueType": "id",
106
+ "const": "general"
107
+ },
108
+ {
109
+ "key": "profile_version",
110
+ "description": "The profile version the payload declares; a reader decodes under it and never under a newer one.",
111
+ "valueType": "integer",
112
+ "const": 2
113
+ },
114
+ {
115
+ "key": "object_did",
116
+ "description": "An optional physical-object DID carried in the public payload; carrying it does not implement physical binding.",
117
+ "valueType": "id"
118
+ },
119
+ {
120
+ "key": "dataCarrier",
121
+ "description": "The data-carrier identifier (chip UID) the lookup service indexes beside the passport identifier.",
122
+ "valueType": "id"
123
+ }
124
+ ],
125
+ "fields": [
126
+ {
127
+ "key": "name",
128
+ "pointer": "/name",
129
+ "label": "Product name",
130
+ "valueType": "text",
131
+ "cardinality": "one",
132
+ "granularity": "model",
133
+ "provenance": {
134
+ "capture": "form",
135
+ "prose": true
136
+ },
137
+ "accessTier": "public",
138
+ "obligation": "required",
139
+ "legalBasis": "Nothing requires this. A record with no name is not a passport.",
140
+ "applicability": {
141
+ "rule": "always"
142
+ },
143
+ "supersedes": "name",
144
+ "group": "identification",
145
+ "note": "What the maker calls it. Nothing else identifies an object to the person holding it."
146
+ },
147
+ {
148
+ "key": "category",
149
+ "pointer": "/category",
150
+ "label": "Kind of object",
151
+ "valueType": "enum",
152
+ "codeList": {
153
+ "closed": false,
154
+ "options": [
155
+ {
156
+ "value": "bicycle",
157
+ "label": "Bicycle"
158
+ },
159
+ {
160
+ "value": "watch",
161
+ "label": "Watch or clock"
162
+ },
163
+ {
164
+ "value": "instrument",
165
+ "label": "Musical instrument"
166
+ },
167
+ {
168
+ "value": "furniture",
169
+ "label": "Furniture"
170
+ },
171
+ {
172
+ "value": "luggage",
173
+ "label": "Luggage or leather goods"
174
+ },
175
+ {
176
+ "value": "jewellery",
177
+ "label": "Jewellery"
178
+ },
179
+ {
180
+ "value": "appliance",
181
+ "label": "Appliance or tool"
182
+ },
183
+ {
184
+ "value": "sportsEquipment",
185
+ "label": "Sports equipment"
186
+ },
187
+ {
188
+ "value": "artwork",
189
+ "label": "Artwork or object"
190
+ }
191
+ ]
192
+ },
193
+ "cardinality": "one",
194
+ "granularity": "model",
195
+ "provenance": {
196
+ "capture": "form"
197
+ },
198
+ "accessTier": "public",
199
+ "obligation": "required",
200
+ "legalBasis": "Nothing requires this. It decides which of the fields below make sense.",
201
+ "applicability": {
202
+ "rule": "always"
203
+ },
204
+ "group": "identification",
205
+ "note": "Open by definition: the whole point of this profile is that the list is not knowable."
206
+ },
207
+ {
208
+ "key": "manufacturer",
209
+ "pointer": "/manufacturer",
210
+ "label": "Maker",
211
+ "valueType": "text",
212
+ "cardinality": "one",
213
+ "granularity": "model",
214
+ "provenance": {
215
+ "capture": "brand",
216
+ "prose": true
217
+ },
218
+ "accessTier": "public",
219
+ "obligation": "required",
220
+ "legalBasis": "Nothing requires this. On a handbuilt object the maker is the claim.",
221
+ "applicability": {
222
+ "rule": "always"
223
+ },
224
+ "supersedes": "manufacturer",
225
+ "group": "identification",
226
+ "note": "A workshop, a studio or a company; a name and nothing to constrain it to."
227
+ },
228
+ {
229
+ "key": "manufacturerContact",
230
+ "pointer": "/manufacturerContact",
231
+ "label": "How to reach the maker",
232
+ "valueType": "text",
233
+ "cardinality": "one",
234
+ "granularity": "model",
235
+ "provenance": {
236
+ "capture": "brand",
237
+ "prose": true
238
+ },
239
+ "accessTier": "public",
240
+ "obligation": "required",
241
+ "legalBasis": "Nothing requires this. A guarantee nobody can claim against is decoration.",
242
+ "applicability": {
243
+ "rule": "always"
244
+ },
245
+ "group": "identification",
246
+ "note": "An email, an address or a page. Constraining it to one shape would exclude the others."
247
+ },
248
+ {
249
+ "key": "modelIdentifier",
250
+ "pointer": "/modelIdentifier",
251
+ "label": "Model or reference",
252
+ "valueType": "id",
253
+ "constraints": {
254
+ "maxLength": 64
255
+ },
256
+ "cardinality": "one",
257
+ "granularity": "model",
258
+ "provenance": {
259
+ "capture": "form"
260
+ },
261
+ "accessTier": "public",
262
+ "obligation": "recommended",
263
+ "legalBasis": "Nothing requires this. It is how a maker finds the drawings again.",
264
+ "applicability": {
265
+ "rule": "always"
266
+ },
267
+ "group": "identification"
268
+ },
269
+ {
270
+ "key": "serialNumber",
271
+ "pointer": "/serialNumber",
272
+ "label": "Serial number",
273
+ "valueType": "id",
274
+ "constraints": {
275
+ "maxLength": 64
276
+ },
277
+ "cardinality": "one",
278
+ "granularity": "item",
279
+ "provenance": {
280
+ "capture": "form"
281
+ },
282
+ "accessTier": "public",
283
+ "obligation": "recommended",
284
+ "legalBasis": "Nothing requires this. It is the commonest way an object proves it is the one.",
285
+ "applicability": {
286
+ "rule": "always"
287
+ },
288
+ "group": "identification"
289
+ },
290
+ {
291
+ "key": "manufacturingPlace",
292
+ "pointer": "/manufacturingPlace",
293
+ "label": "Where it was made",
294
+ "valueType": "record",
295
+ "cardinality": "one",
296
+ "granularity": "model",
297
+ "provenance": {
298
+ "capture": "form"
299
+ },
300
+ "accessTier": "public",
301
+ "obligation": "recommended",
302
+ "legalBasis": "Nothing requires this. Place is half of provenance.",
303
+ "applicability": {
304
+ "rule": "always"
305
+ },
306
+ "group": "identification",
307
+ "parts": [
308
+ {
309
+ "key": "city",
310
+ "label": "Town or city",
311
+ "valueType": "text",
312
+ "required": true
313
+ },
314
+ {
315
+ "key": "country",
316
+ "label": "Country",
317
+ "valueType": "country",
318
+ "constraints": {
319
+ "pattern": "^[A-Z]{2}$",
320
+ "patternHint": "a two-letter country code"
321
+ },
322
+ "required": true
323
+ }
324
+ ]
325
+ },
326
+ {
327
+ "key": "made",
328
+ "pointer": "/made",
329
+ "label": "Made",
330
+ "valueType": "monthYear",
331
+ "cardinality": "one",
332
+ "granularity": "item",
333
+ "provenance": {
334
+ "capture": "form"
335
+ },
336
+ "accessTier": "public",
337
+ "obligation": "recommended",
338
+ "legalBasis": "Nothing requires this. Age is what a durable object is judged on.",
339
+ "applicability": {
340
+ "rule": "always"
341
+ },
342
+ "group": "identification"
343
+ },
344
+ {
345
+ "key": "dimensions",
346
+ "pointer": "/dimensions",
347
+ "label": "Dimensions",
348
+ "valueType": "text",
349
+ "constraints": {
350
+ "maxLength": 120
351
+ },
352
+ "cardinality": "one",
353
+ "granularity": "model",
354
+ "provenance": {
355
+ "capture": "form",
356
+ "prose": true
357
+ },
358
+ "accessTier": "public",
359
+ "obligation": "recommended",
360
+ "legalBasis": "Nothing requires this. It is what a second buyer asks first.",
361
+ "applicability": {
362
+ "rule": "always"
363
+ },
364
+ "group": "identification",
365
+ "note": "A frame size, a case diameter, a seat height. No two categories measure alike."
366
+ },
367
+ {
368
+ "key": "weight",
369
+ "pointer": "/weight",
370
+ "label": "Weight",
371
+ "valueType": "decimal",
372
+ "unit": "g",
373
+ "constraints": {
374
+ "minimum": 1,
375
+ "maximum": 50000,
376
+ "step": 1
377
+ },
378
+ "cardinality": "one",
379
+ "granularity": "model",
380
+ "provenance": {
381
+ "capture": "form"
382
+ },
383
+ "accessTier": "public",
384
+ "obligation": "recommended",
385
+ "legalBasis": "Nothing requires this.",
386
+ "applicability": {
387
+ "rule": "always"
388
+ },
389
+ "group": "identification"
390
+ },
391
+ {
392
+ "key": "edition",
393
+ "pointer": "/edition",
394
+ "label": "Edition",
395
+ "valueType": "text",
396
+ "constraints": {
397
+ "maxLength": 80
398
+ },
399
+ "cardinality": "one",
400
+ "granularity": "item",
401
+ "provenance": {
402
+ "capture": "form",
403
+ "prose": true
404
+ },
405
+ "accessTier": "public",
406
+ "obligation": "recommended",
407
+ "legalBasis": "Nothing requires this. On a limited run it is most of the value.",
408
+ "applicability": {
409
+ "rule": "always"
410
+ },
411
+ "group": "provenance",
412
+ "note": "Numbered, limited, one of one, or a named run. Every workshop counts differently."
413
+ },
414
+ {
415
+ "key": "makerName",
416
+ "pointer": "/makerName",
417
+ "label": "Made by",
418
+ "valueType": "text",
419
+ "constraints": {
420
+ "maxLength": 120
421
+ },
422
+ "cardinality": "one",
423
+ "granularity": "item",
424
+ "provenance": {
425
+ "capture": "form",
426
+ "prose": true
427
+ },
428
+ "accessTier": "public",
429
+ "obligation": "recommended",
430
+ "legalBasis": "Nothing requires this. It is the difference between made and manufactured.",
431
+ "applicability": {
432
+ "rule": "always"
433
+ },
434
+ "group": "provenance",
435
+ "note": "The person, where a person can be named. A workshop is a company; a maker is not."
436
+ },
437
+ {
438
+ "key": "authentication",
439
+ "pointer": "/authentication",
440
+ "label": "How to tell it is the real one",
441
+ "valueType": "multi",
442
+ "codeList": {
443
+ "closed": false,
444
+ "options": [
445
+ {
446
+ "value": "serial",
447
+ "label": "Serial number"
448
+ },
449
+ {
450
+ "value": "makersMark",
451
+ "label": "Maker's mark"
452
+ },
453
+ {
454
+ "value": "signature",
455
+ "label": "Signature"
456
+ },
457
+ {
458
+ "value": "certificate",
459
+ "label": "Certificate of authenticity"
460
+ },
461
+ {
462
+ "value": "tag",
463
+ "label": "Tag on the product"
464
+ },
465
+ {
466
+ "value": "hallmark",
467
+ "label": "Hallmark"
468
+ }
469
+ ]
470
+ },
471
+ "cardinality": "one",
472
+ "granularity": "model",
473
+ "provenance": {
474
+ "capture": "form"
475
+ },
476
+ "accessTier": "public",
477
+ "obligation": "recommended",
478
+ "legalBasis": "Nothing requires this. It is the question a passport exists to answer.",
479
+ "applicability": {
480
+ "rule": "always"
481
+ },
482
+ "group": "provenance",
483
+ "note": "Open: trades authenticate in ways this list will not have thought of."
484
+ },
485
+ {
486
+ "key": "certificate",
487
+ "pointer": "/certificate",
488
+ "label": "Certificate",
489
+ "valueType": "document",
490
+ "cardinality": "one",
491
+ "granularity": "item",
492
+ "provenance": {
493
+ "capture": "form"
494
+ },
495
+ "accessTier": "public",
496
+ "obligation": "recommended",
497
+ "legalBasis": "Nothing requires this. The paper certificate, kept where it cannot be lost.",
498
+ "applicability": {
499
+ "rule": "always"
500
+ },
501
+ "group": "provenance"
502
+ },
503
+ {
504
+ "key": "commission",
505
+ "pointer": "/commission",
506
+ "label": "Made for",
507
+ "valueType": "text",
508
+ "constraints": {
509
+ "maxLength": 200
510
+ },
511
+ "cardinality": "one",
512
+ "granularity": "item",
513
+ "provenance": {
514
+ "capture": "form",
515
+ "prose": true
516
+ },
517
+ "accessTier": "public",
518
+ "obligation": "optional",
519
+ "legalBasis": "Nothing requires this. Published only where the first owner wanted it published.",
520
+ "applicability": {
521
+ "rule": "always"
522
+ },
523
+ "group": "provenance",
524
+ "note": "Who it was built for, where the first owner is part of the story."
525
+ },
526
+ {
527
+ "key": "materials",
528
+ "pointer": "/materials",
529
+ "label": "Materials",
530
+ "valueType": "record",
531
+ "cardinality": "many",
532
+ "granularity": "model",
533
+ "provenance": {
534
+ "capture": "form"
535
+ },
536
+ "accessTier": "public",
537
+ "obligation": "required",
538
+ "legalBasis": "Nothing requires this. It is the first thing a repairer needs and the last thing a recycler needs.",
539
+ "applicability": {
540
+ "rule": "always"
541
+ },
542
+ "group": "making",
543
+ "parts": [
544
+ {
545
+ "key": "part",
546
+ "label": "Part",
547
+ "valueType": "text",
548
+ "required": true
549
+ },
550
+ {
551
+ "key": "material",
552
+ "label": "Material",
553
+ "valueType": "text",
554
+ "required": true
555
+ },
556
+ {
557
+ "key": "origin",
558
+ "label": "Country",
559
+ "valueType": "country",
560
+ "constraints": {
561
+ "pattern": "^[A-Z]{2}$",
562
+ "patternHint": "a two-letter country code"
563
+ }
564
+ }
565
+ ]
566
+ },
567
+ {
568
+ "key": "method",
569
+ "pointer": "/method",
570
+ "label": "How it was made",
571
+ "valueType": "enum",
572
+ "codeList": {
573
+ "closed": false,
574
+ "options": [
575
+ {
576
+ "value": "handmade",
577
+ "label": "Handmade"
578
+ },
579
+ {
580
+ "value": "handFinished",
581
+ "label": "Hand-finished"
582
+ },
583
+ {
584
+ "value": "madeToOrder",
585
+ "label": "Made to order"
586
+ },
587
+ {
588
+ "value": "smallSeries",
589
+ "label": "Small series"
590
+ },
591
+ {
592
+ "value": "series",
593
+ "label": "Series production"
594
+ }
595
+ ]
596
+ },
597
+ "cardinality": "one",
598
+ "granularity": "model",
599
+ "provenance": {
600
+ "capture": "form"
601
+ },
602
+ "accessTier": "public",
603
+ "obligation": "recommended",
604
+ "legalBasis": "Nothing requires this. It is most of what a buyer is paying for.",
605
+ "applicability": {
606
+ "rule": "always"
607
+ },
608
+ "group": "making",
609
+ "note": "Open: crafts describe their own methods, and a closed list would flatten them."
610
+ },
611
+ {
612
+ "key": "finish",
613
+ "pointer": "/finish",
614
+ "label": "Finish",
615
+ "valueType": "text",
616
+ "constraints": {
617
+ "maxLength": 200
618
+ },
619
+ "cardinality": "one",
620
+ "granularity": "model",
621
+ "provenance": {
622
+ "capture": "form",
623
+ "prose": true
624
+ },
625
+ "accessTier": "public",
626
+ "obligation": "recommended",
627
+ "legalBasis": "Nothing requires this.",
628
+ "applicability": {
629
+ "rule": "always"
630
+ },
631
+ "group": "making",
632
+ "note": "Lacquer, patina, plating, oil. The thing a restorer must not strip by mistake."
633
+ },
634
+ {
635
+ "key": "notes",
636
+ "pointer": "/notes",
637
+ "label": "Anything else worth recording",
638
+ "valueType": "text",
639
+ "constraints": {
640
+ "maxLength": 1200
641
+ },
642
+ "cardinality": "one",
643
+ "granularity": "model",
644
+ "provenance": {
645
+ "capture": "form",
646
+ "prose": true
647
+ },
648
+ "accessTier": "public",
649
+ "obligation": "optional",
650
+ "legalBasis": "Nothing requires this. It is what keeps a declared profile usable for objects nobody has thought of.",
651
+ "applicability": {
652
+ "rule": "always"
653
+ },
654
+ "group": "making",
655
+ "note": "The declared fields cannot anticipate every craft, so one field stays open. It is a named field with a place in the record, not a freeform profile."
656
+ },
657
+ {
658
+ "key": "recycledContent",
659
+ "pointer": "/recycledContent",
660
+ "label": "Recycled content",
661
+ "valueType": "percent",
662
+ "unit": "%",
663
+ "constraints": {
664
+ "minimum": 0,
665
+ "maximum": 100
666
+ },
667
+ "cardinality": "one",
668
+ "granularity": "model",
669
+ "provenance": {
670
+ "capture": "form"
671
+ },
672
+ "accessTier": "public",
673
+ "obligation": "optional",
674
+ "legalBasis": "Nothing requires this. Declared where a maker can substantiate it.",
675
+ "applicability": {
676
+ "rule": "always"
677
+ },
678
+ "group": "making"
679
+ },
680
+ {
681
+ "key": "substanceStatement",
682
+ "pointer": "/substanceStatement",
683
+ "label": "Substances to handle with care",
684
+ "valueType": "text",
685
+ "constraints": {
686
+ "maxLength": 400
687
+ },
688
+ "cardinality": "one",
689
+ "granularity": "model",
690
+ "provenance": {
691
+ "capture": "form",
692
+ "prose": true
693
+ },
694
+ "accessTier": "public",
695
+ "obligation": "recommended",
696
+ "legalBasis": "Nothing requires this here, though REACH Art. 33 may require it of the article itself.",
697
+ "applicability": {
698
+ "rule": "always"
699
+ },
700
+ "group": "making",
701
+ "note": "Lead solder, shellac, cadmium in old plating. Prose, because the reader is a person."
702
+ },
703
+ {
704
+ "key": "careNote",
705
+ "pointer": "/careNote",
706
+ "label": "How to look after it",
707
+ "valueType": "text",
708
+ "constraints": {
709
+ "maxLength": 600
710
+ },
711
+ "cardinality": "one",
712
+ "granularity": "model",
713
+ "provenance": {
714
+ "capture": "form",
715
+ "prose": true
716
+ },
717
+ "accessTier": "public",
718
+ "obligation": "required",
719
+ "legalBasis": "Nothing requires this. It is the single field most likely to extend the object’s life.",
720
+ "applicability": {
721
+ "rule": "always"
722
+ },
723
+ "supersedes": "care",
724
+ "group": "durability",
725
+ "note": "The advice a maker gives when they hand it over, which no symbol set carries."
726
+ },
727
+ {
728
+ "key": "serviceInterval",
729
+ "pointer": "/serviceInterval",
730
+ "label": "Service interval",
731
+ "valueType": "text",
732
+ "constraints": {
733
+ "maxLength": 120
734
+ },
735
+ "cardinality": "one",
736
+ "granularity": "model",
737
+ "provenance": {
738
+ "capture": "form",
739
+ "prose": true
740
+ },
741
+ "accessTier": "public",
742
+ "obligation": "recommended",
743
+ "legalBasis": "Nothing requires this.",
744
+ "applicability": {
745
+ "rule": "always"
746
+ },
747
+ "group": "durability",
748
+ "note": "Every five years, every 5,000 km, after every season. No one unit fits."
749
+ },
750
+ {
751
+ "key": "expectedLifetime",
752
+ "pointer": "/expectedLifetime",
753
+ "label": "Expected lifetime",
754
+ "valueType": "integer",
755
+ "unit": "years",
756
+ "constraints": {
757
+ "minimum": 1,
758
+ "maximum": 500,
759
+ "step": 1
760
+ },
761
+ "cardinality": "one",
762
+ "granularity": "model",
763
+ "provenance": {
764
+ "capture": "form"
765
+ },
766
+ "accessTier": "public",
767
+ "obligation": "recommended",
768
+ "legalBasis": "Nothing requires this. A claim made here is one the maker can be held to.",
769
+ "applicability": {
770
+ "rule": "always"
771
+ },
772
+ "group": "durability"
773
+ },
774
+ {
775
+ "key": "guarantee",
776
+ "pointer": "/guarantee",
777
+ "label": "Guarantee",
778
+ "valueType": "integer",
779
+ "unit": "months",
780
+ "constraints": {
781
+ "minimum": 0,
782
+ "maximum": 1200,
783
+ "step": 1
784
+ },
785
+ "cardinality": "one",
786
+ "granularity": "model",
787
+ "provenance": {
788
+ "capture": "form"
789
+ },
790
+ "accessTier": "public",
791
+ "obligation": "recommended",
792
+ "legalBasis": "Nothing requires the figure, though a stated commercial guarantee binds the maker.",
793
+ "applicability": {
794
+ "rule": "always"
795
+ },
796
+ "group": "durability"
797
+ },
798
+ {
799
+ "key": "guaranteeTerms",
800
+ "pointer": "/guaranteeTerms",
801
+ "label": "Guarantee terms",
802
+ "valueType": "document",
803
+ "cardinality": "one",
804
+ "granularity": "model",
805
+ "provenance": {
806
+ "capture": "form"
807
+ },
808
+ "accessTier": "public",
809
+ "obligation": "recommended",
810
+ "legalBasis": "Nothing requires this. A term with no conditions attached is not a guarantee.",
811
+ "applicability": {
812
+ "rule": "always"
813
+ },
814
+ "group": "durability"
815
+ },
816
+ {
817
+ "key": "repairability",
818
+ "pointer": "/repairability",
819
+ "label": "What can be repaired",
820
+ "valueType": "text",
821
+ "constraints": {
822
+ "maxLength": 400
823
+ },
824
+ "cardinality": "one",
825
+ "granularity": "model",
826
+ "provenance": {
827
+ "capture": "form",
828
+ "prose": true
829
+ },
830
+ "accessTier": "public",
831
+ "obligation": "recommended",
832
+ "legalBasis": "Nothing requires this.",
833
+ "applicability": {
834
+ "rule": "always"
835
+ },
836
+ "group": "repair",
837
+ "note": "Which parts come off, and what needs the workshop. A score would say less."
838
+ },
839
+ {
840
+ "key": "spareParts",
841
+ "pointer": "/spareParts",
842
+ "label": "Spare parts",
843
+ "valueType": "text",
844
+ "constraints": {
845
+ "maxLength": 300
846
+ },
847
+ "cardinality": "one",
848
+ "granularity": "model",
849
+ "provenance": {
850
+ "capture": "form",
851
+ "prose": true
852
+ },
853
+ "accessTier": "public",
854
+ "obligation": "recommended",
855
+ "legalBasis": "Nothing requires this. It is what decides whether the object outlives its owner.",
856
+ "applicability": {
857
+ "rule": "always"
858
+ },
859
+ "group": "repair",
860
+ "note": "Which parts, and for how long. A yes/no would hide the part that matters."
861
+ },
862
+ {
863
+ "key": "repairInstructions",
864
+ "pointer": "/repairInstructions",
865
+ "label": "Repair notes",
866
+ "valueType": "document",
867
+ "cardinality": "one",
868
+ "granularity": "model",
869
+ "provenance": {
870
+ "capture": "form"
871
+ },
872
+ "accessTier": "public",
873
+ "obligation": "recommended",
874
+ "legalBasis": "Nothing requires this.",
875
+ "applicability": {
876
+ "rule": "always"
877
+ },
878
+ "group": "repair"
879
+ },
880
+ {
881
+ "key": "repairServices",
882
+ "pointer": "/repairServices",
883
+ "label": "Where to get it repaired",
884
+ "valueType": "url",
885
+ "cardinality": "one",
886
+ "granularity": "model",
887
+ "provenance": {
888
+ "capture": "form"
889
+ },
890
+ "accessTier": "public",
891
+ "obligation": "recommended",
892
+ "legalBasis": "Nothing requires this.",
893
+ "applicability": {
894
+ "rule": "always"
895
+ },
896
+ "group": "repair"
897
+ },
898
+ {
899
+ "key": "serviceNotes",
900
+ "pointer": "/serviceNotes",
901
+ "label": "Workshop notes",
902
+ "valueType": "text",
903
+ "constraints": {
904
+ "maxLength": 600
905
+ },
906
+ "cardinality": "one",
907
+ "granularity": "model",
908
+ "provenance": {
909
+ "capture": "form",
910
+ "prose": true
911
+ },
912
+ "accessTier": "legitimate",
913
+ "obligation": "recommended",
914
+ "legalBasis": "Nothing requires this. Restricted because it is useless to a consumer and valuable to a repairer.",
915
+ "applicability": {
916
+ "rule": "always"
917
+ },
918
+ "group": "repair",
919
+ "note": "Torque figures, thread sizes, the fixture that releases the part. Written for a trade, not a buyer."
920
+ },
921
+ {
922
+ "key": "collection",
923
+ "pointer": "/collection",
924
+ "label": "Where to return it",
925
+ "valueType": "text",
926
+ "constraints": {
927
+ "maxLength": 400
928
+ },
929
+ "cardinality": "one",
930
+ "granularity": "model",
931
+ "provenance": {
932
+ "capture": "form",
933
+ "prose": true
934
+ },
935
+ "accessTier": "public",
936
+ "obligation": "recommended",
937
+ "legalBasis": "Nothing requires this. A maker who takes it back says so here.",
938
+ "applicability": {
939
+ "rule": "always"
940
+ },
941
+ "group": "endOfLife",
942
+ "note": "A place and a method, in the words the person returning it will use."
943
+ },
944
+ {
945
+ "key": "recyclability",
946
+ "pointer": "/recyclability",
947
+ "label": "What can be recovered",
948
+ "valueType": "text",
949
+ "constraints": {
950
+ "maxLength": 400
951
+ },
952
+ "cardinality": "one",
953
+ "granularity": "model",
954
+ "provenance": {
955
+ "capture": "form",
956
+ "prose": true
957
+ },
958
+ "accessTier": "public",
959
+ "obligation": "recommended",
960
+ "legalBasis": "Nothing requires this.",
961
+ "applicability": {
962
+ "rule": "always"
963
+ },
964
+ "group": "endOfLife",
965
+ "note": "What a recycler can actually do with it, which no percentage conveys."
966
+ },
967
+ {
968
+ "key": "separability",
969
+ "pointer": "/separability",
970
+ "label": "What comes apart",
971
+ "valueType": "text",
972
+ "constraints": {
973
+ "maxLength": 300
974
+ },
975
+ "cardinality": "one",
976
+ "granularity": "model",
977
+ "provenance": {
978
+ "capture": "form",
979
+ "prose": true
980
+ },
981
+ "accessTier": "legitimate",
982
+ "obligation": "recommended",
983
+ "legalBasis": "Nothing requires this.",
984
+ "applicability": {
985
+ "rule": "always"
986
+ },
987
+ "group": "endOfLife",
988
+ "note": "Which components separate, and how. The sentence a dismantler needs."
989
+ },
990
+ {
991
+ "key": "supplyChain",
992
+ "pointer": "/supplyChain",
993
+ "label": "Supply chain",
994
+ "valueType": "record",
995
+ "cardinality": "many",
996
+ "granularity": "model",
997
+ "provenance": {
998
+ "capture": "form"
999
+ },
1000
+ "accessTier": "public",
1001
+ "obligation": "optional",
1002
+ "legalBasis": "Nothing requires this. Declared by makers who treat their suppliers as a credential.",
1003
+ "applicability": {
1004
+ "rule": "always"
1005
+ },
1006
+ "group": "supply",
1007
+ "parts": [
1008
+ {
1009
+ "key": "stage",
1010
+ "label": "Stage",
1011
+ "valueType": "text",
1012
+ "required": true
1013
+ },
1014
+ {
1015
+ "key": "country",
1016
+ "label": "Country",
1017
+ "valueType": "country",
1018
+ "constraints": {
1019
+ "pattern": "^[A-Z]{2}$",
1020
+ "patternHint": "a two-letter country code"
1021
+ },
1022
+ "required": true
1023
+ },
1024
+ {
1025
+ "key": "facility",
1026
+ "label": "Workshop or supplier",
1027
+ "valueType": "text"
1028
+ }
1029
+ ]
1030
+ },
1031
+ {
1032
+ "key": "certifications",
1033
+ "pointer": "/certifications",
1034
+ "label": "Independent certification",
1035
+ "valueType": "multi",
1036
+ "codeList": {
1037
+ "closed": false,
1038
+ "options": []
1039
+ },
1040
+ "cardinality": "one",
1041
+ "granularity": "model",
1042
+ "provenance": {
1043
+ "capture": "form"
1044
+ },
1045
+ "accessTier": "public",
1046
+ "obligation": "optional",
1047
+ "legalBasis": "Nothing requires this.",
1048
+ "applicability": {
1049
+ "rule": "always"
1050
+ },
1051
+ "group": "supply",
1052
+ "note": "Open, and with no list at all: the schemes that matter differ completely between a violin and a bicycle, so nothing here could be exhaustive."
1053
+ },
1054
+ {
1055
+ "key": "provenance",
1056
+ "pointer": "/provenance",
1057
+ "label": "Provenance",
1058
+ "valueType": "text",
1059
+ "constraints": {
1060
+ "maxLength": 600
1061
+ },
1062
+ "cardinality": "one",
1063
+ "granularity": "item",
1064
+ "provenance": {
1065
+ "capture": "form",
1066
+ "prose": true
1067
+ },
1068
+ "accessTier": "owner",
1069
+ "obligation": "optional",
1070
+ "legalBasis": "Nothing requires this. It is the owner tier the selective-disclosure demo turns on.",
1071
+ "applicability": {
1072
+ "rule": "always"
1073
+ },
1074
+ "supersedes": "provenance",
1075
+ "group": "owner",
1076
+ "note": "The story of this particular object, which is prose by definition."
1077
+ },
1078
+ {
1079
+ "key": "purchase",
1080
+ "pointer": "/purchase",
1081
+ "label": "Purchased",
1082
+ "valueType": "text",
1083
+ "constraints": {
1084
+ "maxLength": 200
1085
+ },
1086
+ "cardinality": "one",
1087
+ "granularity": "item",
1088
+ "provenance": {
1089
+ "capture": "form",
1090
+ "prose": true
1091
+ },
1092
+ "accessTier": "owner",
1093
+ "obligation": "optional",
1094
+ "legalBasis": "Nothing requires this. It is what makes the record theirs.",
1095
+ "applicability": {
1096
+ "rule": "always"
1097
+ },
1098
+ "group": "owner",
1099
+ "note": "Where and when, as the owner would write it."
1100
+ },
1101
+ {
1102
+ "key": "personalisation",
1103
+ "pointer": "/personalisation",
1104
+ "label": "Fitting and setup",
1105
+ "valueType": "text",
1106
+ "constraints": {
1107
+ "maxLength": 300
1108
+ },
1109
+ "cardinality": "one",
1110
+ "granularity": "item",
1111
+ "provenance": {
1112
+ "capture": "form",
1113
+ "prose": true
1114
+ },
1115
+ "accessTier": "owner",
1116
+ "obligation": "optional",
1117
+ "legalBasis": "Nothing requires this. A fitted object is a different object to its owner.",
1118
+ "applicability": {
1119
+ "rule": "always"
1120
+ },
1121
+ "supersedes": "personalisation",
1122
+ "group": "owner",
1123
+ "note": "Saddle height, string gauge, engraving. Written by whoever set it up."
1124
+ },
1125
+ {
1126
+ "key": "valuation",
1127
+ "pointer": "/valuation",
1128
+ "label": "Valuation reference",
1129
+ "valueType": "text",
1130
+ "constraints": {
1131
+ "maxLength": 160
1132
+ },
1133
+ "cardinality": "one",
1134
+ "granularity": "item",
1135
+ "provenance": {
1136
+ "capture": "form",
1137
+ "prose": true
1138
+ },
1139
+ "accessTier": "owner",
1140
+ "obligation": "optional",
1141
+ "legalBasis": "Nothing requires this. Owner tier only, and no figure ever reaches the public payload.",
1142
+ "applicability": {
1143
+ "rule": "always"
1144
+ },
1145
+ "group": "owner",
1146
+ "note": "An insurer’s reference or an appraisal note. Never a price on the public record."
1147
+ }
1148
+ ],
1149
+ "eventMappings": [
1150
+ {
1151
+ "nativeOperation": "ACTIVATE",
1152
+ "eventType": "Origin",
1153
+ "externalEvent": "manufacture or commissioning",
1154
+ "requires": "manufacturing or commissioning evidence naming the facility, time and responsible party; the native ACTIVATE alone records only that a passport was opened",
1155
+ "withoutEvidence": "insufficient-data"
1156
+ },
1157
+ {
1158
+ "nativeOperation": "SOLD",
1159
+ "eventType": "Transfer",
1160
+ "externalEvent": "physical move or change of custody",
1161
+ "requires": "actual source and destination movement or custody evidence; a change of token control is not a shipment",
1162
+ "withoutEvidence": "insufficient-data"
1163
+ },
1164
+ {
1165
+ "nativeOperation": "RESOLD",
1166
+ "eventType": "Transfer",
1167
+ "externalEvent": "physical move or change of custody",
1168
+ "requires": "actual source and destination movement or custody evidence",
1169
+ "withoutEvidence": "insufficient-data"
1170
+ },
1171
+ {
1172
+ "nativeOperation": "TRANSFER",
1173
+ "eventType": "Transfer",
1174
+ "externalEvent": "change of custody",
1175
+ "requires": "custody evidence beyond the token transfer; the transfer of token control alone establishes neither physical movement nor legal title",
1176
+ "withoutEvidence": "insufficient-data"
1177
+ },
1178
+ {
1179
+ "nativeOperation": "REPAIRED",
1180
+ "eventType": "Transformation",
1181
+ "externalEvent": "modification (repair)",
1182
+ "requires": "repair evidence naming what was done, by whom and when",
1183
+ "withoutEvidence": "insufficient-data"
1184
+ },
1185
+ {
1186
+ "nativeOperation": "EDIT",
1187
+ "eventType": "Transformation",
1188
+ "externalEvent": "metadata revision",
1189
+ "requires": "nothing physical: an EDIT is a native metadata operation and maps to a record revision, not a physical transformation",
1190
+ "withoutEvidence": "transformed"
1191
+ },
1192
+ {
1193
+ "nativeOperation": "RECYCLED",
1194
+ "eventType": "Disposition",
1195
+ "externalEvent": "disposition, or a process creating new products or materials",
1196
+ "requires": "recycling evidence distinguishing disposition of this item from a process whose outputs carry new identities",
1197
+ "withoutEvidence": "insufficient-data"
1198
+ }
1199
+ ],
1200
+ "sourceRefs": [
1201
+ {
1202
+ "id": "none",
1203
+ "name": "Nothing. No instrument requires a passport for these products, and none is cited as if one did; every field states that in its legalRef.",
1204
+ "use": "The honest statement of legal basis."
1205
+ },
1206
+ {
1207
+ "id": "shape",
1208
+ "name": "The shape follows the regulated profiles so a maker who later falls in scope is already close to it.",
1209
+ "use": "Design intent."
1210
+ },
1211
+ {
1212
+ "id": "iso3166",
1213
+ "name": "ISO 3166-1 alpha-2",
1214
+ "reference": "ISO 3166-1",
1215
+ "use": "Every value typed country. Officially assigned codes only; user-assigned and exceptionally-reserved codes are excluded so a passport cannot name a place no register resolves.",
1216
+ "fields": [
1217
+ "manufacturingPlace.country",
1218
+ "materials.origin",
1219
+ "supplyChain.country"
1220
+ ]
1221
+ }
1222
+ ],
1223
+ "groups": [
1224
+ {
1225
+ "id": "identification",
1226
+ "title": "Identification"
1227
+ },
1228
+ {
1229
+ "id": "provenance",
1230
+ "title": "Provenance and authenticity"
1231
+ },
1232
+ {
1233
+ "id": "making",
1234
+ "title": "What it is made of"
1235
+ },
1236
+ {
1237
+ "id": "durability",
1238
+ "title": "Care and guarantee"
1239
+ },
1240
+ {
1241
+ "id": "repair",
1242
+ "title": "Repair and parts"
1243
+ },
1244
+ {
1245
+ "id": "endOfLife",
1246
+ "title": "End of life"
1247
+ },
1248
+ {
1249
+ "id": "supply",
1250
+ "title": "Supply chain"
1251
+ },
1252
+ {
1253
+ "id": "owner",
1254
+ "title": "Private to you"
1255
+ }
1256
+ ],
1257
+ "identity": {
1258
+ "passportIdentifier": "A GS1 Digital Link URI carrying the GTIN under application identifier 01 and the serial under 21 (spec/record-model.md section 3); the enduring identifier never changes across the chain.",
1259
+ "granularities": [
1260
+ "item",
1261
+ "model"
1262
+ ],
1263
+ "modelIdentifier": "name",
1264
+ "parentRelations": []
1265
+ }
1266
+ }