@tracepass/dpp-schemas 1.20.2 → 1.21.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.
package/README.md CHANGED
@@ -139,6 +139,30 @@ This is the one place those dates are kept. Copy that states them (the TracePass
139
139
  marketing site checks every sentence against this registry) and the templates' own
140
140
  `anticipated` flags follow it.
141
141
 
142
+ ## Planned acts
143
+
144
+ `instruments.json` also holds `plannedActs`: acts that are planned but **not adopted**,
145
+ keyed by a stable id (`espr-da-textiles`). Each entry records the act it would be adopted
146
+ under (`framework`, `article`), what it covers (`productGroup`, a plain name; any
147
+ qualification goes in `note`; and `kind`: `product-group`, `horizontal` or
148
+ `procedural`), its planning `stage`, and the planned adoption date with its precision:
149
+
150
+ | Source | `stage` | `planned.precision` |
151
+ |---|---|---|
152
+ | A Have Your Say initiative (`hysId`, `source.kind: hys`) | `planned` or `consultation` | `quarter` (the portal's planned period) |
153
+ | The ESPR working plan COM(2025) 187 only (`source.kind: working_plan`) | `not-scheduled` | `year` |
154
+ | Only the empowering article (`source.kind: act`) | `not-scheduled` | `none` (`date: null`) |
155
+
156
+ A planned date is the Commission's intention, never an obligation date: render a quarter
157
+ or a year as "planned", never as "from" or "by". When an act is adopted, its entry leaves
158
+ `plannedActs` in the same release that adds the act to `instruments`. `lastChecked` is
159
+ the day the entry was last read against its source. `npm run check:planned` enforces the
160
+ shape, and that a date says no more than its source does.
161
+
162
+ ```js
163
+ import instruments from "@tracepass/dpp-schemas/instruments.json" with { type: "json" };
164
+ ```
165
+
142
166
  ## Standards
143
167
 
144
168
  [`standards.json`](./standards.json) is a registry of the technical standards a field — or
@@ -358,6 +382,8 @@ runs it on every push:
358
382
  claims. It catches a field required under an act that mandates nothing, an article
359
383
  missing from the act it cites, duplicate fields, and one key with two units. See
360
384
  [`audit/README.md`](./audit/README.md).
385
+ - **Planned acts** (`scripts/check-planned-acts.mjs`): every `plannedActs` entry names
386
+ an instrument it is adopted under, and its planned date matches its source's precision.
361
387
 
362
388
  ## Recent changes
363
389
 
package/instruments.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
- "_note": "Canonical registry of the legal instruments and standards a template field may cite. `regulationRef.instrument` must be one of these keys. Every CELEX below was verified to resolve against the EU Publications Office RDF store (cdm:resource_legal_id_celex). Kinds: `legislation` binds; `standard` supports a presumption of conformity but binds nothing; `scheme` is voluntary; `national` is one member state's law; `specification` is not a reference at all.",
2
+ "_note": "Canonical registry of the legal instruments and standards a template field may cite. `regulationRef.instrument` must be one of these keys. Every CELEX below was verified to resolve against the EU Publications Office RDF store (cdm:resource_legal_id_celex). Kinds: `legislation` binds; `standard` supports a presumption of conformity but binds nothing; `scheme` is voluntary; `national` is one member state's law; `specification` is not a reference at all. `plannedActs` records acts that are planned but not adopted (an ESPR delegated act per product group, the DPP service-provider act, the CPR Art. 75(1) act): planning status and the planned adoption date with its precision (`quarter` from Have Your Say, `year` from the ESPR working plan COM(2025) 187, `none` when no plan states one). A planned date is the Commission's intention, never an obligation date; an entry is removed in the release that adds its adopted act to `instruments`.",
3
3
  "instruments": {
4
4
  "32023R1542": {
5
5
  "kind": "legislation",
@@ -870,6 +870,207 @@
870
870
  "annexesVerifiedFrom": "32026R1738"
871
871
  }
872
872
  },
873
+ "plannedActs": {
874
+ "espr-da-iron-steel": {
875
+ "framework": "32024R1781",
876
+ "article": "Art. 4",
877
+ "kind": "product-group",
878
+ "productGroup": "Iron and steel",
879
+ "stage": "planned",
880
+ "hysId": 17672,
881
+ "planned": {
882
+ "date": "2026-Q4",
883
+ "precision": "quarter",
884
+ "event": "adoption"
885
+ },
886
+ "source": {
887
+ "kind": "hys",
888
+ "url": "https://ec.europa.eu/info/law/better-regulation/have-your-say/initiatives/17672"
889
+ },
890
+ "lastChecked": "2026-10-09"
891
+ },
892
+ "espr-da-textiles": {
893
+ "framework": "32024R1781",
894
+ "article": "Art. 4",
895
+ "kind": "product-group",
896
+ "productGroup": "Apparel textiles",
897
+ "stage": "planned",
898
+ "hysId": 16116,
899
+ "planned": {
900
+ "date": "2027-Q1",
901
+ "precision": "quarter",
902
+ "event": "adoption"
903
+ },
904
+ "source": {
905
+ "kind": "hys",
906
+ "url": "https://ec.europa.eu/info/law/better-regulation/have-your-say/initiatives/16116"
907
+ },
908
+ "lastChecked": "2026-10-09"
909
+ },
910
+ "espr-da-aluminium": {
911
+ "framework": "32024R1781",
912
+ "article": "Art. 4",
913
+ "kind": "product-group",
914
+ "productGroup": "Aluminium",
915
+ "stage": "not-scheduled",
916
+ "planned": {
917
+ "date": "2027",
918
+ "precision": "year",
919
+ "event": "adoption"
920
+ },
921
+ "source": {
922
+ "kind": "working_plan",
923
+ "document": "COM(2025) 187",
924
+ "url": "https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=CELEX:52025DC0187"
925
+ },
926
+ "lastChecked": "2026-10-09"
927
+ },
928
+ "espr-da-tyres": {
929
+ "framework": "32024R1781",
930
+ "article": "Art. 4",
931
+ "kind": "product-group",
932
+ "productGroup": "Tyres",
933
+ "stage": "not-scheduled",
934
+ "planned": {
935
+ "date": "2027",
936
+ "precision": "year",
937
+ "event": "adoption"
938
+ },
939
+ "source": {
940
+ "kind": "working_plan",
941
+ "document": "COM(2025) 187",
942
+ "url": "https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=CELEX:52025DC0187"
943
+ },
944
+ "lastChecked": "2026-10-09"
945
+ },
946
+ "espr-da-furniture": {
947
+ "framework": "32024R1781",
948
+ "article": "Art. 4",
949
+ "kind": "product-group",
950
+ "productGroup": "Furniture",
951
+ "stage": "not-scheduled",
952
+ "planned": {
953
+ "date": "2028",
954
+ "precision": "year",
955
+ "event": "adoption"
956
+ },
957
+ "source": {
958
+ "kind": "working_plan",
959
+ "document": "COM(2025) 187",
960
+ "url": "https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=CELEX:52025DC0187"
961
+ },
962
+ "lastChecked": "2026-10-09"
963
+ },
964
+ "espr-da-mattresses": {
965
+ "framework": "32024R1781",
966
+ "article": "Art. 4",
967
+ "kind": "product-group",
968
+ "productGroup": "Mattresses",
969
+ "stage": "not-scheduled",
970
+ "planned": {
971
+ "date": "2029",
972
+ "precision": "year",
973
+ "event": "adoption"
974
+ },
975
+ "source": {
976
+ "kind": "working_plan",
977
+ "document": "COM(2025) 187",
978
+ "url": "https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=CELEX:52025DC0187"
979
+ },
980
+ "lastChecked": "2026-10-09"
981
+ },
982
+ "espr-horizontal-repairability": {
983
+ "framework": "32024R1781",
984
+ "article": "Art. 4",
985
+ "kind": "horizontal",
986
+ "productGroup": "Horizontal repairability",
987
+ "note": "The initiative names consumer electronics, small household appliances and light means of transport; the act will define its product scope.",
988
+ "stage": "planned",
989
+ "hysId": 17873,
990
+ "planned": {
991
+ "date": "2027-Q2",
992
+ "precision": "quarter",
993
+ "event": "adoption"
994
+ },
995
+ "source": {
996
+ "kind": "hys",
997
+ "url": "https://ec.europa.eu/info/law/better-regulation/have-your-say/initiatives/17873"
998
+ },
999
+ "lastChecked": "2026-10-09"
1000
+ },
1001
+ "espr-da-dishwashers": {
1002
+ "framework": "32024R1781",
1003
+ "article": "Art. 4",
1004
+ "kind": "product-group",
1005
+ "productGroup": "Household dishwashers",
1006
+ "stage": "planned",
1007
+ "hysId": 17874,
1008
+ "planned": {
1009
+ "date": "2027-Q3",
1010
+ "precision": "quarter",
1011
+ "event": "adoption"
1012
+ },
1013
+ "source": {
1014
+ "kind": "hys",
1015
+ "url": "https://ec.europa.eu/info/law/better-regulation/have-your-say/initiatives/17874"
1016
+ },
1017
+ "lastChecked": "2026-10-09"
1018
+ },
1019
+ "espr-da-washing-machines": {
1020
+ "framework": "32024R1781",
1021
+ "article": "Art. 4",
1022
+ "kind": "product-group",
1023
+ "productGroup": "Household washing machines and washer-dryers",
1024
+ "stage": "planned",
1025
+ "hysId": 17994,
1026
+ "planned": {
1027
+ "date": "2027-Q3",
1028
+ "precision": "quarter",
1029
+ "event": "adoption"
1030
+ },
1031
+ "source": {
1032
+ "kind": "hys",
1033
+ "url": "https://ec.europa.eu/info/law/better-regulation/have-your-say/initiatives/17994"
1034
+ },
1035
+ "lastChecked": "2026-10-09"
1036
+ },
1037
+ "espr-dppsp-da": {
1038
+ "framework": "32024R1781",
1039
+ "article": "Art. 11, third subparagraph",
1040
+ "kind": "procedural",
1041
+ "productGroup": "Digital product passport service providers",
1042
+ "note": "Not a product group: requirements for providers of passport services (ESPR Art. 11).",
1043
+ "stage": "planned",
1044
+ "hysId": 14382,
1045
+ "planned": {
1046
+ "date": "2026-Q4",
1047
+ "precision": "quarter",
1048
+ "event": "adoption"
1049
+ },
1050
+ "source": {
1051
+ "kind": "hys",
1052
+ "url": "https://ec.europa.eu/info/law/better-regulation/have-your-say/initiatives/14382"
1053
+ },
1054
+ "lastChecked": "2026-10-09"
1055
+ },
1056
+ "cpr-art75-da": {
1057
+ "framework": "32024R3110",
1058
+ "article": "Art. 75(1)",
1059
+ "kind": "procedural",
1060
+ "productGroup": "Construction products digital product passport system",
1061
+ "stage": "not-scheduled",
1062
+ "planned": {
1063
+ "date": null,
1064
+ "precision": "none",
1065
+ "event": "adoption"
1066
+ },
1067
+ "source": {
1068
+ "kind": "act",
1069
+ "url": "http://data.europa.eu/eli/reg/2024/3110/oj"
1070
+ },
1071
+ "lastChecked": "2026-10-09"
1072
+ }
1073
+ },
873
1074
  "nonLegislative": {
874
1075
  "_note": "References that are not EU legislation. A field may cite one, but it must carry the right `kind` so nothing implies a legal obligation.",
875
1076
  "standard": {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tracepass/dpp-schemas",
3
- "version": "1.20.2",
3
+ "version": "1.21.1",
4
4
  "description": "Machine-readable field specifications for EU Digital Product Passports (ESPR) — 13 product categories, 994 fields, each traced to the article of EU law that mandates it. Pure JSON, no dependencies.",
5
5
  "keywords": [
6
6
  "digital-product-passport",
@@ -25,7 +25,8 @@
25
25
  "exports": {
26
26
  ".": "./index.json",
27
27
  "./schema.json": "./schema.json",
28
- "./templates/*.json": "./templates/*.json"
28
+ "./templates/*.json": "./templates/*.json",
29
+ "./instruments.json": "./instruments.json"
29
30
  },
30
31
  "files": [
31
32
  "templates",
@@ -47,10 +48,12 @@
47
48
  "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)\"",
48
49
  "build:index": "node scripts/build-index.mjs",
49
50
  "check:index": "node scripts/build-index.mjs --check",
50
- "check": "npm run validate && npm run check:index && npm run check:standards && npm run check:locales && npm run check:audit && npm run test:audit",
51
+ "check": "npm run validate && npm run check:index && npm run check:standards && npm run check:locales && npm run check:audit && npm run test:audit && npm run check:planned && npm run test:planned",
51
52
  "check:standards": "node scripts/check-standards.mjs",
52
53
  "check:locales": "node scripts/check-locales.mjs",
53
54
  "check:audit": "node audit/audit.mjs",
54
- "test:audit": "node --test audit/self-test.mjs"
55
+ "test:audit": "node --test audit/self-test.mjs",
56
+ "check:planned": "node scripts/check-planned-acts.mjs",
57
+ "test:planned": "node --test scripts/check-planned-acts.test.mjs"
55
58
  }
56
59
  }