@tracepass/dpp-schemas 1.4.0 → 1.5.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
@@ -66,7 +66,8 @@ an ESPR delegated act, or citing an instrument that creates no passport duty at
66
66
  (`paints-coatings`, `packaging`, `construction`).
67
67
 
68
68
  It is not the case that every battery field is required: the template also carries fields that are
69
- `anticipated` (pending the carbon-footprint and due-diligence implementing acts) and
69
+ `anticipated` (pending the carbon-footprint and due-diligence acts, and — per the
70
+ Commission's data-points guidance v2.0 — the Article 8 recycled-content act) and
70
71
  fields that apply only to some battery sub-categories via `validation.requiredBy`.
71
72
 
72
73
  **`required` means an instrument in force compels the data.** ESPR (EU) 2024/1781 is a
@@ -85,6 +86,37 @@ containing Annex X materials. `conditional` means the instrument compels the fie
85
86
  its stated gate is met — so a passport legitimately leaves it empty otherwise. Fields with no
86
87
  `requiredBy` apply to the whole category.
87
88
 
89
+ ## Standards
90
+
91
+ [`standards.json`](./standards.json) is a registry of the technical standards a field — or
92
+ a DPP system — relates to. A field names them in `regulationRef.standards`, as keys into the
93
+ registry:
94
+
95
+ ```jsonc
96
+ "regulationRef": {
97
+ "article": "EN 10204, EN 10025, EN 10088 (stainless)", // human-facing, unchanged
98
+ "kind": "standard",
99
+ "standards": ["EN 10204", "EN 10025", "EN 10088"] // machine-facing
100
+ }
101
+ ```
102
+
103
+ - **A standard never makes a field required.** Only `kind: "legislation"` can. A standard
104
+ supports a presumption of conformity; it binds nothing on its own.
105
+ - **Only an Official Journal citation confers that presumption.** Entries with
106
+ `kind: "harmonised-standard"` carry `ojCitation` — the implementing decision and the
107
+ provisions it covers. Today that is the six CEN/CLC/JTC 24 system standards
108
+ (EN 18216, 18219, 18220, 18221, 18222, 18223) cited by Implementing Decision (EU)
109
+ 2026/1736 for ESPR Articles 10 and 11. EN 18239 and EN 18246 are still drafts.
110
+ - **National adoptions are aliases, not separate standards.** Every CEN/CENELEC member
111
+ publishes an EN unchanged (DIN EN 18219, BDS EN …); confirmed ones are listed under
112
+ `nationalAdoptions`.
113
+ - **`verified: true`** means the title and status were checked against the OJ or the
114
+ standard's own text. Otherwise `subject` is a descriptive label, not the official title.
115
+ - **Naming a standard is not a conformity claim** — for this dataset or for any system
116
+ built on it.
117
+
118
+ `npm run check:standards` fails if any field references a key the registry does not hold.
119
+
88
120
  ## What a field looks like
89
121
 
90
122
  ```jsonc
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tracepass/dpp-schemas",
3
- "version": "1.4.0",
3
+ "version": "1.5.0",
4
4
  "description": "Machine-readable field specifications for EU Digital Product Passports (ESPR) — 13 product categories, 1005 fields, each traced to the article of EU law that mandates it. Pure JSON, no dependencies.",
5
5
  "keywords": [
6
6
  "digital-product-passport",
@@ -32,6 +32,7 @@
32
32
  "schema.json",
33
33
  "index.json",
34
34
  "instruments.json",
35
+ "standards.json",
35
36
  "units.json",
36
37
  "README.md",
37
38
  "LICENSE"
@@ -45,6 +46,7 @@
45
46
  "validate": "python3 -c \"import json,glob,sys;from jsonschema import Draft202012Validator as V;v=V(json.load(open('schema.json')));bad=0\nfor p in sorted(glob.glob('templates/*.json')):\n e=list(v.iter_errors(json.load(open(p))));bad+=bool(e);print(('FAIL' if e else 'ok '),p)\n [print(' ',str(x.absolute_path),x.message[:120]) for x in e[:3]]\nsys.exit(1 if bad else 0)\"",
46
47
  "build:index": "node scripts/build-index.mjs",
47
48
  "check:index": "node scripts/build-index.mjs --check",
48
- "check": "npm run validate && npm run check:index"
49
+ "check": "npm run validate && npm run check:index && npm run check:standards",
50
+ "check:standards": "node scripts/check-standards.mjs"
49
51
  }
50
52
  }
package/schema.json CHANGED
@@ -525,6 +525,14 @@
525
525
  "null"
526
526
  ],
527
527
  "description": "Free-text name when the reference is not EU legislation."
528
+ },
529
+ "standards": {
530
+ "type": "array",
531
+ "items": {
532
+ "type": "string"
533
+ },
534
+ "uniqueItems": true,
535
+ "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."
528
536
  }
529
537
  }
530
538
  },