@tracepass/dpp-validate 0.8.0 → 0.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
@@ -3,7 +3,7 @@
3
3
 
4
4
  # @tracepass/dpp-validate
5
5
 
6
- **Evaluate an EU Digital Product Passport against its category field spec. Pure functions, no third-party runtime dependencies, 43 tests.**
6
+ **Evaluate an EU Digital Product Passport against its category field spec. Pure functions, no third-party runtime dependencies, 46 tests.**
7
7
 
8
8
  [![License](https://img.shields.io/badge/license-Apache--2.0-blue.svg)](../../LICENSE)
9
9
  [![Dependencies](https://img.shields.io/badge/third--party%20runtime%20deps-0-success)](#)
@@ -83,6 +83,28 @@ A `compliant` verdict means *this passport satisfies the rules encoded here* —
83
83
  product may be placed on the market*. Delegated acts are still landing. Verify against
84
84
  [EUR-Lex](https://eur-lex.europa.eu).
85
85
 
86
+ ## Battery identifier requirement (BAT-1)
87
+
88
+ The battery passport must carry a unique product identifier. Battery Regulation Art. 77(3)
89
+ requires ISO/IEC 15459 until a delegated act replaces it with EN 18219. A GS1 Digital Link
90
+ URI satisfies that requirement because GS1 is an ISO/IEC 15459 issuing agency. The BAT-1
91
+ fix text in findings explains this:
92
+
93
+ ```jsonc
94
+ {
95
+ "fix": "Provide identifier — an ISO/IEC 15459 unique identifier, e.g. a GS1 Digital Link URI
96
+ (Battery Regulation Art. 77(3) requires ISO/IEC 15459 until a delegated act replaces
97
+ it with EN 18219)."
98
+ }
99
+ ```
100
+
101
+ Plain-language background on the rules encoded here:
102
+
103
+ - [Holding data is not compliance](https://www.tracepass.eu/regulatory/holding-data-is-not-compliance)
104
+ — where DPP duties are actually discharged, and why the verdict is narrower than market placement.
105
+ - [Article 77 battery passport — Regulation (EU) 2023/1542](https://www.tracepass.eu/regulatory/battery-articles/article-77)
106
+ — the article behind the battery checks and applicability gates.
107
+
86
108
  ## License
87
109
 
88
110
  [Apache-2.0](../../LICENSE)
@@ -8,9 +8,12 @@
8
8
  * than asking a reviewer for data the regulation doesn't require.
9
9
  *
10
10
  * Derives from Regulation (EU) 2023/1542 (the EU Battery Regulation), Annex
11
- * XIII, and its per-category applicability matrix: EV batteries carry every
12
- * field; LMT omits the capacity-threshold-for-exhaustion field; industrial
13
- * batteries are conditional on BMS / rechargeable / external-storage gates.
11
+ * XIII, Art. 14(1) and Annex VII Parts A and B. EV batteries do NOT carry every
12
+ * field: the capacity threshold for exhaustion and the state of certified
13
+ * energy are EV-only, while the remaining-capacity and expected-lifetime sets
14
+ * apply to LMT batteries and stationary battery energy storage systems only.
15
+ * Industrial batteries are conditional on the BMS / rechargeable /
16
+ * external-storage / stationary-storage flags.
14
17
  *
15
18
  * Design contract — the SAFETY rule that makes A safe:
16
19
  * "unknown" (a gate's trigger field is absent) ⇒ treat as APPLIES for the
@@ -22,10 +25,10 @@
22
25
  * - batteryCategory — a real template field in battery.json (enum: LMT |
23
26
  * EV | industrial_gt_2kwh | industrial_lte_2kwh | SLI
24
27
  * | portable). Read from `passport.fields`.
25
- * - hasBMS, rechargeable, externalStorageOnly — tri-state booleans on
26
- * `passport.batteryProfile` (a separate block, NOT
27
- * template fields — deliberately outside the template
28
- * field set, so they do not inflate its count).
28
+ * - hasBMS, rechargeable, externalStorageOnly, isStationaryBess — tri-state
29
+ * booleans on `passport.batteryProfile` (a separate
30
+ * block, NOT template fields — deliberately outside the
31
+ * template field set, so they do not inflate its count).
29
32
  * Absent ⇒ the dependent gate resolves to
30
33
  * "unknown" (show + warn), not a guess.
31
34
  *
@@ -37,10 +40,6 @@ export type Applicability = "applies" | "not_applicable" | "unknown";
37
40
  * (BAT-1). Used only to keep this module self-contained; the passport-
38
41
  * level scope gate still lives in rules.ts BAT-1. */
39
42
  export declare const IN_SCOPE_BATTERY_CATEGORIES: readonly ["LMT", "EV", "industrial_gt_2kwh"];
40
- /** Field keys whose applicability is conditional, with a short reason +
41
- * the deck article they map to. Everything NOT listed here is always
42
- * "applies". Kept as data so the rules engine + editor can enumerate the
43
- * conditional set and so a reader can audit each gate against the deck. */
44
43
  export interface FieldGate {
45
44
  /** Battery template field keys this gate governs. */
46
45
  keys: string[];
@@ -48,6 +47,8 @@ export interface FieldGate {
48
47
  article: string;
49
48
  /** One-line reason, surfaced in the verdict + editor tooltip. */
50
49
  reason: string;
50
+ /** Extra remediation, for gates that turn on the stationary-storage flag. */
51
+ fixHint?: string;
51
52
  /** Decide applicability from the resolved trigger values. */
52
53
  decide(t: Triggers): Applicability;
53
54
  }
@@ -56,6 +57,7 @@ interface Triggers {
56
57
  hasBMS: boolean | undefined;
57
58
  rechargeable: boolean | undefined;
58
59
  externalStorageOnly: boolean | undefined;
60
+ isStationaryBess: boolean | undefined;
59
61
  }
60
62
  /**
61
63
  * The conditional gates, one per applicability rule from the deck. Order
@@ -1 +1 @@
1
- {"version":3,"file":"battery-applicability.d.ts","sourceRoot":"","sources":["../src/battery-applicability.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAkB,MAAM,sBAAsB,CAAC;AAErE,MAAM,MAAM,aAAa,GAAG,SAAS,GAAG,gBAAgB,GAAG,SAAS,CAAC;AAErE;;sDAEsD;AACtD,eAAO,MAAM,2BAA2B,8CAA+C,CAAC;AAExF;;;4EAG4E;AAC5E,MAAM,WAAW,SAAS;IACxB,qDAAqD;IACrD,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,6DAA6D;IAC7D,OAAO,EAAE,MAAM,CAAC;IAChB,iEAAiE;IACjE,MAAM,EAAE,MAAM,CAAC;IACf,6DAA6D;IAC7D,MAAM,CAAC,CAAC,EAAE,QAAQ,GAAG,aAAa,CAAC;CACpC;AAED,UAAU,QAAQ;IAChB,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B,MAAM,EAAE,OAAO,GAAG,SAAS,CAAC;IAC5B,YAAY,EAAE,OAAO,GAAG,SAAS,CAAC;IAClC,mBAAmB,EAAE,OAAO,GAAG,SAAS,CAAC;CAC1C;AAwBD;;;GAGG;AACH,eAAO,MAAM,mBAAmB,EAAE,SAAS,EAiE1C,CAAC;AAQF,4DAA4D;AAC5D,eAAO,MAAM,gBAAgB,EAAE,WAAW,CAAC,MAAM,CAA+B,CAAC;AAEjF;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,GAAG,aAAa,CAIjF;AAED;;;;;;;;GAQG;AACH,wBAAgB,yBAAyB,CACvC,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,MAAM,GACf,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAS/B;AAED,0EAA0E;AAC1E,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,CAE7D"}
1
+ {"version":3,"file":"battery-applicability.d.ts","sourceRoot":"","sources":["../src/battery-applicability.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAkB,MAAM,sBAAsB,CAAC;AAErE,MAAM,MAAM,aAAa,GAAG,SAAS,GAAG,gBAAgB,GAAG,SAAS,CAAC;AAErE;;sDAEsD;AACtD,eAAO,MAAM,2BAA2B,8CAA+C,CAAC;AAUxF,MAAM,WAAW,SAAS;IACxB,qDAAqD;IACrD,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,6DAA6D;IAC7D,OAAO,EAAE,MAAM,CAAC;IAChB,iEAAiE;IACjE,MAAM,EAAE,MAAM,CAAC;IACf,6EAA6E;IAC7E,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,6DAA6D;IAC7D,MAAM,CAAC,CAAC,EAAE,QAAQ,GAAG,aAAa,CAAC;CACpC;AAED,UAAU,QAAQ;IAChB,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B,MAAM,EAAE,OAAO,GAAG,SAAS,CAAC;IAC5B,YAAY,EAAE,OAAO,GAAG,SAAS,CAAC;IAClC,mBAAmB,EAAE,OAAO,GAAG,SAAS,CAAC;IACzC,gBAAgB,EAAE,OAAO,GAAG,SAAS,CAAC;CACvC;AAqDD;;;GAGG;AACH,eAAO,MAAM,mBAAmB,EAAE,SAAS,EAwH1C,CAAC;AAQF,4DAA4D;AAC5D,eAAO,MAAM,gBAAgB,EAAE,WAAW,CAAC,MAAM,CAA+B,CAAC;AAEjF;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,GAAG,aAAa,CAIjF;AAED;;;;;;;;GAQG;AACH,wBAAgB,yBAAyB,CACvC,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,MAAM,GACf,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAS/B;AAED,0EAA0E;AAC1E,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,CAE7D"}
@@ -8,9 +8,12 @@
8
8
  * than asking a reviewer for data the regulation doesn't require.
9
9
  *
10
10
  * Derives from Regulation (EU) 2023/1542 (the EU Battery Regulation), Annex
11
- * XIII, and its per-category applicability matrix: EV batteries carry every
12
- * field; LMT omits the capacity-threshold-for-exhaustion field; industrial
13
- * batteries are conditional on BMS / rechargeable / external-storage gates.
11
+ * XIII, Art. 14(1) and Annex VII Parts A and B. EV batteries do NOT carry every
12
+ * field: the capacity threshold for exhaustion and the state of certified
13
+ * energy are EV-only, while the remaining-capacity and expected-lifetime sets
14
+ * apply to LMT batteries and stationary battery energy storage systems only.
15
+ * Industrial batteries are conditional on the BMS / rechargeable /
16
+ * external-storage / stationary-storage flags.
14
17
  *
15
18
  * Design contract — the SAFETY rule that makes A safe:
16
19
  * "unknown" (a gate's trigger field is absent) ⇒ treat as APPLIES for the
@@ -22,10 +25,10 @@
22
25
  * - batteryCategory — a real template field in battery.json (enum: LMT |
23
26
  * EV | industrial_gt_2kwh | industrial_lte_2kwh | SLI
24
27
  * | portable). Read from `passport.fields`.
25
- * - hasBMS, rechargeable, externalStorageOnly — tri-state booleans on
26
- * `passport.batteryProfile` (a separate block, NOT
27
- * template fields — deliberately outside the template
28
- * field set, so they do not inflate its count).
28
+ * - hasBMS, rechargeable, externalStorageOnly, isStationaryBess — tri-state
29
+ * booleans on `passport.batteryProfile` (a separate
30
+ * block, NOT template fields — deliberately outside the
31
+ * template field set, so they do not inflate its count).
29
32
  * Absent ⇒ the dependent gate resolves to
30
33
  * "unknown" (show + warn), not a guess.
31
34
  *
@@ -35,6 +38,12 @@
35
38
  * (BAT-1). Used only to keep this module self-contained; the passport-
36
39
  * level scope gate still lives in rules.ts BAT-1. */
37
40
  export const IN_SCOPE_BATTERY_CATEGORIES = ["LMT", "EV", "industrial_gt_2kwh"];
41
+ /** Field keys whose applicability is conditional, with a short reason +
42
+ * the deck article they map to. Everything NOT listed here is always
43
+ * "applies". Kept as data so the rules engine + editor can enumerate the
44
+ * conditional set and so a reader can audit each gate against the deck. */
45
+ /** Remediation for the gates that depend on `isStationaryBess`. */
46
+ const SBESS_FIX_HINT = "For an industrial (>2 kWh) battery, confirm whether it is a stationary battery energy storage system: Art. 14 state-of-health and Annex VII expected-lifetime data apply only to stationary storage systems, LMT and (for state of health) EV batteries.";
38
47
  /**
39
48
  * Resolve a profile flag to a confirmed boolean. Only an `approved` flag
40
49
  * counts — a `pending_review` (AI-suggested, unconfirmed) flag resolves to
@@ -54,8 +63,42 @@ function readTriggers(passport) {
54
63
  hasBMS: confirmed(profile?.hasBMS),
55
64
  rechargeable: confirmed(profile?.rechargeable),
56
65
  externalStorageOnly: confirmed(profile?.externalStorageOnly),
66
+ isStationaryBess: confirmed(profile?.isStationaryBess),
57
67
  };
58
68
  }
69
+ /**
70
+ * Is this battery an Art. 14(1) subject (state-of-health / expected-lifetime
71
+ * data applies)? Art. 14(1) covers EV, LMT, and stationary battery energy
72
+ * storage systems — NOT other industrial batteries.
73
+ */
74
+ function art14Subject(t) {
75
+ if (t.category === undefined)
76
+ return undefined;
77
+ if (t.category === "EV" || t.category === "LMT")
78
+ return true;
79
+ if (t.category === "industrial_gt_2kwh")
80
+ return t.isStationaryBess;
81
+ return false;
82
+ }
83
+ /**
84
+ * Annex VII Part A + B applicability: applies for LMT; for industrial_gt_2kwh
85
+ * only when confirmed as a stationary BESS; not_applicable for EV and all
86
+ * other categories; unknown when category absent or isStationaryBess unset.
87
+ */
88
+ function sbessOrLmt(t) {
89
+ if (t.category === undefined)
90
+ return "unknown";
91
+ if (t.category === "LMT")
92
+ return "applies";
93
+ if (t.category === "industrial_gt_2kwh") {
94
+ if (t.isStationaryBess === true)
95
+ return "applies";
96
+ if (t.isStationaryBess === false)
97
+ return "not_applicable";
98
+ return "unknown";
99
+ }
100
+ return "not_applicable";
101
+ }
59
102
  /**
60
103
  * The conditional gates, one per applicability rule from the deck. Order
61
104
  * doesn't matter — each governs a disjoint set of field keys.
@@ -74,18 +117,20 @@ export const BATTERY_FIELD_GATES = [
74
117
  },
75
118
  },
76
119
  {
77
- // Deck 4(b): state of health (Art. 14) applies to stationary ESS / LMT
78
- // / EV batteries AND only if they have a battery management system.
79
- // We don't model "stationary ESS" as a distinct category, so we gate
80
- // on (in-scope category) AND (hasBMS). hasBMS absent ⇒ unknown.
120
+ // Annex XIII 4(b) / Art. 14(1): state of health applies to SBESS, LMT,
121
+ // and EV batteries with a BMS. A plain industrial battery that is NOT a
122
+ // stationary ESS does NOT owe state-of-health data.
81
123
  keys: ["stateOfHealth"],
82
124
  article: "Annex XIII 4(b) / Art. 14",
83
- reason: "State of health applies only to EV / LMT / stationary-storage batteries that have a battery management system (BMS).",
125
+ fixHint: SBESS_FIX_HINT,
126
+ reason: "State of health (Art. 14) applies only to stationary battery energy storage systems, LMT, and EV batteries that have a battery management system (BMS). A plain industrial (>2 kWh) battery that is not a stationary storage system does not owe this data.",
84
127
  decide: (t) => {
85
- if (t.category === undefined || t.hasBMS === undefined)
128
+ const a14 = art14Subject(t);
129
+ if (a14 === false || t.hasBMS === false)
130
+ return "not_applicable";
131
+ if (a14 === undefined || t.hasBMS === undefined)
86
132
  return "unknown";
87
- const inScope = IN_SCOPE_BATTERY_CATEGORIES.includes(t.category);
88
- return inScope && t.hasBMS ? "applies" : "not_applicable";
133
+ return "applies";
89
134
  },
90
135
  },
91
136
  {
@@ -120,15 +165,71 @@ export const BATTERY_FIELD_GATES = [
120
165
  "recycledContentLithium",
121
166
  "recycledContentNickel",
122
167
  "recycledContentDocumentation",
168
+ // Pre/post-consumer split-shares (Annex XIII 1(e)) carry the same gate
169
+ // as the combined figures above — external-storage-only batteries are exempt.
170
+ "preConsumerRecycledNickelShare",
171
+ "preConsumerRecycledCobaltShare",
172
+ "preConsumerRecycledLithiumShare",
173
+ "postConsumerRecycledNickelShare",
174
+ "postConsumerRecycledCobaltShare",
175
+ "postConsumerRecycledLithiumShare",
123
176
  ],
124
177
  article: "Annex XIII 1(e) / Art. 8",
125
- reason: "Recycled-content information does not apply to batteries with external storage only.",
178
+ reason: "Recycled-content information does not apply to industrial batteries with exclusively external storage.",
126
179
  decide: (t) => {
180
+ // Art. 8(1) exempts only "industrial batteries … except those with
181
+ // exclusively external storage"; EV and LMT batteries owe it regardless.
182
+ if (t.category !== undefined && t.category !== "industrial_gt_2kwh")
183
+ return "applies";
127
184
  if (t.externalStorageOnly === undefined)
128
185
  return "unknown";
129
186
  return t.externalStorageOnly ? "not_applicable" : "applies";
130
187
  },
131
188
  },
189
+ {
190
+ // Annex XIII 4(b) / Art. 14: state of certified energy (SOCE) applies
191
+ // only to electric-vehicle (EV) batteries.
192
+ keys: ["stateOfCertifiedEnergy"],
193
+ article: "Annex XIII 4(b) / Art. 14",
194
+ reason: "State of certified energy (SOCE) applies only to electric-vehicle (EV) batteries.",
195
+ decide: (t) => {
196
+ if (t.category === undefined)
197
+ return "unknown";
198
+ return t.category === "EV" ? "applies" : "not_applicable";
199
+ },
200
+ },
201
+ {
202
+ // Annex XIII 4(b) / Art. 14 / Annex VII Part A: remaining capacity /
203
+ // power capability, remaining round-trip efficiency, self-discharge
204
+ // evolution, pack ohmic resistance, and initial self-discharge rate apply
205
+ // only to SBESS and LMT batteries — NOT EV, and NOT plain industrial
206
+ // batteries that are not stationary storage systems.
207
+ keys: [
208
+ "remainingCapacity",
209
+ "remainingPowerCapability",
210
+ "remainingRoundTripEfficiency",
211
+ "evolutionOfSelfDischargeRate",
212
+ "currentInternalResistancePack",
213
+ "initialSelfDischargeRate",
214
+ ],
215
+ article: "Annex XIII 4(b) / Art. 14 / Annex VII Part A",
216
+ fixHint: SBESS_FIX_HINT,
217
+ reason: "Remaining capacity and related Annex VII Part A metrics apply only to LMT batteries and stationary battery energy storage systems.",
218
+ decide: sbessOrLmt,
219
+ },
220
+ {
221
+ // Annex XIII 4(b) / Art. 14 / Annex VII Part B: expected-lifetime
222
+ // parameters apply only to SBESS and LMT batteries.
223
+ keys: [
224
+ "capacityThroughput",
225
+ "energyThroughput",
226
+ "dateOfServiceEntry",
227
+ ],
228
+ article: "Annex XIII 4(b) / Art. 14 / Annex VII Part B",
229
+ fixHint: SBESS_FIX_HINT,
230
+ reason: "Expected-lifetime parameters (Annex VII Part B) apply only to LMT batteries and stationary battery energy storage systems.",
231
+ decide: sbessOrLmt,
232
+ },
132
233
  ];
133
234
  /** Pre-computed map from field key → the gate governing it. */
134
235
  const KEY_TO_GATE = new Map();
@@ -1 +1 @@
1
- {"version":3,"file":"battery-applicability.js","sourceRoot":"","sources":["../src/battery-applicability.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"battery-applicability.js","sourceRoot":"","sources":["../src/battery-applicability.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"rules.d.ts","sourceRoot":"","sources":["../src/rules.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAG/D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAapD;iFACiF;AACjF,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,IAAI,CAAC;CACX;AAED,kFAAkF;AAClF,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,CAAC,EAAE,WAAW,GAAG,iBAAiB,EAAE,CAAC;CACrF;AAoED,eAAO,MAAM,+BAA+B,eAAe,CAAC;AAC5D,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,IAAI,GAAG,OAAO,CAE3D;AAgUD;;;;;GAKG;AACH,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,EAAE,CAM/D,CAAC;AAEF,iEAAiE;AACjE,eAAO,MAAM,mBAAmB,EAAE,eAAe,EAAU,CAAC"}
1
+ {"version":3,"file":"rules.d.ts","sourceRoot":"","sources":["../src/rules.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAG/D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAapD;iFACiF;AACjF,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,IAAI,CAAC;CACX;AAED,kFAAkF;AAClF,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,CAAC,EAAE,WAAW,GAAG,iBAAiB,EAAE,CAAC;CACrF;AA6ED,eAAO,MAAM,+BAA+B,eAAe,CAAC;AAC5D,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,IAAI,GAAG,OAAO,CAE3D;AAmUD;;;;;GAKG;AACH,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,EAAE,CAM/D,CAAC;AAEF,iEAAiE;AACjE,eAAO,MAAM,mBAAmB,EAAE,eAAe,EAAU,CAAC"}
package/dist/rules.js CHANGED
@@ -32,6 +32,14 @@ function hasValue(passport, key) {
32
32
  function valueOf(passport, key) {
33
33
  return hasValue(passport, key) ? passport.fields[key].value : undefined;
34
34
  }
35
+ /** English label for `key` from the template, with the raw key in parentheses for
36
+ * traceability. Falls back to the raw key alone when the template has no matching
37
+ * field or no English label — so the message is always actionable. */
38
+ function fieldLabel(key, template) {
39
+ const field = template.fields.find((f) => f.key === key);
40
+ const en = field?.label?.en;
41
+ return en ? `${en} (${key})` : key;
42
+ }
35
43
  // ── CC-1 · cross-cutting EU economic-operator rule ──────────────────
36
44
  // Reg (EU) 2019/1020 Art. 4(1)+(2): a product may be placed on the
37
45
  // market only if there is an EU-established operator. When the
@@ -134,14 +142,11 @@ const BAT1 = {
134
142
  why: mandatory
135
143
  ? `This is an in-scope battery (${String(cat)}); a battery passport with its unique identifier is mandatory.`
136
144
  : `This is an in-scope battery (${String(cat)}); the battery passport becomes mandatory on 18 February 2027 (Art. 77(1)), and its unique identifier is not set yet.`,
137
- // Deliberately does NOT name a scheme. EN 18219 (unique identifiers)
138
- // is scheme-plural: a web-resolvable structured path such as a GS1
139
- // Digital Link URI is one permitted route among several, not the
140
- // mandated one. This rule also only checks PRESENCE — naming GS1 here
141
- // asserted a constraint the rule never verified and the standard does
142
- // not impose, which could push an implementer onto GS1 when their
143
- // scheme was already conformant.
144
- fix: `Provide ${key} — the battery passport's unique identifier, in one of the schemes EN 18219 permits for a product identifier.`,
145
+ // Battery Regulation Art. 77(3) requires ISO/IEC 15459; a GS1 Digital
146
+ // Link URI is one conformant form. DID, DOI and IEC 61406 are not
147
+ // 15459 identifiers, so they are not valid here until a delegated act
148
+ // replaces Art. 77(3)'s 15459 reference with EN 18219.
149
+ fix: `Provide ${key} — an ISO/IEC 15459 unique identifier, e.g. a GS1 Digital Link URI (Battery Regulation Art. 77(3) requires ISO/IEC 15459 until a delegated act replaces it with EN 18219).`,
145
150
  });
146
151
  }
147
152
  }
@@ -164,7 +169,7 @@ const BAT1 = {
164
169
  // applicability, so it stays additive and can't double-count.
165
170
  const BAT_APP = {
166
171
  id: "BAT-APP",
167
- run(passport) {
172
+ run(passport, template) {
168
173
  const findings = [];
169
174
  // Reuse the shared predicate so the verdict + editor read applicability
170
175
  // through ONE path (incl. the "pending AI flag = unknown" safety rule).
@@ -175,7 +180,11 @@ const BAT_APP = {
175
180
  if (verdict === "applies")
176
181
  continue;
177
182
  for (const key of gate.keys) {
178
- const filled = hasValue(passport, key);
183
+ // A value the platform wrote (a template or product default, a derived
184
+ // value) is not the user's entry: telling them to remove it, or to
185
+ // classify the battery to justify it, points at data they never gave.
186
+ const filled = hasValue(passport, key) && passport.fields[key].source !== "system";
187
+ const label = fieldLabel(key, template);
179
188
  if (verdict === "not_applicable" && filled) {
180
189
  findings.push({
181
190
  type: "invalid_format",
@@ -184,8 +193,8 @@ const BAT_APP = {
184
193
  regulation: "(EU) 2023/1542",
185
194
  article: gate.article,
186
195
  ruleId: "BAT-APP",
187
- why: `${key} is filled but doesn't apply to this battery — ${gate.reason}`,
188
- fix: `Remove ${key}, or correct the battery classification (batteryCategory / battery profile) if this field should apply.`,
196
+ why: `${label} is filled but doesn't apply to this battery — ${gate.reason}`,
197
+ fix: `Remove ${label}, or correct the battery classification (batteryCategory / battery profile).${gate.fixHint ? ` ${gate.fixHint}` : ""}`,
189
198
  });
190
199
  }
191
200
  else if (verdict === "unknown" && filled) {
@@ -196,8 +205,8 @@ const BAT_APP = {
196
205
  regulation: "(EU) 2023/1542",
197
206
  article: gate.article,
198
207
  ruleId: "BAT-APP",
199
- why: `${key} is filled, but whether it applies couldn't be confirmed — ${gate.reason}`,
200
- fix: "Set the battery classification (has-BMS / rechargeable / external-storage) so applicability can be confirmed.",
208
+ why: `${label} is filled, but whether it applies couldn't be confirmed — ${gate.reason}`,
209
+ fix: `Set the battery classification (has-BMS / rechargeable / external-storage / stationary-BESS) so applicability can be confirmed.${gate.fixHint ? ` ${gate.fixHint}` : ""}`,
201
210
  });
202
211
  }
203
212
  }
@@ -244,12 +253,13 @@ const BATTERY_NONNEGATIVE_FIELDS = [
244
253
  ];
245
254
  const BAT_VAL = {
246
255
  id: "BAT-VAL",
247
- run(passport) {
256
+ run(passport, template) {
248
257
  const findings = [];
249
258
  // (1a) percentages in [0, 100].
250
259
  for (const key of BATTERY_PERCENT_FIELDS) {
251
260
  const n = numberOf(passport, key);
252
261
  if (n !== undefined && (n < 0 || n > 100)) {
262
+ const label = fieldLabel(key, template);
253
263
  findings.push({
254
264
  type: "invalid_format",
255
265
  severity: "warning",
@@ -257,8 +267,8 @@ const BAT_VAL = {
257
267
  regulation: "(EU) 2023/1542",
258
268
  article: "Annex XIII",
259
269
  ruleId: "BAT-VAL",
260
- why: `${key} is ${n}, outside the valid 0–100% range.`,
261
- fix: `Correct ${key} to a percentage between 0 and 100.`,
270
+ why: `${label} is ${n}, outside the valid 0–100% range.`,
271
+ fix: `Correct ${label} to a percentage between 0 and 100.`,
262
272
  });
263
273
  }
264
274
  }
@@ -266,6 +276,7 @@ const BAT_VAL = {
266
276
  for (const key of BATTERY_NONNEGATIVE_FIELDS) {
267
277
  const n = numberOf(passport, key);
268
278
  if (n !== undefined && n < 0) {
279
+ const label = fieldLabel(key, template);
269
280
  findings.push({
270
281
  type: "invalid_format",
271
282
  severity: "warning",
@@ -273,8 +284,8 @@ const BAT_VAL = {
273
284
  regulation: "(EU) 2023/1542",
274
285
  article: "Art. 7",
275
286
  ruleId: "BAT-VAL",
276
- why: `${key} is ${n}; a carbon-footprint value cannot be negative.`,
277
- fix: `Correct ${key} to a non-negative value (kg CO2e/kWh).`,
287
+ why: `${label} is ${n}; a carbon-footprint value cannot be negative.`,
288
+ fix: `Correct ${label} to a non-negative value (kg CO2e/kWh).`,
278
289
  });
279
290
  }
280
291
  }
package/dist/rules.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"rules.js","sourceRoot":"","sources":["../src/rules.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"rules.js","sourceRoot":"","sources":["../src/rules.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tracepass/dpp-validate",
3
- "version": "0.8.0",
3
+ "version": "0.9.0",
4
4
  "description": "Evaluate an EU Digital Product Passport against its category field-spec — a three-tier compliance verdict with regulation-cited findings. Pure functions, no third-party runtime dependencies.",
5
5
  "keywords": [
6
6
  "digital-product-passport",
@@ -45,7 +45,7 @@
45
45
  "clean": "rm -rf dist"
46
46
  },
47
47
  "dependencies": {
48
- "@tracepass/dpp-types": "^0.8.0"
48
+ "@tracepass/dpp-types": "^0.9.0"
49
49
  },
50
50
  "devDependencies": {
51
51
  "typescript": "^5.6.3"