@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,1682 @@
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": "textile",
37
+ "version": 2,
38
+ "profile": "textile@2",
39
+ "status": "current",
40
+ "title": "Textile passport",
41
+ "description": "No delegated act exists for textiles, so no field here is presented as settled by one. Every field names the instrument it comes from in legalRef, and any field whose permitted form waits on the act carries awaitingAct instead of an invented list. Posture: aligned with, never compliant.",
42
+ "regulatoryLine": "Mapped to the ESPR passport requirements (Reg. (EU) 2024/1781 Art. 9 and Annex III) and binding EU textile labelling law (Reg. (EU) 1007/2011), ready to absorb the textile delegated act when adopted.",
43
+ "applicability": {
44
+ "categories": [
45
+ {
46
+ "value": "apparel",
47
+ "label": "Clothing"
48
+ },
49
+ {
50
+ "value": "footwear",
51
+ "label": "Footwear"
52
+ },
53
+ {
54
+ "value": "home",
55
+ "label": "Home textile"
56
+ },
57
+ {
58
+ "value": "accessory",
59
+ "label": "Accessory"
60
+ }
61
+ ],
62
+ "categoryKey": "category",
63
+ "jurisdictions": [
64
+ "EU"
65
+ ],
66
+ "statements": [
67
+ {
68
+ "text": "Regulation (EU) 1007/2011 on textile fibre names and labelling is in force and is the source of the fibre composition and animal-origin declarations.",
69
+ "status": "enacted",
70
+ "source": "eu-1007-2011"
71
+ },
72
+ {
73
+ "text": "The ESPR delegated act for textiles has not been adopted; fields whose permitted form waits on it say so and state no list or pattern.",
74
+ "status": "anticipated",
75
+ "source": "eu-espr"
76
+ },
77
+ {
78
+ "text": "This profile's alignment with the draft data requirements is under review.",
79
+ "status": "needs-review"
80
+ }
81
+ ]
82
+ },
83
+ "schemaUri": "generated/payload-schema/textile@2.public.schema.json",
84
+ "schemaDigest": "521e102aff8dd621d98e5f0b5b6cafe075b3c445db05903d207e6f3d32005905",
85
+ "restrictedSchemaUri": "generated/payload-schema/textile@2.restricted.schema.json",
86
+ "restrictedSchemaDigest": "07ad1f72900cda3ff4e03adbad956402ab3eb60d0df444d7034abc28aa0e4819",
87
+ "contextRefs": [],
88
+ "stamps": [
89
+ {
90
+ "key": "notice",
91
+ "description": "The sample marker a demonstration record carries first; never product data.",
92
+ "valueType": "text"
93
+ },
94
+ {
95
+ "key": "profile",
96
+ "description": "The profile identifier the payload declares.",
97
+ "valueType": "id",
98
+ "const": "textile"
99
+ },
100
+ {
101
+ "key": "profile_version",
102
+ "description": "The profile version the payload declares; a reader decodes under it and never under a newer one.",
103
+ "valueType": "integer",
104
+ "const": 2
105
+ },
106
+ {
107
+ "key": "object_did",
108
+ "description": "An optional physical-object DID carried in the public payload; carrying it does not implement physical binding.",
109
+ "valueType": "id"
110
+ },
111
+ {
112
+ "key": "dataCarrier",
113
+ "description": "The data-carrier identifier (chip UID) the lookup service indexes beside the passport identifier.",
114
+ "valueType": "id"
115
+ }
116
+ ],
117
+ "fields": [
118
+ {
119
+ "key": "name",
120
+ "pointer": "/name",
121
+ "label": "Product name",
122
+ "valueType": "text",
123
+ "cardinality": "one",
124
+ "granularity": "model",
125
+ "provenance": {
126
+ "capture": "form",
127
+ "prose": true,
128
+ "onLabel": true
129
+ },
130
+ "accessTier": "public",
131
+ "obligation": "required",
132
+ "legalBasis": "ESPR Annex III(a); the passport has to say what the product is",
133
+ "applicability": {
134
+ "rule": "always"
135
+ },
136
+ "supersedes": "name",
137
+ "group": "identification",
138
+ "note": "The name the brand sells it under, written by a person for a person."
139
+ },
140
+ {
141
+ "key": "category",
142
+ "pointer": "/category",
143
+ "label": "Kind of product",
144
+ "valueType": "enum",
145
+ "codeList": {
146
+ "closed": false,
147
+ "options": [
148
+ {
149
+ "value": "apparel",
150
+ "label": "Clothing"
151
+ },
152
+ {
153
+ "value": "footwear",
154
+ "label": "Footwear"
155
+ },
156
+ {
157
+ "value": "home",
158
+ "label": "Home textile"
159
+ },
160
+ {
161
+ "value": "accessory",
162
+ "label": "Accessory"
163
+ }
164
+ ]
165
+ },
166
+ "cardinality": "one",
167
+ "granularity": "model",
168
+ "provenance": {
169
+ "capture": "form"
170
+ },
171
+ "accessTier": "public",
172
+ "obligation": "required",
173
+ "legalBasis": "ESPR Art. 4; the parameters that apply depend on what the product is",
174
+ "applicability": {
175
+ "rule": "always"
176
+ },
177
+ "group": "identification",
178
+ "note": "Open: ESPR scope for textiles is set by the delegated act, so a closed list would be our guess wearing the regulation’s clothes."
179
+ },
180
+ {
181
+ "key": "modelIdentifier",
182
+ "pointer": "/modelIdentifier",
183
+ "label": "Model or style reference",
184
+ "valueType": "id",
185
+ "constraints": {
186
+ "maxLength": 64
187
+ },
188
+ "cardinality": "one",
189
+ "granularity": "model",
190
+ "provenance": {
191
+ "capture": "form"
192
+ },
193
+ "accessTier": "public",
194
+ "obligation": "required",
195
+ "legalBasis": "ESPR Annex III(b): the unique product identifier is model-level",
196
+ "applicability": {
197
+ "rule": "always"
198
+ },
199
+ "group": "identification"
200
+ },
201
+ {
202
+ "key": "batch",
203
+ "pointer": "/batch",
204
+ "label": "Batch",
205
+ "valueType": "id",
206
+ "constraints": {
207
+ "maxLength": 64
208
+ },
209
+ "cardinality": "one",
210
+ "granularity": "batch",
211
+ "provenance": {
212
+ "capture": "form"
213
+ },
214
+ "accessTier": "public",
215
+ "obligation": "required",
216
+ "legalBasis": "ESPR Annex III(b); Reg. 1007/2011 traceability of a labelled lot",
217
+ "applicability": {
218
+ "rule": "always"
219
+ },
220
+ "supersedes": "batch",
221
+ "group": "identification"
222
+ },
223
+ {
224
+ "key": "gtin",
225
+ "pointer": "/gtin",
226
+ "label": "Article number (GTIN)",
227
+ "valueType": "id",
228
+ "constraints": {
229
+ "pattern": "^\\d{8}$|^\\d{12,14}$",
230
+ "patternHint": "8, 12, 13 or 14 digits"
231
+ },
232
+ "cardinality": "one",
233
+ "granularity": "model",
234
+ "provenance": {
235
+ "capture": "form"
236
+ },
237
+ "accessTier": "public",
238
+ "obligation": "recommended",
239
+ "legalBasis": "ESPR Annex III(c): commodity and trade item codes where they exist",
240
+ "applicability": {
241
+ "rule": "always"
242
+ },
243
+ "group": "identification"
244
+ },
245
+ {
246
+ "key": "manufacturer",
247
+ "pointer": "/manufacturer",
248
+ "label": "Brand name",
249
+ "valueType": "text",
250
+ "cardinality": "one",
251
+ "granularity": "model",
252
+ "provenance": {
253
+ "capture": "brand",
254
+ "prose": true,
255
+ "onLabel": true
256
+ },
257
+ "accessTier": "public",
258
+ "obligation": "required",
259
+ "legalBasis": "ESPR Annex III(e); Reg. 1007/2011 Art. 15 identifies the responsible operator",
260
+ "applicability": {
261
+ "rule": "always"
262
+ },
263
+ "supersedes": "manufacturer",
264
+ "group": "identification",
265
+ "note": "A company name; nothing to constrain it to but itself."
266
+ },
267
+ {
268
+ "key": "manufacturerContact",
269
+ "pointer": "/manufacturerContact",
270
+ "label": "Brand contact",
271
+ "valueType": "text",
272
+ "cardinality": "one",
273
+ "granularity": "model",
274
+ "provenance": {
275
+ "capture": "brand",
276
+ "prose": true
277
+ },
278
+ "accessTier": "public",
279
+ "obligation": "required",
280
+ "legalBasis": "ESPR Annex III(e): the operator has to be reachable, not merely named",
281
+ "applicability": {
282
+ "rule": "always"
283
+ },
284
+ "supersedes": "manufacturerContact",
285
+ "group": "identification",
286
+ "note": "An email, a postal address or a page. Constraining it to one shape would exclude the others."
287
+ },
288
+ {
289
+ "key": "operatorId",
290
+ "pointer": "/operatorId",
291
+ "label": "EU operator identifier",
292
+ "valueType": "id",
293
+ "cardinality": "one",
294
+ "granularity": "model",
295
+ "provenance": {
296
+ "capture": "deferred"
297
+ },
298
+ "accessTier": "public",
299
+ "obligation": "recommended",
300
+ "legalBasis": "ESPR Annex III(e)",
301
+ "applicability": {
302
+ "rule": "always"
303
+ },
304
+ "awaitingAct": "the ESPR implementing act on unique operator identifiers",
305
+ "group": "identification",
306
+ "note": "Declared and not captured: the identifier scheme does not exist yet, so an empty box would invite a made-up value."
307
+ },
308
+ {
309
+ "key": "manufacturingPlace",
310
+ "pointer": "/manufacturingPlace",
311
+ "label": "Where it was made",
312
+ "valueType": "record",
313
+ "cardinality": "one",
314
+ "granularity": "model",
315
+ "provenance": {
316
+ "capture": "form"
317
+ },
318
+ "accessTier": "public",
319
+ "obligation": "required",
320
+ "legalBasis": "Reg. 1007/2011 Art. 16 read with the Union Customs Code origin rules",
321
+ "applicability": {
322
+ "rule": "always"
323
+ },
324
+ "supersedes": "origin",
325
+ "group": "identification",
326
+ "parts": [
327
+ {
328
+ "key": "city",
329
+ "label": "Town or city",
330
+ "valueType": "text",
331
+ "required": true
332
+ },
333
+ {
334
+ "key": "country",
335
+ "label": "Country",
336
+ "valueType": "country",
337
+ "constraints": {
338
+ "pattern": "^[A-Z]{2}$",
339
+ "patternHint": "a two-letter country code"
340
+ },
341
+ "required": true
342
+ }
343
+ ]
344
+ },
345
+ {
346
+ "key": "made",
347
+ "pointer": "/made",
348
+ "label": "Made",
349
+ "valueType": "monthYear",
350
+ "cardinality": "one",
351
+ "granularity": "batch",
352
+ "provenance": {
353
+ "capture": "form"
354
+ },
355
+ "accessTier": "public",
356
+ "obligation": "recommended",
357
+ "legalBasis": "ESPR Annex I(a): a durability claim is meaningless without a start date",
358
+ "applicability": {
359
+ "rule": "always"
360
+ },
361
+ "group": "identification"
362
+ },
363
+ {
364
+ "key": "colour",
365
+ "pointer": "/colour",
366
+ "label": "Colour",
367
+ "valueType": "text",
368
+ "constraints": {
369
+ "maxLength": 60
370
+ },
371
+ "cardinality": "one",
372
+ "granularity": "model",
373
+ "provenance": {
374
+ "capture": "form",
375
+ "prose": true
376
+ },
377
+ "accessTier": "public",
378
+ "obligation": "recommended",
379
+ "legalBasis": "Nothing requires this. It identifies the item to the person holding it.",
380
+ "applicability": {
381
+ "rule": "always"
382
+ },
383
+ "group": "identification",
384
+ "note": "Brands name colours, and the name is part of the product."
385
+ },
386
+ {
387
+ "key": "size",
388
+ "pointer": "/size",
389
+ "label": "Size",
390
+ "valueType": "text",
391
+ "constraints": {
392
+ "maxLength": 32
393
+ },
394
+ "cardinality": "one",
395
+ "granularity": "item",
396
+ "provenance": {
397
+ "capture": "form",
398
+ "prose": true
399
+ },
400
+ "accessTier": "public",
401
+ "obligation": "recommended",
402
+ "legalBasis": "Nothing requires this. It is what makes a passport match the garment in hand.",
403
+ "applicability": {
404
+ "rule": "always"
405
+ },
406
+ "group": "identification",
407
+ "note": "Size systems differ by market and by brand; a closed list would be wrong somewhere."
408
+ },
409
+ {
410
+ "key": "weight",
411
+ "pointer": "/weight",
412
+ "label": "Weight",
413
+ "valueType": "decimal",
414
+ "unit": "g",
415
+ "constraints": {
416
+ "minimum": 1,
417
+ "maximum": 50000,
418
+ "step": 1
419
+ },
420
+ "cardinality": "one",
421
+ "granularity": "model",
422
+ "provenance": {
423
+ "capture": "form"
424
+ },
425
+ "accessTier": "public",
426
+ "obligation": "recommended",
427
+ "legalBasis": "ESPR Annex I(l): resource use, and the basis of every per-mass figure below",
428
+ "applicability": {
429
+ "rule": "always"
430
+ },
431
+ "group": "identification"
432
+ },
433
+ {
434
+ "key": "fibres",
435
+ "pointer": "/fibres",
436
+ "label": "Fibre composition",
437
+ "valueType": "record",
438
+ "cardinality": "many",
439
+ "granularity": "model",
440
+ "provenance": {
441
+ "capture": "form",
442
+ "onLabel": true
443
+ },
444
+ "accessTier": "public",
445
+ "obligation": "required",
446
+ "legalBasis": "Reg. (EU) 1007/2011 Art. 5, 9 and 14: binding today, by weight, in descending order",
447
+ "applicability": {
448
+ "rule": "always"
449
+ },
450
+ "supersedes": "fibres",
451
+ "group": "composition",
452
+ "parts": [
453
+ {
454
+ "key": "fibre",
455
+ "label": "Fibre",
456
+ "valueType": "enum",
457
+ "codeList": {
458
+ "closed": false,
459
+ "options": [
460
+ {
461
+ "value": "wool",
462
+ "label": "Wool"
463
+ },
464
+ {
465
+ "value": "cotton",
466
+ "label": "Cotton"
467
+ },
468
+ {
469
+ "value": "linen",
470
+ "label": "Linen (flax)"
471
+ },
472
+ {
473
+ "value": "silk",
474
+ "label": "Silk"
475
+ },
476
+ {
477
+ "value": "hemp",
478
+ "label": "Hemp"
479
+ },
480
+ {
481
+ "value": "cashmere",
482
+ "label": "Cashmere"
483
+ },
484
+ {
485
+ "value": "mohair",
486
+ "label": "Mohair"
487
+ },
488
+ {
489
+ "value": "alpaca",
490
+ "label": "Alpaca"
491
+ },
492
+ {
493
+ "value": "viscose",
494
+ "label": "Viscose"
495
+ },
496
+ {
497
+ "value": "lyocell",
498
+ "label": "Lyocell"
499
+ },
500
+ {
501
+ "value": "modal",
502
+ "label": "Modal"
503
+ },
504
+ {
505
+ "value": "cupro",
506
+ "label": "Cupro"
507
+ },
508
+ {
509
+ "value": "acetate",
510
+ "label": "Acetate"
511
+ },
512
+ {
513
+ "value": "polyester",
514
+ "label": "Polyester"
515
+ },
516
+ {
517
+ "value": "polyamide",
518
+ "label": "Polyamide (nylon)"
519
+ },
520
+ {
521
+ "value": "elastane",
522
+ "label": "Elastane"
523
+ },
524
+ {
525
+ "value": "acrylic",
526
+ "label": "Acrylic"
527
+ },
528
+ {
529
+ "value": "polypropylene",
530
+ "label": "Polypropylene"
531
+ }
532
+ ]
533
+ },
534
+ "required": true
535
+ },
536
+ {
537
+ "key": "percent",
538
+ "label": "Share by weight",
539
+ "valueType": "percent",
540
+ "unit": "%",
541
+ "constraints": {
542
+ "minimum": 0,
543
+ "maximum": 100
544
+ },
545
+ "required": true
546
+ },
547
+ {
548
+ "key": "source",
549
+ "label": "Source",
550
+ "valueType": "enum",
551
+ "codeList": {
552
+ "closed": true,
553
+ "options": [
554
+ {
555
+ "value": "preConsumer",
556
+ "label": "Pre-consumer recycled"
557
+ },
558
+ {
559
+ "value": "postConsumer",
560
+ "label": "Post-consumer recycled"
561
+ },
562
+ {
563
+ "value": "virgin",
564
+ "label": "Virgin"
565
+ }
566
+ ]
567
+ }
568
+ }
569
+ ]
570
+ },
571
+ {
572
+ "key": "nonTextileParts",
573
+ "pointer": "/nonTextileParts",
574
+ "label": "Non-textile parts of animal origin",
575
+ "valueType": "text",
576
+ "constraints": {
577
+ "maxLength": 200
578
+ },
579
+ "cardinality": "one",
580
+ "granularity": "model",
581
+ "provenance": {
582
+ "capture": "form",
583
+ "prose": true,
584
+ "onLabel": true
585
+ },
586
+ "accessTier": "public",
587
+ "obligation": "required",
588
+ "legalBasis": "Reg. (EU) 1007/2011 Art. 12: mandatory where such parts are present",
589
+ "applicability": {
590
+ "rule": "needs-review",
591
+ "condition": "the product contains non-textile parts of animal origin"
592
+ },
593
+ "group": "composition",
594
+ "note": "The regulation asks for a phrase, not a code: \"contains non-textile parts of animal origin\"."
595
+ },
596
+ {
597
+ "key": "recycledContent",
598
+ "pointer": "/recycledContent",
599
+ "label": "Recycled content",
600
+ "valueType": "percent",
601
+ "unit": "%",
602
+ "constraints": {
603
+ "minimum": 0,
604
+ "maximum": 100
605
+ },
606
+ "cardinality": "one",
607
+ "granularity": "model",
608
+ "provenance": {
609
+ "capture": "form"
610
+ },
611
+ "accessTier": "public",
612
+ "obligation": "recommended",
613
+ "legalBasis": "ESPR Annex I(g): recycled content is a named parameter; the threshold waits on the act",
614
+ "applicability": {
615
+ "rule": "always"
616
+ },
617
+ "supersedes": "recycled",
618
+ "group": "composition"
619
+ },
620
+ {
621
+ "key": "biobasedContent",
622
+ "pointer": "/biobasedContent",
623
+ "label": "Bio-based content",
624
+ "valueType": "percent",
625
+ "unit": "%",
626
+ "constraints": {
627
+ "minimum": 0,
628
+ "maximum": 100
629
+ },
630
+ "cardinality": "one",
631
+ "granularity": "model",
632
+ "provenance": {
633
+ "capture": "form"
634
+ },
635
+ "accessTier": "public",
636
+ "obligation": "optional",
637
+ "legalBasis": "Nothing requires this. Declared where a brand can substantiate it.",
638
+ "applicability": {
639
+ "rule": "always"
640
+ },
641
+ "group": "composition"
642
+ },
643
+ {
644
+ "key": "trims",
645
+ "pointer": "/trims",
646
+ "label": "Trims and hardware",
647
+ "valueType": "record",
648
+ "cardinality": "many",
649
+ "granularity": "model",
650
+ "provenance": {
651
+ "capture": "form"
652
+ },
653
+ "accessTier": "public",
654
+ "obligation": "recommended",
655
+ "legalBasis": "ESPR Annex I(d) and (n): what separates for repair, and what separates for recycling",
656
+ "applicability": {
657
+ "rule": "always"
658
+ },
659
+ "group": "composition",
660
+ "parts": [
661
+ {
662
+ "key": "part",
663
+ "label": "Part",
664
+ "valueType": "text",
665
+ "required": true
666
+ },
667
+ {
668
+ "key": "material",
669
+ "label": "Material",
670
+ "valueType": "text",
671
+ "required": true
672
+ },
673
+ {
674
+ "key": "origin",
675
+ "label": "Country",
676
+ "valueType": "country",
677
+ "constraints": {
678
+ "pattern": "^[A-Z]{2}$",
679
+ "patternHint": "a two-letter country code"
680
+ }
681
+ }
682
+ ]
683
+ },
684
+ {
685
+ "key": "substancesOfConcern",
686
+ "pointer": "/substancesOfConcern",
687
+ "label": "Substances of concern",
688
+ "valueType": "record",
689
+ "cardinality": "many",
690
+ "granularity": "model",
691
+ "provenance": {
692
+ "capture": "form"
693
+ },
694
+ "accessTier": "public",
695
+ "obligation": "required",
696
+ "legalBasis": "ESPR Art. 7(5): substances of concern must be traceable through the passport",
697
+ "applicability": {
698
+ "rule": "needs-review",
699
+ "condition": "a substance of concern is present above the threshold the act will set"
700
+ },
701
+ "supersedes": "substances",
702
+ "group": "substances",
703
+ "parts": [
704
+ {
705
+ "key": "substance",
706
+ "label": "Substance",
707
+ "valueType": "text",
708
+ "required": true
709
+ },
710
+ {
711
+ "key": "casNumber",
712
+ "label": "CAS number",
713
+ "valueType": "text",
714
+ "constraints": {
715
+ "pattern": "^\\d{2,7}-\\d{2}-\\d$",
716
+ "patternHint": "a CAS registry number, e.g. 7440-48-4"
717
+ }
718
+ },
719
+ {
720
+ "key": "concentration",
721
+ "label": "Concentration",
722
+ "valueType": "percent",
723
+ "unit": "%",
724
+ "constraints": {
725
+ "minimum": 0,
726
+ "maximum": 100
727
+ }
728
+ },
729
+ {
730
+ "key": "location",
731
+ "label": "Where in the product",
732
+ "valueType": "text"
733
+ }
734
+ ]
735
+ },
736
+ {
737
+ "key": "substanceStatement",
738
+ "pointer": "/substanceStatement",
739
+ "label": "What that means for you",
740
+ "valueType": "text",
741
+ "constraints": {
742
+ "maxLength": 400
743
+ },
744
+ "cardinality": "one",
745
+ "granularity": "model",
746
+ "provenance": {
747
+ "capture": "form",
748
+ "prose": true
749
+ },
750
+ "accessTier": "public",
751
+ "obligation": "recommended",
752
+ "legalBasis": "ESPR Art. 9(2)(b): passport information shall be complete and comprehensible",
753
+ "applicability": {
754
+ "rule": "always"
755
+ },
756
+ "group": "substances",
757
+ "note": "A list of CAS numbers tells a consumer nothing. This is the sentence that does."
758
+ },
759
+ {
760
+ "key": "chemicalCompliance",
761
+ "pointer": "/chemicalCompliance",
762
+ "label": "Chemical compliance evidence",
763
+ "valueType": "document",
764
+ "cardinality": "one",
765
+ "granularity": "model",
766
+ "provenance": {
767
+ "capture": "form"
768
+ },
769
+ "accessTier": "legitimate",
770
+ "obligation": "recommended",
771
+ "legalBasis": "REACH Art. 33 read with ESPR Annex III(d): compliance documentation",
772
+ "applicability": {
773
+ "rule": "always"
774
+ },
775
+ "group": "substances"
776
+ },
777
+ {
778
+ "key": "microplasticRelease",
779
+ "pointer": "/microplasticRelease",
780
+ "label": "Microplastic release",
781
+ "valueType": "text",
782
+ "cardinality": "one",
783
+ "granularity": "model",
784
+ "provenance": {
785
+ "capture": "form",
786
+ "prose": true
787
+ },
788
+ "accessTier": "public",
789
+ "obligation": "optional",
790
+ "legalBasis": "ESPR Annex I(k); the method is not yet fixed",
791
+ "applicability": {
792
+ "rule": "always"
793
+ },
794
+ "awaitingAct": "the harmonised test method for microfibre release",
795
+ "group": "substances",
796
+ "note": "No measurement method is harmonised, so a number here would be incomparable with anyone else’s."
797
+ },
798
+ {
799
+ "key": "care",
800
+ "pointer": "/care",
801
+ "label": "Care",
802
+ "valueType": "multi",
803
+ "codeList": {
804
+ "closed": true,
805
+ "options": [
806
+ {
807
+ "value": "wash30",
808
+ "label": "Machine wash at 30 °C"
809
+ },
810
+ {
811
+ "value": "wash40",
812
+ "label": "Machine wash at 40 °C"
813
+ },
814
+ {
815
+ "value": "wash60",
816
+ "label": "Machine wash at 60 °C"
817
+ },
818
+ {
819
+ "value": "handWash",
820
+ "label": "Hand wash only"
821
+ },
822
+ {
823
+ "value": "noWash",
824
+ "label": "Do not wash"
825
+ },
826
+ {
827
+ "value": "noBleach",
828
+ "label": "Do not bleach"
829
+ },
830
+ {
831
+ "value": "tumbleLow",
832
+ "label": "Tumble dry low"
833
+ },
834
+ {
835
+ "value": "noTumble",
836
+ "label": "Do not tumble dry"
837
+ },
838
+ {
839
+ "value": "ironLow",
840
+ "label": "Iron low"
841
+ },
842
+ {
843
+ "value": "ironMedium",
844
+ "label": "Iron medium"
845
+ },
846
+ {
847
+ "value": "noIron",
848
+ "label": "Do not iron"
849
+ },
850
+ {
851
+ "value": "dryClean",
852
+ "label": "Professional dry clean"
853
+ },
854
+ {
855
+ "value": "noDryClean",
856
+ "label": "Do not dry clean"
857
+ }
858
+ ]
859
+ },
860
+ "cardinality": "one",
861
+ "granularity": "model",
862
+ "provenance": {
863
+ "capture": "form",
864
+ "onLabel": true
865
+ },
866
+ "accessTier": "public",
867
+ "obligation": "required",
868
+ "legalBasis": "ISO 3758 care symbols; Dir. (EU) 2024/825 Art. 2 on durability information",
869
+ "applicability": {
870
+ "rule": "always"
871
+ },
872
+ "supersedes": "care",
873
+ "group": "durability"
874
+ },
875
+ {
876
+ "key": "careNote",
877
+ "pointer": "/careNote",
878
+ "label": "How to make it last",
879
+ "valueType": "text",
880
+ "constraints": {
881
+ "maxLength": 400
882
+ },
883
+ "cardinality": "one",
884
+ "granularity": "model",
885
+ "provenance": {
886
+ "capture": "form",
887
+ "prose": true
888
+ },
889
+ "accessTier": "public",
890
+ "obligation": "recommended",
891
+ "legalBasis": "ESPR Annex I(a): extending lifetime is the parameter; this is how",
892
+ "applicability": {
893
+ "rule": "always"
894
+ },
895
+ "group": "durability",
896
+ "note": "The advice a maker would give in person, which no symbol carries."
897
+ },
898
+ {
899
+ "key": "expectedLifetime",
900
+ "pointer": "/expectedLifetime",
901
+ "label": "Expected lifetime",
902
+ "valueType": "integer",
903
+ "unit": "years",
904
+ "constraints": {
905
+ "minimum": 1,
906
+ "maximum": 100,
907
+ "step": 1
908
+ },
909
+ "cardinality": "one",
910
+ "granularity": "model",
911
+ "provenance": {
912
+ "capture": "form"
913
+ },
914
+ "accessTier": "public",
915
+ "obligation": "recommended",
916
+ "legalBasis": "ESPR Annex I(a) and Dir. (EU) 2024/825: a durability claim must be substantiated",
917
+ "applicability": {
918
+ "rule": "always"
919
+ },
920
+ "group": "durability"
921
+ },
922
+ {
923
+ "key": "washCycles",
924
+ "pointer": "/washCycles",
925
+ "label": "Tested to",
926
+ "valueType": "integer",
927
+ "unit": "wash cycles",
928
+ "constraints": {
929
+ "minimum": 1,
930
+ "maximum": 1000,
931
+ "step": 1
932
+ },
933
+ "cardinality": "one",
934
+ "granularity": "model",
935
+ "provenance": {
936
+ "capture": "form"
937
+ },
938
+ "accessTier": "public",
939
+ "obligation": "recommended",
940
+ "legalBasis": "ESPR Annex I(b) reliability, tested per ISO 6330 domestic washing procedures",
941
+ "applicability": {
942
+ "rule": "always"
943
+ },
944
+ "group": "durability"
945
+ },
946
+ {
947
+ "key": "colourFastness",
948
+ "pointer": "/colourFastness",
949
+ "label": "Colour fastness",
950
+ "valueType": "decimal",
951
+ "unit": "grade",
952
+ "constraints": {
953
+ "minimum": 1,
954
+ "maximum": 5,
955
+ "step": 0.5
956
+ },
957
+ "cardinality": "one",
958
+ "granularity": "model",
959
+ "provenance": {
960
+ "capture": "form"
961
+ },
962
+ "accessTier": "public",
963
+ "obligation": "recommended",
964
+ "legalBasis": "ESPR Annex I(b), graded 1-5 per the ISO 105 series",
965
+ "applicability": {
966
+ "rule": "always"
967
+ },
968
+ "group": "durability"
969
+ },
970
+ {
971
+ "key": "dimensionalStability",
972
+ "pointer": "/dimensionalStability",
973
+ "label": "Dimensional change after washing",
974
+ "valueType": "decimal",
975
+ "unit": "%",
976
+ "constraints": {
977
+ "minimum": -20,
978
+ "maximum": 20,
979
+ "step": 0.5
980
+ },
981
+ "cardinality": "one",
982
+ "granularity": "model",
983
+ "provenance": {
984
+ "capture": "form"
985
+ },
986
+ "accessTier": "public",
987
+ "obligation": "recommended",
988
+ "legalBasis": "ESPR Annex I(b), measured per ISO 5077",
989
+ "applicability": {
990
+ "rule": "always"
991
+ },
992
+ "group": "durability"
993
+ },
994
+ {
995
+ "key": "pillingResistance",
996
+ "pointer": "/pillingResistance",
997
+ "label": "Pilling resistance",
998
+ "valueType": "decimal",
999
+ "unit": "grade",
1000
+ "constraints": {
1001
+ "minimum": 1,
1002
+ "maximum": 5,
1003
+ "step": 0.5
1004
+ },
1005
+ "cardinality": "one",
1006
+ "granularity": "model",
1007
+ "provenance": {
1008
+ "capture": "form"
1009
+ },
1010
+ "accessTier": "public",
1011
+ "obligation": "recommended",
1012
+ "legalBasis": "ESPR Annex I(b), graded 1-5 per ISO 12945",
1013
+ "applicability": {
1014
+ "rule": "always"
1015
+ },
1016
+ "group": "durability"
1017
+ },
1018
+ {
1019
+ "key": "guarantee",
1020
+ "pointer": "/guarantee",
1021
+ "label": "Guarantee",
1022
+ "valueType": "integer",
1023
+ "unit": "months",
1024
+ "constraints": {
1025
+ "minimum": 0,
1026
+ "maximum": 600,
1027
+ "step": 1
1028
+ },
1029
+ "cardinality": "one",
1030
+ "granularity": "model",
1031
+ "provenance": {
1032
+ "capture": "form"
1033
+ },
1034
+ "accessTier": "public",
1035
+ "obligation": "recommended",
1036
+ "legalBasis": "Dir. (EU) 2024/825: a commercial guarantee of durability must state its term",
1037
+ "applicability": {
1038
+ "rule": "always"
1039
+ },
1040
+ "supersedes": "warranty",
1041
+ "group": "durability"
1042
+ },
1043
+ {
1044
+ "key": "repairability",
1045
+ "pointer": "/repairability",
1046
+ "label": "Repairability",
1047
+ "valueType": "text",
1048
+ "constraints": {
1049
+ "maxLength": 300
1050
+ },
1051
+ "cardinality": "one",
1052
+ "granularity": "model",
1053
+ "provenance": {
1054
+ "capture": "form",
1055
+ "prose": true
1056
+ },
1057
+ "accessTier": "public",
1058
+ "obligation": "recommended",
1059
+ "legalBasis": "ESPR Annex I(c) and Art. 7(2)(b)(iii)",
1060
+ "applicability": {
1061
+ "rule": "always"
1062
+ },
1063
+ "awaitingAct": "the ESPR delegated act on repairability scoring for textiles",
1064
+ "group": "repair",
1065
+ "note": "The scoring class is not fixed, so a letter or a number here would be invented."
1066
+ },
1067
+ {
1068
+ "key": "spareParts",
1069
+ "pointer": "/spareParts",
1070
+ "label": "Spare parts",
1071
+ "valueType": "text",
1072
+ "constraints": {
1073
+ "maxLength": 300
1074
+ },
1075
+ "cardinality": "one",
1076
+ "granularity": "model",
1077
+ "provenance": {
1078
+ "capture": "form",
1079
+ "prose": true
1080
+ },
1081
+ "accessTier": "public",
1082
+ "obligation": "recommended",
1083
+ "legalBasis": "ESPR Annex I(d): availability of spare parts is a named parameter",
1084
+ "applicability": {
1085
+ "rule": "always"
1086
+ },
1087
+ "group": "repair",
1088
+ "note": "Which parts, and for how long. A yes/no would hide the part that matters."
1089
+ },
1090
+ {
1091
+ "key": "repairInstructions",
1092
+ "pointer": "/repairInstructions",
1093
+ "label": "Repair instructions",
1094
+ "valueType": "document",
1095
+ "cardinality": "one",
1096
+ "granularity": "model",
1097
+ "provenance": {
1098
+ "capture": "form"
1099
+ },
1100
+ "accessTier": "public",
1101
+ "obligation": "recommended",
1102
+ "legalBasis": "ESPR Annex I(e): access to repair information",
1103
+ "applicability": {
1104
+ "rule": "always"
1105
+ },
1106
+ "group": "repair"
1107
+ },
1108
+ {
1109
+ "key": "repairServices",
1110
+ "pointer": "/repairServices",
1111
+ "label": "Where to get it repaired",
1112
+ "valueType": "url",
1113
+ "cardinality": "one",
1114
+ "granularity": "model",
1115
+ "provenance": {
1116
+ "capture": "form"
1117
+ },
1118
+ "accessTier": "public",
1119
+ "obligation": "recommended",
1120
+ "legalBasis": "Dir. (EU) 2024/825 recital 22: repair should be the visible option",
1121
+ "applicability": {
1122
+ "rule": "always"
1123
+ },
1124
+ "group": "repair"
1125
+ },
1126
+ {
1127
+ "key": "carbonFootprint",
1128
+ "pointer": "/carbonFootprint",
1129
+ "label": "Carbon footprint",
1130
+ "valueType": "decimal",
1131
+ "unit": "kg CO₂e",
1132
+ "constraints": {
1133
+ "minimum": 0,
1134
+ "maximum": 10000,
1135
+ "step": 0.01
1136
+ },
1137
+ "cardinality": "one",
1138
+ "granularity": "model",
1139
+ "provenance": {
1140
+ "capture": "form"
1141
+ },
1142
+ "accessTier": "public",
1143
+ "obligation": "recommended",
1144
+ "legalBasis": "ESPR Annex I(m), computed per the Apparel and Footwear PEFCR",
1145
+ "applicability": {
1146
+ "rule": "always"
1147
+ },
1148
+ "group": "footprint"
1149
+ },
1150
+ {
1151
+ "key": "carbonFootprintStudy",
1152
+ "pointer": "/carbonFootprintStudy",
1153
+ "label": "The study behind the figure",
1154
+ "valueType": "document",
1155
+ "cardinality": "one",
1156
+ "granularity": "model",
1157
+ "provenance": {
1158
+ "capture": "form"
1159
+ },
1160
+ "accessTier": "public",
1161
+ "obligation": "recommended",
1162
+ "legalBasis": "ESPR Art. 9(2)(b): a figure a reader cannot check is not information",
1163
+ "applicability": {
1164
+ "rule": "always"
1165
+ },
1166
+ "group": "footprint"
1167
+ },
1168
+ {
1169
+ "key": "footprintClass",
1170
+ "pointer": "/footprintClass",
1171
+ "label": "Environmental footprint class",
1172
+ "valueType": "text",
1173
+ "constraints": {
1174
+ "maxLength": 80
1175
+ },
1176
+ "cardinality": "one",
1177
+ "granularity": "model",
1178
+ "provenance": {
1179
+ "capture": "deferred",
1180
+ "prose": true
1181
+ },
1182
+ "accessTier": "public",
1183
+ "obligation": "recommended",
1184
+ "legalBasis": "ESPR Art. 7(4)",
1185
+ "applicability": {
1186
+ "rule": "always"
1187
+ },
1188
+ "awaitingAct": "the ESPR delegated act setting performance classes for textiles",
1189
+ "group": "footprint",
1190
+ "note": "The class format is not set. Naming one would publish our guess as a grade."
1191
+ },
1192
+ {
1193
+ "key": "waterUse",
1194
+ "pointer": "/waterUse",
1195
+ "label": "Water use",
1196
+ "valueType": "decimal",
1197
+ "unit": "m³",
1198
+ "constraints": {
1199
+ "minimum": 0,
1200
+ "maximum": 100000,
1201
+ "step": 0.1
1202
+ },
1203
+ "cardinality": "one",
1204
+ "granularity": "model",
1205
+ "provenance": {
1206
+ "capture": "form"
1207
+ },
1208
+ "accessTier": "public",
1209
+ "obligation": "optional",
1210
+ "legalBasis": "ESPR Annex I(l): resource use. Declared where a brand has measured it.",
1211
+ "applicability": {
1212
+ "rule": "always"
1213
+ },
1214
+ "group": "footprint"
1215
+ },
1216
+ {
1217
+ "key": "collection",
1218
+ "pointer": "/collection",
1219
+ "label": "Where to return it",
1220
+ "valueType": "text",
1221
+ "constraints": {
1222
+ "maxLength": 400
1223
+ },
1224
+ "cardinality": "one",
1225
+ "granularity": "model",
1226
+ "provenance": {
1227
+ "capture": "form",
1228
+ "prose": true
1229
+ },
1230
+ "accessTier": "public",
1231
+ "obligation": "required",
1232
+ "legalBasis": "Waste Framework Directive: separate collection of textiles since 1 January 2025",
1233
+ "applicability": {
1234
+ "rule": "always"
1235
+ },
1236
+ "supersedes": "endOfLife",
1237
+ "group": "endOfLife",
1238
+ "note": "A place and a method, in the words the person returning it will use."
1239
+ },
1240
+ {
1241
+ "key": "recyclability",
1242
+ "pointer": "/recyclability",
1243
+ "label": "How it can be recycled",
1244
+ "valueType": "text",
1245
+ "constraints": {
1246
+ "maxLength": 400
1247
+ },
1248
+ "cardinality": "one",
1249
+ "granularity": "model",
1250
+ "provenance": {
1251
+ "capture": "form",
1252
+ "prose": true
1253
+ },
1254
+ "accessTier": "public",
1255
+ "obligation": "recommended",
1256
+ "legalBasis": "ESPR Annex I(n): expected generation of waste materials",
1257
+ "applicability": {
1258
+ "rule": "always"
1259
+ },
1260
+ "group": "endOfLife",
1261
+ "note": "What a recycler can actually do with it, which no percentage conveys."
1262
+ },
1263
+ {
1264
+ "key": "separability",
1265
+ "pointer": "/separability",
1266
+ "label": "What comes apart",
1267
+ "valueType": "text",
1268
+ "constraints": {
1269
+ "maxLength": 300
1270
+ },
1271
+ "cardinality": "one",
1272
+ "granularity": "model",
1273
+ "provenance": {
1274
+ "capture": "form",
1275
+ "prose": true
1276
+ },
1277
+ "accessTier": "legitimate",
1278
+ "obligation": "recommended",
1279
+ "legalBasis": "ESPR Annex I(h) and (i): ease of disassembly, for reuse and recycling",
1280
+ "applicability": {
1281
+ "rule": "always"
1282
+ },
1283
+ "group": "endOfLife",
1284
+ "note": "Which components separate, and how. The sentence a dismantler needs."
1285
+ },
1286
+ {
1287
+ "key": "eprRegistration",
1288
+ "pointer": "/eprRegistration",
1289
+ "label": "Producer responsibility registration",
1290
+ "valueType": "id",
1291
+ "constraints": {
1292
+ "maxLength": 64
1293
+ },
1294
+ "cardinality": "one",
1295
+ "granularity": "model",
1296
+ "provenance": {
1297
+ "capture": "brand"
1298
+ },
1299
+ "accessTier": "authority",
1300
+ "obligation": "recommended",
1301
+ "legalBasis": "Waste Framework Directive textile EPR: the producer register number",
1302
+ "applicability": {
1303
+ "rule": "always"
1304
+ },
1305
+ "group": "endOfLife"
1306
+ },
1307
+ {
1308
+ "key": "supplyChain",
1309
+ "pointer": "/supplyChain",
1310
+ "label": "Supply chain",
1311
+ "valueType": "record",
1312
+ "cardinality": "many",
1313
+ "granularity": "model",
1314
+ "provenance": {
1315
+ "capture": "form"
1316
+ },
1317
+ "accessTier": "public",
1318
+ "obligation": "recommended",
1319
+ "legalBasis": "ESPR Annex III(f): unique facility identifiers, at the stages that have them",
1320
+ "applicability": {
1321
+ "rule": "always"
1322
+ },
1323
+ "group": "supply",
1324
+ "parts": [
1325
+ {
1326
+ "key": "stage",
1327
+ "label": "Stage",
1328
+ "valueType": "enum",
1329
+ "codeList": {
1330
+ "closed": true,
1331
+ "options": [
1332
+ {
1333
+ "value": "fibre",
1334
+ "label": "Fibre production"
1335
+ },
1336
+ {
1337
+ "value": "spinning",
1338
+ "label": "Spinning"
1339
+ },
1340
+ {
1341
+ "value": "weaving",
1342
+ "label": "Weaving or knitting"
1343
+ },
1344
+ {
1345
+ "value": "dyeing",
1346
+ "label": "Dyeing and finishing"
1347
+ },
1348
+ {
1349
+ "value": "assembly",
1350
+ "label": "Cutting and assembly"
1351
+ }
1352
+ ]
1353
+ },
1354
+ "required": true
1355
+ },
1356
+ {
1357
+ "key": "country",
1358
+ "label": "Country",
1359
+ "valueType": "country",
1360
+ "constraints": {
1361
+ "pattern": "^[A-Z]{2}$",
1362
+ "patternHint": "a two-letter country code"
1363
+ },
1364
+ "required": true
1365
+ },
1366
+ {
1367
+ "key": "facility",
1368
+ "label": "Facility",
1369
+ "valueType": "text"
1370
+ }
1371
+ ]
1372
+ },
1373
+ {
1374
+ "key": "certifications",
1375
+ "pointer": "/certifications",
1376
+ "label": "Independent certification",
1377
+ "valueType": "multi",
1378
+ "codeList": {
1379
+ "closed": false,
1380
+ "options": [
1381
+ {
1382
+ "value": "gots",
1383
+ "label": "GOTS"
1384
+ },
1385
+ {
1386
+ "value": "oekoTex100",
1387
+ "label": "OEKO-TEX Standard 100"
1388
+ },
1389
+ {
1390
+ "value": "grs",
1391
+ "label": "Global Recycled Standard"
1392
+ },
1393
+ {
1394
+ "value": "rws",
1395
+ "label": "Responsible Wool Standard"
1396
+ },
1397
+ {
1398
+ "value": "euEcolabel",
1399
+ "label": "EU Ecolabel"
1400
+ },
1401
+ {
1402
+ "value": "cradleToCradle",
1403
+ "label": "Cradle to Cradle"
1404
+ },
1405
+ {
1406
+ "value": "bluesign",
1407
+ "label": "bluesign"
1408
+ }
1409
+ ]
1410
+ },
1411
+ "cardinality": "one",
1412
+ "granularity": "model",
1413
+ "provenance": {
1414
+ "capture": "form"
1415
+ },
1416
+ "accessTier": "public",
1417
+ "obligation": "recommended",
1418
+ "legalBasis": "Dir. (EU) 2024/825 Art. 2: a sustainability label needs a certification behind it",
1419
+ "applicability": {
1420
+ "rule": "always"
1421
+ },
1422
+ "group": "supply",
1423
+ "note": "Open: a closed list of schemes would read as an endorsement of exactly those."
1424
+ },
1425
+ {
1426
+ "key": "dueDiligence",
1427
+ "pointer": "/dueDiligence",
1428
+ "label": "Due diligence report",
1429
+ "valueType": "document",
1430
+ "cardinality": "one",
1431
+ "granularity": "model",
1432
+ "provenance": {
1433
+ "capture": "form"
1434
+ },
1435
+ "accessTier": "legitimate",
1436
+ "obligation": "recommended",
1437
+ "legalBasis": "Dir. (EU) 2024/1760 corporate sustainability due diligence, where in scope",
1438
+ "applicability": {
1439
+ "rule": "always"
1440
+ },
1441
+ "group": "supply"
1442
+ },
1443
+ {
1444
+ "key": "provenance",
1445
+ "pointer": "/provenance",
1446
+ "label": "Provenance",
1447
+ "valueType": "text",
1448
+ "constraints": {
1449
+ "maxLength": 600
1450
+ },
1451
+ "cardinality": "one",
1452
+ "granularity": "item",
1453
+ "provenance": {
1454
+ "capture": "form",
1455
+ "prose": true
1456
+ },
1457
+ "accessTier": "owner",
1458
+ "obligation": "optional",
1459
+ "legalBasis": "Nothing requires this. It is the owner tier the selective-disclosure demo turns on.",
1460
+ "applicability": {
1461
+ "rule": "always"
1462
+ },
1463
+ "supersedes": "provenance",
1464
+ "group": "owner",
1465
+ "note": "The story of this particular item, which is prose by definition."
1466
+ },
1467
+ {
1468
+ "key": "purchase",
1469
+ "pointer": "/purchase",
1470
+ "label": "Purchased",
1471
+ "valueType": "text",
1472
+ "constraints": {
1473
+ "maxLength": 200
1474
+ },
1475
+ "cardinality": "one",
1476
+ "granularity": "item",
1477
+ "provenance": {
1478
+ "capture": "event",
1479
+ "dynamic": true,
1480
+ "prose": true
1481
+ },
1482
+ "accessTier": "owner",
1483
+ "obligation": "optional",
1484
+ "legalBasis": "Nothing requires this. It is what makes the record theirs.",
1485
+ "applicability": {
1486
+ "rule": "always"
1487
+ },
1488
+ "group": "owner",
1489
+ "note": "Where and when, as the owner would write it."
1490
+ },
1491
+ {
1492
+ "key": "personalisation",
1493
+ "pointer": "/personalisation",
1494
+ "label": "Alterations and fit",
1495
+ "valueType": "text",
1496
+ "constraints": {
1497
+ "maxLength": 300
1498
+ },
1499
+ "cardinality": "one",
1500
+ "granularity": "item",
1501
+ "provenance": {
1502
+ "capture": "event",
1503
+ "dynamic": true,
1504
+ "prose": true
1505
+ },
1506
+ "accessTier": "owner",
1507
+ "obligation": "optional",
1508
+ "legalBasis": "Nothing requires this. An altered garment is a different garment to its owner.",
1509
+ "applicability": {
1510
+ "rule": "always"
1511
+ },
1512
+ "supersedes": "personalisation",
1513
+ "group": "owner",
1514
+ "note": "Sleeve lengths and hems, in the tailor’s words."
1515
+ },
1516
+ {
1517
+ "key": "warrantyRegistration",
1518
+ "pointer": "/warrantyRegistration",
1519
+ "label": "Guarantee registration",
1520
+ "valueType": "id",
1521
+ "constraints": {
1522
+ "maxLength": 64
1523
+ },
1524
+ "cardinality": "one",
1525
+ "granularity": "item",
1526
+ "provenance": {
1527
+ "capture": "form"
1528
+ },
1529
+ "accessTier": "owner",
1530
+ "obligation": "optional",
1531
+ "legalBasis": "Nothing requires this. It saves the owner keeping a receipt.",
1532
+ "applicability": {
1533
+ "rule": "always"
1534
+ },
1535
+ "group": "owner"
1536
+ }
1537
+ ],
1538
+ "eventMappings": [
1539
+ {
1540
+ "nativeOperation": "ACTIVATE",
1541
+ "eventType": "Origin",
1542
+ "externalEvent": "manufacture or commissioning",
1543
+ "requires": "manufacturing or commissioning evidence naming the facility, time and responsible party; the native ACTIVATE alone records only that a passport was opened",
1544
+ "withoutEvidence": "insufficient-data"
1545
+ },
1546
+ {
1547
+ "nativeOperation": "SOLD",
1548
+ "eventType": "Transfer",
1549
+ "externalEvent": "physical move or change of custody",
1550
+ "requires": "actual source and destination movement or custody evidence; a change of token control is not a shipment",
1551
+ "withoutEvidence": "insufficient-data"
1552
+ },
1553
+ {
1554
+ "nativeOperation": "RESOLD",
1555
+ "eventType": "Transfer",
1556
+ "externalEvent": "physical move or change of custody",
1557
+ "requires": "actual source and destination movement or custody evidence",
1558
+ "withoutEvidence": "insufficient-data"
1559
+ },
1560
+ {
1561
+ "nativeOperation": "TRANSFER",
1562
+ "eventType": "Transfer",
1563
+ "externalEvent": "change of custody",
1564
+ "requires": "custody evidence beyond the token transfer; the transfer of token control alone establishes neither physical movement nor legal title",
1565
+ "withoutEvidence": "insufficient-data"
1566
+ },
1567
+ {
1568
+ "nativeOperation": "REPAIRED",
1569
+ "eventType": "Transformation",
1570
+ "externalEvent": "modification (repair)",
1571
+ "requires": "repair evidence naming what was done, by whom and when",
1572
+ "withoutEvidence": "insufficient-data"
1573
+ },
1574
+ {
1575
+ "nativeOperation": "EDIT",
1576
+ "eventType": "Transformation",
1577
+ "externalEvent": "metadata revision",
1578
+ "requires": "nothing physical: an EDIT is a native metadata operation and maps to a record revision, not a physical transformation",
1579
+ "withoutEvidence": "transformed"
1580
+ },
1581
+ {
1582
+ "nativeOperation": "RECYCLED",
1583
+ "eventType": "Disposition",
1584
+ "externalEvent": "disposition, or a process creating new products or materials",
1585
+ "requires": "recycling evidence distinguishing disposition of this item from a process whose outputs carry new identities",
1586
+ "withoutEvidence": "insufficient-data"
1587
+ }
1588
+ ],
1589
+ "sourceRefs": [
1590
+ {
1591
+ "id": "eu-espr",
1592
+ "name": "Regulation (EU) 2024/1781 (ESPR): Art. 4 and Annex I for the product parameters, Art. 9 and Annex III for passport contents, Art. 7(5) for substances of concern",
1593
+ "use": "The framework regulation the profile is aligned with."
1594
+ },
1595
+ {
1596
+ "id": "eu-1007-2011",
1597
+ "name": "Regulation (EU) 1007/2011 on textile fibre names and labelling: binding today, and the source of the fibre composition and animal-origin declarations",
1598
+ "use": "Binding labelling law."
1599
+ },
1600
+ {
1601
+ "id": "eu-2024-825",
1602
+ "name": "Directive (EU) 2024/825 on empowering consumers: durability and reparability claims",
1603
+ "use": "Durability and reparability claims."
1604
+ },
1605
+ {
1606
+ "id": "eu-2008-98",
1607
+ "name": "Directive 2008/98/EC as amended: textile extended producer responsibility and separate collection",
1608
+ "use": "End of life."
1609
+ },
1610
+ {
1611
+ "id": "iso-test-methods",
1612
+ "name": "ISO 3758, ISO 5077, ISO 6330, ISO 12945 and the ISO 105 series, for the test methods the performance values are measured by",
1613
+ "licensedText": true,
1614
+ "use": "Cited by number; no table reproduced."
1615
+ },
1616
+ {
1617
+ "id": "iso3166",
1618
+ "name": "ISO 3166-1 alpha-2",
1619
+ "reference": "ISO 3166-1",
1620
+ "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.",
1621
+ "fields": [
1622
+ "manufacturingPlace.country",
1623
+ "supplyChain.country",
1624
+ "trims.origin"
1625
+ ]
1626
+ }
1627
+ ],
1628
+ "groups": [
1629
+ {
1630
+ "id": "identification",
1631
+ "title": "Identification"
1632
+ },
1633
+ {
1634
+ "id": "composition",
1635
+ "title": "What it is made of"
1636
+ },
1637
+ {
1638
+ "id": "substances",
1639
+ "title": "Substances of concern"
1640
+ },
1641
+ {
1642
+ "id": "durability",
1643
+ "title": "Durability and care"
1644
+ },
1645
+ {
1646
+ "id": "repair",
1647
+ "title": "Repair and reuse"
1648
+ },
1649
+ {
1650
+ "id": "footprint",
1651
+ "title": "Environmental footprint"
1652
+ },
1653
+ {
1654
+ "id": "endOfLife",
1655
+ "title": "End of life"
1656
+ },
1657
+ {
1658
+ "id": "supply",
1659
+ "title": "Supply chain"
1660
+ },
1661
+ {
1662
+ "id": "owner",
1663
+ "title": "Private to you"
1664
+ }
1665
+ ],
1666
+ "identity": {
1667
+ "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.",
1668
+ "granularities": [
1669
+ "batch",
1670
+ "item",
1671
+ "model"
1672
+ ],
1673
+ "modelIdentifier": "name",
1674
+ "batchIdentifier": "batch",
1675
+ "parentRelations": [
1676
+ {
1677
+ "child": "batch",
1678
+ "parent": "model"
1679
+ }
1680
+ ]
1681
+ }
1682
+ }