@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,1033 @@
1
+ {
2
+ "id": "textile",
3
+ "version": 2,
4
+ "profile": "textile@2",
5
+ "status": "in use",
6
+ "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.",
7
+ "note": "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.",
8
+ "sources": [
9
+ "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",
10
+ "Regulation (EU) 1007/2011 on textile fibre names and labelling: binding today, and the source of the fibre composition and animal-origin declarations",
11
+ "Directive (EU) 2024/825 on empowering consumers: durability and reparability claims",
12
+ "Directive 2008/98/EC as amended: textile extended producer responsibility and separate collection",
13
+ "ISO 3758, ISO 5077, ISO 6330, ISO 12945 and the ISO 105 series, for the test methods the performance values are measured by"
14
+ ],
15
+ "registers": [
16
+ {
17
+ "prefix": "iso3166",
18
+ "name": "ISO 3166-1 alpha-2",
19
+ "reference": "ISO 3166-1",
20
+ "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.",
21
+ "fields": [
22
+ "manufacturingPlace.country",
23
+ "supplyChain.country",
24
+ "trims.origin"
25
+ ]
26
+ }
27
+ ],
28
+ "conventions": {
29
+ "resolved": "Constraints are resolved, not implied: a percent field carries minimum 0 and maximum 100 explicitly, and a country field carries its pattern. No type-specific defaults need reapplying.",
30
+ "closed": "closed:true means options are exhaustive and a value outside them is invalid. closed:false means the list is what is known in practice and a value outside it is valid, because the source names no exhaustive vocabulary. A field with options and no closed key is closed.",
31
+ "awaitingAct": "awaitingAct names a delegated or implementing act that will fix this value's permitted form. Until it is adopted no list or pattern is stated, because stating one would publish a guess as a standard. Do not reject values on this field.",
32
+ "prose": "prose:true marks a value that is meant to be written for a person to read. It is a deliberate per-field decision, not an absent constraint.",
33
+ "record": "type:record carries fields describing its parts. With repeat:true the value is an array of such records; without, a single one."
34
+ },
35
+ "fields": [
36
+ {
37
+ "key": "name",
38
+ "label": "Product name",
39
+ "obligation": "must",
40
+ "access": "public",
41
+ "level": "model",
42
+ "type": "text",
43
+ "prose": true,
44
+ "onLabel": true,
45
+ "group": "identification",
46
+ "source": "form",
47
+ "legalRef": "ESPR Annex III(a); the passport has to say what the product is",
48
+ "supersedes": "name",
49
+ "note": "The name the brand sells it under, written by a person for a person."
50
+ },
51
+ {
52
+ "key": "category",
53
+ "label": "Kind of product",
54
+ "obligation": "must",
55
+ "access": "public",
56
+ "level": "model",
57
+ "type": "enum",
58
+ "options": [
59
+ {
60
+ "value": "apparel",
61
+ "label": "Clothing"
62
+ },
63
+ {
64
+ "value": "footwear",
65
+ "label": "Footwear"
66
+ },
67
+ {
68
+ "value": "home",
69
+ "label": "Home textile"
70
+ },
71
+ {
72
+ "value": "accessory",
73
+ "label": "Accessory"
74
+ }
75
+ ],
76
+ "closed": false,
77
+ "group": "identification",
78
+ "source": "form",
79
+ "legalRef": "ESPR Art. 4; the parameters that apply depend on what the product is",
80
+ "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."
81
+ },
82
+ {
83
+ "key": "modelIdentifier",
84
+ "label": "Model or style reference",
85
+ "obligation": "must",
86
+ "access": "public",
87
+ "level": "model",
88
+ "type": "id",
89
+ "maxLength": 64,
90
+ "group": "identification",
91
+ "source": "form",
92
+ "legalRef": "ESPR Annex III(b): the unique product identifier is model-level"
93
+ },
94
+ {
95
+ "key": "batch",
96
+ "label": "Batch",
97
+ "obligation": "must",
98
+ "access": "public",
99
+ "level": "batch",
100
+ "type": "id",
101
+ "maxLength": 64,
102
+ "group": "identification",
103
+ "source": "form",
104
+ "legalRef": "ESPR Annex III(b); Reg. 1007/2011 traceability of a labelled lot",
105
+ "supersedes": "batch"
106
+ },
107
+ {
108
+ "key": "gtin",
109
+ "label": "Article number (GTIN)",
110
+ "obligation": "should",
111
+ "access": "public",
112
+ "level": "model",
113
+ "type": "id",
114
+ "pattern": "^\\d{8}$|^\\d{12,14}$",
115
+ "patternHint": "8, 12, 13 or 14 digits",
116
+ "group": "identification",
117
+ "source": "form",
118
+ "legalRef": "ESPR Annex III(c): commodity and trade item codes where they exist"
119
+ },
120
+ {
121
+ "key": "manufacturer",
122
+ "label": "Brand name",
123
+ "obligation": "must",
124
+ "access": "public",
125
+ "level": "model",
126
+ "type": "text",
127
+ "prose": true,
128
+ "onLabel": true,
129
+ "group": "identification",
130
+ "source": "brand",
131
+ "legalRef": "ESPR Annex III(e); Reg. 1007/2011 Art. 15 identifies the responsible operator",
132
+ "supersedes": "manufacturer",
133
+ "note": "A company name; nothing to constrain it to but itself."
134
+ },
135
+ {
136
+ "key": "manufacturerContact",
137
+ "label": "Brand contact",
138
+ "obligation": "must",
139
+ "access": "public",
140
+ "level": "model",
141
+ "type": "text",
142
+ "prose": true,
143
+ "group": "identification",
144
+ "source": "brand",
145
+ "legalRef": "ESPR Annex III(e): the operator has to be reachable, not merely named",
146
+ "supersedes": "manufacturerContact",
147
+ "note": "An email, a postal address or a page. Constraining it to one shape would exclude the others."
148
+ },
149
+ {
150
+ "key": "operatorId",
151
+ "label": "EU operator identifier",
152
+ "obligation": "should",
153
+ "access": "public",
154
+ "level": "model",
155
+ "type": "id",
156
+ "awaitingAct": "the ESPR implementing act on unique operator identifiers",
157
+ "group": "identification",
158
+ "source": "deferred",
159
+ "legalRef": "ESPR Annex III(e)",
160
+ "note": "Declared and not captured: the identifier scheme does not exist yet, so an empty box would invite a made-up value."
161
+ },
162
+ {
163
+ "key": "manufacturingPlace",
164
+ "label": "Where it was made",
165
+ "obligation": "must",
166
+ "access": "public",
167
+ "level": "model",
168
+ "type": "record",
169
+ "fields": [
170
+ {
171
+ "key": "city",
172
+ "label": "Town or city",
173
+ "type": "text",
174
+ "required": true
175
+ },
176
+ {
177
+ "key": "country",
178
+ "label": "Country",
179
+ "type": "country",
180
+ "pattern": "^[A-Z]{2}$",
181
+ "patternHint": "a two-letter country code",
182
+ "required": true
183
+ }
184
+ ],
185
+ "group": "identification",
186
+ "source": "form",
187
+ "legalRef": "Reg. 1007/2011 Art. 16 read with the Union Customs Code origin rules",
188
+ "supersedes": "origin"
189
+ },
190
+ {
191
+ "key": "made",
192
+ "label": "Made",
193
+ "obligation": "should",
194
+ "access": "public",
195
+ "level": "batch",
196
+ "type": "monthYear",
197
+ "group": "identification",
198
+ "source": "form",
199
+ "legalRef": "ESPR Annex I(a): a durability claim is meaningless without a start date"
200
+ },
201
+ {
202
+ "key": "colour",
203
+ "label": "Colour",
204
+ "obligation": "should",
205
+ "access": "public",
206
+ "level": "model",
207
+ "type": "text",
208
+ "maxLength": 60,
209
+ "prose": true,
210
+ "group": "identification",
211
+ "source": "form",
212
+ "legalRef": "Nothing requires this. It identifies the item to the person holding it.",
213
+ "note": "Brands name colours, and the name is part of the product."
214
+ },
215
+ {
216
+ "key": "size",
217
+ "label": "Size",
218
+ "obligation": "should",
219
+ "access": "public",
220
+ "level": "item",
221
+ "type": "text",
222
+ "maxLength": 32,
223
+ "prose": true,
224
+ "group": "identification",
225
+ "source": "form",
226
+ "legalRef": "Nothing requires this. It is what makes a passport match the garment in hand.",
227
+ "note": "Size systems differ by market and by brand; a closed list would be wrong somewhere."
228
+ },
229
+ {
230
+ "key": "weight",
231
+ "label": "Weight",
232
+ "obligation": "should",
233
+ "access": "public",
234
+ "level": "model",
235
+ "type": "decimal",
236
+ "unit": "g",
237
+ "minimum": 1,
238
+ "maximum": 50000,
239
+ "step": 1,
240
+ "group": "identification",
241
+ "source": "form",
242
+ "legalRef": "ESPR Annex I(l): resource use, and the basis of every per-mass figure below"
243
+ },
244
+ {
245
+ "key": "fibres",
246
+ "label": "Fibre composition",
247
+ "obligation": "must",
248
+ "access": "public",
249
+ "level": "model",
250
+ "type": "record",
251
+ "fields": [
252
+ {
253
+ "key": "fibre",
254
+ "label": "Fibre",
255
+ "type": "enum",
256
+ "options": [
257
+ {
258
+ "value": "wool",
259
+ "label": "Wool"
260
+ },
261
+ {
262
+ "value": "cotton",
263
+ "label": "Cotton"
264
+ },
265
+ {
266
+ "value": "linen",
267
+ "label": "Linen (flax)"
268
+ },
269
+ {
270
+ "value": "silk",
271
+ "label": "Silk"
272
+ },
273
+ {
274
+ "value": "hemp",
275
+ "label": "Hemp"
276
+ },
277
+ {
278
+ "value": "cashmere",
279
+ "label": "Cashmere"
280
+ },
281
+ {
282
+ "value": "mohair",
283
+ "label": "Mohair"
284
+ },
285
+ {
286
+ "value": "alpaca",
287
+ "label": "Alpaca"
288
+ },
289
+ {
290
+ "value": "viscose",
291
+ "label": "Viscose"
292
+ },
293
+ {
294
+ "value": "lyocell",
295
+ "label": "Lyocell"
296
+ },
297
+ {
298
+ "value": "modal",
299
+ "label": "Modal"
300
+ },
301
+ {
302
+ "value": "cupro",
303
+ "label": "Cupro"
304
+ },
305
+ {
306
+ "value": "acetate",
307
+ "label": "Acetate"
308
+ },
309
+ {
310
+ "value": "polyester",
311
+ "label": "Polyester"
312
+ },
313
+ {
314
+ "value": "polyamide",
315
+ "label": "Polyamide (nylon)"
316
+ },
317
+ {
318
+ "value": "elastane",
319
+ "label": "Elastane"
320
+ },
321
+ {
322
+ "value": "acrylic",
323
+ "label": "Acrylic"
324
+ },
325
+ {
326
+ "value": "polypropylene",
327
+ "label": "Polypropylene"
328
+ }
329
+ ],
330
+ "closed": false,
331
+ "required": true
332
+ },
333
+ {
334
+ "key": "percent",
335
+ "label": "Share by weight",
336
+ "type": "percent",
337
+ "unit": "%",
338
+ "minimum": 0,
339
+ "maximum": 100,
340
+ "required": true
341
+ },
342
+ {
343
+ "key": "source",
344
+ "label": "Source",
345
+ "type": "enum",
346
+ "options": [
347
+ {
348
+ "value": "preConsumer",
349
+ "label": "Pre-consumer recycled"
350
+ },
351
+ {
352
+ "value": "postConsumer",
353
+ "label": "Post-consumer recycled"
354
+ },
355
+ {
356
+ "value": "virgin",
357
+ "label": "Virgin"
358
+ }
359
+ ],
360
+ "closed": true
361
+ }
362
+ ],
363
+ "repeat": true,
364
+ "onLabel": true,
365
+ "group": "composition",
366
+ "source": "form",
367
+ "legalRef": "Reg. (EU) 1007/2011 Art. 5, 9 and 14: binding today, by weight, in descending order",
368
+ "supersedes": "fibres"
369
+ },
370
+ {
371
+ "key": "nonTextileParts",
372
+ "label": "Non-textile parts of animal origin",
373
+ "obligation": "must",
374
+ "access": "public",
375
+ "level": "model",
376
+ "type": "text",
377
+ "maxLength": 200,
378
+ "prose": true,
379
+ "conditional": "the product contains non-textile parts of animal origin",
380
+ "onLabel": true,
381
+ "group": "composition",
382
+ "source": "form",
383
+ "legalRef": "Reg. (EU) 1007/2011 Art. 12: mandatory where such parts are present",
384
+ "note": "The regulation asks for a phrase, not a code: \"contains non-textile parts of animal origin\"."
385
+ },
386
+ {
387
+ "key": "recycledContent",
388
+ "label": "Recycled content",
389
+ "obligation": "should",
390
+ "access": "public",
391
+ "level": "model",
392
+ "type": "percent",
393
+ "unit": "%",
394
+ "minimum": 0,
395
+ "maximum": 100,
396
+ "group": "composition",
397
+ "source": "form",
398
+ "legalRef": "ESPR Annex I(g): recycled content is a named parameter; the threshold waits on the act",
399
+ "supersedes": "recycled"
400
+ },
401
+ {
402
+ "key": "biobasedContent",
403
+ "label": "Bio-based content",
404
+ "obligation": "nice",
405
+ "access": "public",
406
+ "level": "model",
407
+ "type": "percent",
408
+ "unit": "%",
409
+ "minimum": 0,
410
+ "maximum": 100,
411
+ "group": "composition",
412
+ "source": "form",
413
+ "legalRef": "Nothing requires this. Declared where a brand can substantiate it."
414
+ },
415
+ {
416
+ "key": "trims",
417
+ "label": "Trims and hardware",
418
+ "obligation": "should",
419
+ "access": "public",
420
+ "level": "model",
421
+ "type": "record",
422
+ "fields": [
423
+ {
424
+ "key": "part",
425
+ "label": "Part",
426
+ "type": "text",
427
+ "required": true
428
+ },
429
+ {
430
+ "key": "material",
431
+ "label": "Material",
432
+ "type": "text",
433
+ "required": true
434
+ },
435
+ {
436
+ "key": "origin",
437
+ "label": "Country",
438
+ "type": "country",
439
+ "pattern": "^[A-Z]{2}$",
440
+ "patternHint": "a two-letter country code"
441
+ }
442
+ ],
443
+ "repeat": true,
444
+ "group": "composition",
445
+ "source": "form",
446
+ "legalRef": "ESPR Annex I(d) and (n): what separates for repair, and what separates for recycling"
447
+ },
448
+ {
449
+ "key": "substancesOfConcern",
450
+ "label": "Substances of concern",
451
+ "obligation": "must",
452
+ "access": "public",
453
+ "level": "model",
454
+ "type": "record",
455
+ "fields": [
456
+ {
457
+ "key": "substance",
458
+ "label": "Substance",
459
+ "type": "text",
460
+ "required": true
461
+ },
462
+ {
463
+ "key": "casNumber",
464
+ "label": "CAS number",
465
+ "type": "text",
466
+ "pattern": "^\\d{2,7}-\\d{2}-\\d$",
467
+ "patternHint": "a CAS registry number, e.g. 7440-48-4"
468
+ },
469
+ {
470
+ "key": "concentration",
471
+ "label": "Concentration",
472
+ "type": "percent",
473
+ "unit": "%",
474
+ "minimum": 0,
475
+ "maximum": 100
476
+ },
477
+ {
478
+ "key": "location",
479
+ "label": "Where in the product",
480
+ "type": "text"
481
+ }
482
+ ],
483
+ "repeat": true,
484
+ "conditional": "a substance of concern is present above the threshold the act will set",
485
+ "group": "substances",
486
+ "source": "form",
487
+ "legalRef": "ESPR Art. 7(5): substances of concern must be traceable through the passport",
488
+ "supersedes": "substances"
489
+ },
490
+ {
491
+ "key": "substanceStatement",
492
+ "label": "What that means for you",
493
+ "obligation": "should",
494
+ "access": "public",
495
+ "level": "model",
496
+ "type": "text",
497
+ "maxLength": 400,
498
+ "prose": true,
499
+ "group": "substances",
500
+ "source": "form",
501
+ "legalRef": "ESPR Art. 9(2)(b): passport information shall be complete and comprehensible",
502
+ "note": "A list of CAS numbers tells a consumer nothing. This is the sentence that does."
503
+ },
504
+ {
505
+ "key": "chemicalCompliance",
506
+ "label": "Chemical compliance evidence",
507
+ "obligation": "should",
508
+ "access": "legitimate",
509
+ "level": "model",
510
+ "type": "document",
511
+ "group": "substances",
512
+ "source": "form",
513
+ "legalRef": "REACH Art. 33 read with ESPR Annex III(d): compliance documentation"
514
+ },
515
+ {
516
+ "key": "microplasticRelease",
517
+ "label": "Microplastic release",
518
+ "obligation": "nice",
519
+ "access": "public",
520
+ "level": "model",
521
+ "type": "text",
522
+ "awaitingAct": "the harmonised test method for microfibre release",
523
+ "prose": true,
524
+ "group": "substances",
525
+ "source": "form",
526
+ "legalRef": "ESPR Annex I(k); the method is not yet fixed",
527
+ "note": "No measurement method is harmonised, so a number here would be incomparable with anyone else’s."
528
+ },
529
+ {
530
+ "key": "care",
531
+ "label": "Care",
532
+ "obligation": "must",
533
+ "access": "public",
534
+ "level": "model",
535
+ "type": "multi",
536
+ "options": [
537
+ {
538
+ "value": "wash30",
539
+ "label": "Machine wash at 30 °C"
540
+ },
541
+ {
542
+ "value": "wash40",
543
+ "label": "Machine wash at 40 °C"
544
+ },
545
+ {
546
+ "value": "wash60",
547
+ "label": "Machine wash at 60 °C"
548
+ },
549
+ {
550
+ "value": "handWash",
551
+ "label": "Hand wash only"
552
+ },
553
+ {
554
+ "value": "noWash",
555
+ "label": "Do not wash"
556
+ },
557
+ {
558
+ "value": "noBleach",
559
+ "label": "Do not bleach"
560
+ },
561
+ {
562
+ "value": "tumbleLow",
563
+ "label": "Tumble dry low"
564
+ },
565
+ {
566
+ "value": "noTumble",
567
+ "label": "Do not tumble dry"
568
+ },
569
+ {
570
+ "value": "ironLow",
571
+ "label": "Iron low"
572
+ },
573
+ {
574
+ "value": "ironMedium",
575
+ "label": "Iron medium"
576
+ },
577
+ {
578
+ "value": "noIron",
579
+ "label": "Do not iron"
580
+ },
581
+ {
582
+ "value": "dryClean",
583
+ "label": "Professional dry clean"
584
+ },
585
+ {
586
+ "value": "noDryClean",
587
+ "label": "Do not dry clean"
588
+ }
589
+ ],
590
+ "closed": true,
591
+ "onLabel": true,
592
+ "group": "durability",
593
+ "source": "form",
594
+ "legalRef": "ISO 3758 care symbols; Dir. (EU) 2024/825 Art. 2 on durability information",
595
+ "supersedes": "care"
596
+ },
597
+ {
598
+ "key": "careNote",
599
+ "label": "How to make it last",
600
+ "obligation": "should",
601
+ "access": "public",
602
+ "level": "model",
603
+ "type": "text",
604
+ "maxLength": 400,
605
+ "prose": true,
606
+ "group": "durability",
607
+ "source": "form",
608
+ "legalRef": "ESPR Annex I(a): extending lifetime is the parameter; this is how",
609
+ "note": "The advice a maker would give in person, which no symbol carries."
610
+ },
611
+ {
612
+ "key": "expectedLifetime",
613
+ "label": "Expected lifetime",
614
+ "obligation": "should",
615
+ "access": "public",
616
+ "level": "model",
617
+ "type": "integer",
618
+ "unit": "years",
619
+ "minimum": 1,
620
+ "maximum": 100,
621
+ "step": 1,
622
+ "group": "durability",
623
+ "source": "form",
624
+ "legalRef": "ESPR Annex I(a) and Dir. (EU) 2024/825: a durability claim must be substantiated"
625
+ },
626
+ {
627
+ "key": "washCycles",
628
+ "label": "Tested to",
629
+ "obligation": "should",
630
+ "access": "public",
631
+ "level": "model",
632
+ "type": "integer",
633
+ "unit": "wash cycles",
634
+ "minimum": 1,
635
+ "maximum": 1000,
636
+ "step": 1,
637
+ "group": "durability",
638
+ "source": "form",
639
+ "legalRef": "ESPR Annex I(b) reliability, tested per ISO 6330 domestic washing procedures"
640
+ },
641
+ {
642
+ "key": "colourFastness",
643
+ "label": "Colour fastness",
644
+ "obligation": "should",
645
+ "access": "public",
646
+ "level": "model",
647
+ "type": "decimal",
648
+ "unit": "grade",
649
+ "minimum": 1,
650
+ "maximum": 5,
651
+ "step": 0.5,
652
+ "group": "durability",
653
+ "source": "form",
654
+ "legalRef": "ESPR Annex I(b), graded 1-5 per the ISO 105 series"
655
+ },
656
+ {
657
+ "key": "dimensionalStability",
658
+ "label": "Dimensional change after washing",
659
+ "obligation": "should",
660
+ "access": "public",
661
+ "level": "model",
662
+ "type": "decimal",
663
+ "unit": "%",
664
+ "minimum": -20,
665
+ "maximum": 20,
666
+ "step": 0.5,
667
+ "group": "durability",
668
+ "source": "form",
669
+ "legalRef": "ESPR Annex I(b), measured per ISO 5077"
670
+ },
671
+ {
672
+ "key": "pillingResistance",
673
+ "label": "Pilling resistance",
674
+ "obligation": "should",
675
+ "access": "public",
676
+ "level": "model",
677
+ "type": "decimal",
678
+ "unit": "grade",
679
+ "minimum": 1,
680
+ "maximum": 5,
681
+ "step": 0.5,
682
+ "group": "durability",
683
+ "source": "form",
684
+ "legalRef": "ESPR Annex I(b), graded 1-5 per ISO 12945"
685
+ },
686
+ {
687
+ "key": "guarantee",
688
+ "label": "Guarantee",
689
+ "obligation": "should",
690
+ "access": "public",
691
+ "level": "model",
692
+ "type": "integer",
693
+ "unit": "months",
694
+ "minimum": 0,
695
+ "maximum": 600,
696
+ "step": 1,
697
+ "group": "durability",
698
+ "source": "form",
699
+ "legalRef": "Dir. (EU) 2024/825: a commercial guarantee of durability must state its term",
700
+ "supersedes": "warranty"
701
+ },
702
+ {
703
+ "key": "repairability",
704
+ "label": "Repairability",
705
+ "obligation": "should",
706
+ "access": "public",
707
+ "level": "model",
708
+ "type": "text",
709
+ "maxLength": 300,
710
+ "awaitingAct": "the ESPR delegated act on repairability scoring for textiles",
711
+ "prose": true,
712
+ "group": "repair",
713
+ "source": "form",
714
+ "legalRef": "ESPR Annex I(c) and Art. 7(2)(b)(iii)",
715
+ "note": "The scoring class is not fixed, so a letter or a number here would be invented."
716
+ },
717
+ {
718
+ "key": "spareParts",
719
+ "label": "Spare parts",
720
+ "obligation": "should",
721
+ "access": "public",
722
+ "level": "model",
723
+ "type": "text",
724
+ "maxLength": 300,
725
+ "prose": true,
726
+ "group": "repair",
727
+ "source": "form",
728
+ "legalRef": "ESPR Annex I(d): availability of spare parts is a named parameter",
729
+ "note": "Which parts, and for how long. A yes/no would hide the part that matters."
730
+ },
731
+ {
732
+ "key": "repairInstructions",
733
+ "label": "Repair instructions",
734
+ "obligation": "should",
735
+ "access": "public",
736
+ "level": "model",
737
+ "type": "document",
738
+ "group": "repair",
739
+ "source": "form",
740
+ "legalRef": "ESPR Annex I(e): access to repair information"
741
+ },
742
+ {
743
+ "key": "repairServices",
744
+ "label": "Where to get it repaired",
745
+ "obligation": "should",
746
+ "access": "public",
747
+ "level": "model",
748
+ "type": "url",
749
+ "group": "repair",
750
+ "source": "form",
751
+ "legalRef": "Dir. (EU) 2024/825 recital 22: repair should be the visible option"
752
+ },
753
+ {
754
+ "key": "carbonFootprint",
755
+ "label": "Carbon footprint",
756
+ "obligation": "should",
757
+ "access": "public",
758
+ "level": "model",
759
+ "type": "decimal",
760
+ "unit": "kg CO₂e",
761
+ "minimum": 0,
762
+ "maximum": 10000,
763
+ "step": 0.01,
764
+ "group": "footprint",
765
+ "source": "form",
766
+ "legalRef": "ESPR Annex I(m), computed per the Apparel and Footwear PEFCR"
767
+ },
768
+ {
769
+ "key": "carbonFootprintStudy",
770
+ "label": "The study behind the figure",
771
+ "obligation": "should",
772
+ "access": "public",
773
+ "level": "model",
774
+ "type": "document",
775
+ "group": "footprint",
776
+ "source": "form",
777
+ "legalRef": "ESPR Art. 9(2)(b): a figure a reader cannot check is not information"
778
+ },
779
+ {
780
+ "key": "footprintClass",
781
+ "label": "Environmental footprint class",
782
+ "obligation": "should",
783
+ "access": "public",
784
+ "level": "model",
785
+ "type": "text",
786
+ "maxLength": 80,
787
+ "awaitingAct": "the ESPR delegated act setting performance classes for textiles",
788
+ "prose": true,
789
+ "group": "footprint",
790
+ "source": "deferred",
791
+ "legalRef": "ESPR Art. 7(4)",
792
+ "note": "The class format is not set. Naming one would publish our guess as a grade."
793
+ },
794
+ {
795
+ "key": "waterUse",
796
+ "label": "Water use",
797
+ "obligation": "nice",
798
+ "access": "public",
799
+ "level": "model",
800
+ "type": "decimal",
801
+ "unit": "m³",
802
+ "minimum": 0,
803
+ "maximum": 100000,
804
+ "step": 0.1,
805
+ "group": "footprint",
806
+ "source": "form",
807
+ "legalRef": "ESPR Annex I(l): resource use. Declared where a brand has measured it."
808
+ },
809
+ {
810
+ "key": "collection",
811
+ "label": "Where to return it",
812
+ "obligation": "must",
813
+ "access": "public",
814
+ "level": "model",
815
+ "type": "text",
816
+ "maxLength": 400,
817
+ "prose": true,
818
+ "group": "endOfLife",
819
+ "source": "form",
820
+ "legalRef": "Waste Framework Directive: separate collection of textiles since 1 January 2025",
821
+ "supersedes": "endOfLife",
822
+ "note": "A place and a method, in the words the person returning it will use."
823
+ },
824
+ {
825
+ "key": "recyclability",
826
+ "label": "How it can be recycled",
827
+ "obligation": "should",
828
+ "access": "public",
829
+ "level": "model",
830
+ "type": "text",
831
+ "maxLength": 400,
832
+ "prose": true,
833
+ "group": "endOfLife",
834
+ "source": "form",
835
+ "legalRef": "ESPR Annex I(n): expected generation of waste materials",
836
+ "note": "What a recycler can actually do with it, which no percentage conveys."
837
+ },
838
+ {
839
+ "key": "separability",
840
+ "label": "What comes apart",
841
+ "obligation": "should",
842
+ "access": "legitimate",
843
+ "level": "model",
844
+ "type": "text",
845
+ "maxLength": 300,
846
+ "prose": true,
847
+ "group": "endOfLife",
848
+ "source": "form",
849
+ "legalRef": "ESPR Annex I(h) and (i): ease of disassembly, for reuse and recycling",
850
+ "note": "Which components separate, and how. The sentence a dismantler needs."
851
+ },
852
+ {
853
+ "key": "eprRegistration",
854
+ "label": "Producer responsibility registration",
855
+ "obligation": "should",
856
+ "access": "authority",
857
+ "level": "model",
858
+ "type": "id",
859
+ "maxLength": 64,
860
+ "group": "endOfLife",
861
+ "source": "brand",
862
+ "legalRef": "Waste Framework Directive textile EPR: the producer register number"
863
+ },
864
+ {
865
+ "key": "supplyChain",
866
+ "label": "Supply chain",
867
+ "obligation": "should",
868
+ "access": "public",
869
+ "level": "model",
870
+ "type": "record",
871
+ "fields": [
872
+ {
873
+ "key": "stage",
874
+ "label": "Stage",
875
+ "type": "enum",
876
+ "options": [
877
+ {
878
+ "value": "fibre",
879
+ "label": "Fibre production"
880
+ },
881
+ {
882
+ "value": "spinning",
883
+ "label": "Spinning"
884
+ },
885
+ {
886
+ "value": "weaving",
887
+ "label": "Weaving or knitting"
888
+ },
889
+ {
890
+ "value": "dyeing",
891
+ "label": "Dyeing and finishing"
892
+ },
893
+ {
894
+ "value": "assembly",
895
+ "label": "Cutting and assembly"
896
+ }
897
+ ],
898
+ "closed": true,
899
+ "required": true
900
+ },
901
+ {
902
+ "key": "country",
903
+ "label": "Country",
904
+ "type": "country",
905
+ "pattern": "^[A-Z]{2}$",
906
+ "patternHint": "a two-letter country code",
907
+ "required": true
908
+ },
909
+ {
910
+ "key": "facility",
911
+ "label": "Facility",
912
+ "type": "text"
913
+ }
914
+ ],
915
+ "repeat": true,
916
+ "group": "supply",
917
+ "source": "form",
918
+ "legalRef": "ESPR Annex III(f): unique facility identifiers, at the stages that have them"
919
+ },
920
+ {
921
+ "key": "certifications",
922
+ "label": "Independent certification",
923
+ "obligation": "should",
924
+ "access": "public",
925
+ "level": "model",
926
+ "type": "multi",
927
+ "options": [
928
+ {
929
+ "value": "gots",
930
+ "label": "GOTS"
931
+ },
932
+ {
933
+ "value": "oekoTex100",
934
+ "label": "OEKO-TEX Standard 100"
935
+ },
936
+ {
937
+ "value": "grs",
938
+ "label": "Global Recycled Standard"
939
+ },
940
+ {
941
+ "value": "rws",
942
+ "label": "Responsible Wool Standard"
943
+ },
944
+ {
945
+ "value": "euEcolabel",
946
+ "label": "EU Ecolabel"
947
+ },
948
+ {
949
+ "value": "cradleToCradle",
950
+ "label": "Cradle to Cradle"
951
+ },
952
+ {
953
+ "value": "bluesign",
954
+ "label": "bluesign"
955
+ }
956
+ ],
957
+ "closed": false,
958
+ "group": "supply",
959
+ "source": "form",
960
+ "legalRef": "Dir. (EU) 2024/825 Art. 2: a sustainability label needs a certification behind it",
961
+ "note": "Open: a closed list of schemes would read as an endorsement of exactly those."
962
+ },
963
+ {
964
+ "key": "dueDiligence",
965
+ "label": "Due diligence report",
966
+ "obligation": "should",
967
+ "access": "legitimate",
968
+ "level": "model",
969
+ "type": "document",
970
+ "group": "supply",
971
+ "source": "form",
972
+ "legalRef": "Dir. (EU) 2024/1760 corporate sustainability due diligence, where in scope"
973
+ },
974
+ {
975
+ "key": "provenance",
976
+ "label": "Provenance",
977
+ "obligation": "nice",
978
+ "access": "owner",
979
+ "level": "item",
980
+ "type": "text",
981
+ "maxLength": 600,
982
+ "prose": true,
983
+ "group": "owner",
984
+ "source": "form",
985
+ "legalRef": "Nothing requires this. It is the owner tier the selective-disclosure demo turns on.",
986
+ "supersedes": "provenance",
987
+ "note": "The story of this particular item, which is prose by definition."
988
+ },
989
+ {
990
+ "key": "purchase",
991
+ "label": "Purchased",
992
+ "obligation": "nice",
993
+ "access": "owner",
994
+ "level": "item",
995
+ "type": "text",
996
+ "maxLength": 200,
997
+ "prose": true,
998
+ "dynamic": true,
999
+ "group": "owner",
1000
+ "source": "event",
1001
+ "legalRef": "Nothing requires this. It is what makes the record theirs.",
1002
+ "note": "Where and when, as the owner would write it."
1003
+ },
1004
+ {
1005
+ "key": "personalisation",
1006
+ "label": "Alterations and fit",
1007
+ "obligation": "nice",
1008
+ "access": "owner",
1009
+ "level": "item",
1010
+ "type": "text",
1011
+ "maxLength": 300,
1012
+ "prose": true,
1013
+ "dynamic": true,
1014
+ "group": "owner",
1015
+ "source": "event",
1016
+ "legalRef": "Nothing requires this. An altered garment is a different garment to its owner.",
1017
+ "supersedes": "personalisation",
1018
+ "note": "Sleeve lengths and hems, in the tailor’s words."
1019
+ },
1020
+ {
1021
+ "key": "warrantyRegistration",
1022
+ "label": "Guarantee registration",
1023
+ "obligation": "nice",
1024
+ "access": "owner",
1025
+ "level": "item",
1026
+ "type": "id",
1027
+ "maxLength": 64,
1028
+ "group": "owner",
1029
+ "source": "form",
1030
+ "legalRef": "Nothing requires this. It saves the owner keeping a receipt."
1031
+ }
1032
+ ]
1033
+ }