@tracepass/dpp-schemas 1.8.0 → 1.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -10,7 +10,7 @@
10
10
 
11
11
  [![License](https://img.shields.io/badge/license-Apache--2.0-blue.svg)](./LICENSE)
12
12
  [![npm](https://img.shields.io/npm/v/@tracepass/dpp-schemas.svg)](https://www.npmjs.com/package/@tracepass/dpp-schemas)
13
- [![Fields](https://img.shields.io/badge/fields-984-informational)](#whats-in-here)
13
+ [![Fields](https://img.shields.io/badge/fields-972-informational)](#whats-in-here)
14
14
  [![Categories](https://img.shields.io/badge/categories-13-informational)](#whats-in-here)
15
15
  [![Dependencies](https://img.shields.io/badge/dependencies-none-success)](#no-build-step)
16
16
  [![Schema](https://img.shields.io/badge/JSON%20Schema-2020--12-orange)](./schema.json)
@@ -39,20 +39,20 @@ this repository contains.
39
39
 
40
40
  ## What's in here
41
41
 
42
- Thirteen JSON files, one per product category. **984 fields in total. 152 are required by
43
- an instrument in force; 228 are anticipated under a rule that has not yet been adopted.**
42
+ Thirteen JSON files, one per product category. **972 fields in total. 131 are required by
43
+ an instrument in force; 221 are anticipated under a rule that has not yet been adopted.**
44
44
 
45
45
  | Category | Fields | Required | Instrument |
46
46
  |---|---:|---:|---|
47
47
  | `battery` | 120 | 50 | Regulation (EU) 2023/1542 |
48
48
  | `construction` | 49 | 4 | CPR (EU) 2024/3110 |
49
- | `detergents` | 83 | 18 | Regulation (EU) 2026/405 |
49
+ | `detergents` | 75 | 12 | Regulation (EU) 2026/405 |
50
50
  | `electronics` | 160 | 4 | ESPR (EU) 2024/1781 |
51
51
  | `fmcg` | 42 | 9 | ESPR (EU) 2024/1781 |
52
52
  | `furniture` | 79 | 4 | ESPR (EU) 2024/1781 |
53
53
  | `jewelry` | 53 | 3 | ESPR (EU) 2024/1781 |
54
54
  | `packaging` | 64 | 8 | PPWR (EU) 2025/40 |
55
- | `paints-coatings` | 69 | 15 | Directive 2004/42/EC |
55
+ | `paints-coatings` | 65 | 0 | Directive 2004/42/EC |
56
56
  | `steel` | 84 | 16 | ESPR (EU) 2024/1781 |
57
57
  | `textile` | 60 | 5 | ESPR (EU) 2024/1781 |
58
58
  | `toys` | 28 | 14 | Regulation (EU) 2025/2509 |
@@ -191,7 +191,11 @@ else:
191
191
 
192
192
  **`regulationRef`** is the reason this data is worth having. Every field says which
193
193
  article and annex mandates it, so a compliance report can cite its source rather than
194
- assert it.
194
+ assert it. A required field's `regulationRef.verification` quotes the operative sentence
195
+ from the act, says where it sits, and states any condition the law attaches (for
196
+ example, the Detergents Regulation's substance list does not bind industrial products).
197
+ Required fields not yet verified against the primary text are listed in
198
+ `audit/unverified-required.json`, which only shrinks.
195
199
 
196
200
  **`label`** is provided in the 24 official EU languages, because ESPR Article 8 requires
197
201
  the passport to be available in the language of the member state where the product is
package/index.json CHANGED
@@ -7,9 +7,9 @@
7
7
  },
8
8
  "totals": {
9
9
  "categories": 13,
10
- "fields": 984,
11
- "requiredFields": 152,
12
- "anticipatedFields": 228
10
+ "fields": 972,
11
+ "requiredFields": 131,
12
+ "anticipatedFields": 221
13
13
  },
14
14
  "categories": [
15
15
  {
@@ -51,9 +51,9 @@
51
51
  "label": "Detergents & Surfactants",
52
52
  "file": "templates/detergents.json",
53
53
  "version": 1,
54
- "fieldCount": 83,
55
- "requiredFieldCount": 18,
56
- "anticipatedFieldCount": 17,
54
+ "fieldCount": 75,
55
+ "requiredFieldCount": 12,
56
+ "anticipatedFieldCount": 10,
57
57
  "regulation": {
58
58
  "name": "Detergents Regulation",
59
59
  "number": "(EU) 2026/405",
@@ -157,8 +157,8 @@
157
157
  "label": "Paints & Coatings",
158
158
  "file": "templates/paints-coatings.json",
159
159
  "version": 1,
160
- "fieldCount": 69,
161
- "requiredFieldCount": 15,
160
+ "fieldCount": 65,
161
+ "requiredFieldCount": 0,
162
162
  "anticipatedFieldCount": 12,
163
163
  "regulation": {
164
164
  "name": "Decopaint Directive",
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@tracepass/dpp-schemas",
3
- "version": "1.8.0",
4
- "description": "Machine-readable field specifications for EU Digital Product Passports (ESPR) — 13 product categories, 984 fields, each traced to the article of EU law that mandates it. Pure JSON, no dependencies.",
3
+ "version": "1.9.0",
4
+ "description": "Machine-readable field specifications for EU Digital Product Passports (ESPR) — 13 product categories, 972 fields, each traced to the article of EU law that mandates it. Pure JSON, no dependencies.",
5
5
  "keywords": [
6
6
  "digital-product-passport",
7
7
  "dpp",
package/schema.json CHANGED
@@ -534,6 +534,37 @@
534
534
  },
535
535
  "uniqueItems": true,
536
536
  "description": "Keys into `standards.json` for the technical standards this field relates to (test method, declaration format, identifier scheme). Relating to a standard never makes a field required — only `kind: legislation` can — and naming one is not a claim of conformity."
537
+ },
538
+ "verification": {
539
+ "type": [
540
+ "object",
541
+ "null"
542
+ ],
543
+ "description": "Evidence that the citation was checked against the act's primary text: the operative sentence and where it sits. Required on every `validation.required` field (npm run check:audit enforces it, with a shrinking baseline for fields not yet verified). It records what a reader confirmed, so it is only ever added by reading the act, never generated.",
544
+ "additionalProperties": false,
545
+ "required": [
546
+ "quote",
547
+ "at"
548
+ ],
549
+ "properties": {
550
+ "quote": {
551
+ "type": "string",
552
+ "minLength": 20,
553
+ "description": "The operative sentence, verbatim from the Official Journal text (ellipses allowed), that imposes the duty this field discharges."
554
+ },
555
+ "at": {
556
+ "type": "string",
557
+ "minLength": 3,
558
+ "description": "Where the quote sits, e.g. \"32026R0405 Annex VI Part A(h)\"."
559
+ },
560
+ "condition": {
561
+ "type": [
562
+ "string",
563
+ "null"
564
+ ],
565
+ "description": "The condition the law attaches, when the duty does not bind every product of the category (e.g. \"consumer detergents only; industrial and institutional products use the SDS\"). Null when it binds all."
566
+ }
567
+ }
537
568
  }
538
569
  }
539
570
  },