Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion site/dpp-docs/src/content/docs/core/overview.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ cargo run
```

```text
valid against battery schema v2.8.0
valid against battery schema v2.10.0
signature verifies: true
```

Expand Down
14 changes: 14 additions & 0 deletions site/dpp-docs/src/data/instruments/crm-act-2024-1252.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
{
"id": "crm-act-2024-1252",
"title": "Critical Raw Materials Act — Regulation (EU) 2024/1252",
"celex": "32024R1252",
"kind": "adjacent",
"status": "adopted",
"currency": { "state": "consolidated", "asOf": "02024R1252-20240503", "checkedOn": "2026-10-08" },
"passport": {
"obligation": "includedIn",
"basis": "Regulation (EU) 2024/1252 Art. 28(6)"
},
"productGroups": [],
"notes": "Held as a record of what the act requires of a passport, not as a passport instrument. The word 'passport' occurs only in Art. 28(6), twice, and nowhere else in the Regulation:'For products referred to in paragraph 3 for which a product passport is required pursuant to another Union legal act, the information referred to in paragraph 4 shall be included in that product passport.' So the act creates no passport and displaces none, and it is not 'no passport' either: it owes content to the passport another act requires, which is what includedIn says. It was first filed as an act that defines a list of materials. Annexes I and II do supply the strategic and critical raw materials lists, which is why schema prose cites it, but Art. 28 is a disclosure duty. It binds a closed list of products: magnetic resonance imaging devices, wind energy generators, industrial robots, motor vehicles, light means of transport, cooling generators, heat pumps, electric motors including where integrated in other products (a motor there is one rated at 0,12 kW or more, Art. 2(47)), automatic washing machines, tumble driers, microwaves, vacuum cleaners and dishwashers. Art. 28(1): a conspicuous, legible, indelible label saying whether the product incorporates permanent magnets and of which of four types. Art. 28(3) and (4), where it does: a data carrier on or in the product, linked to a unique product identifier, giving access to the responsible person's name, trade name or trademark and postal address, each magnet's weight, location and chemical composition, the presence and type of coatings, glues and additives, and how to reach and remove every magnet safely. Art. 28(5) lets the magnet detail be replaced by the location and removal of the electric motors where the magnets are only in motors. Art. 28(7) puts accuracy and availability for at least the product's typical lifetime plus 10 years, including after an insolvency, on the person placing it on the market, at model level or, where units differ, batch or unit, open to repairers, recyclers, market surveillance and customs authorities. retentionYears is left unset because that period is relative to a lifetime and is not a number. Art. 28(8): where Union harmonisation legislation sets permanent-magnet recycling information requirements for a listed product, those apply in place of Art. 28. Art. 29 is a separate duty: a free-access website must show the recycled share of eight named elements where the magnets of types (i) to (iii) in a listed product weigh more than 0,2 kg. Art. 31 is not product content; it empowers footprint rules for the raw materials themselves. No product group in this catalog is on the Art. 28(1) list, so the instrument is deliberately unbound. The nearest case is Regulation (EU) 2026/1738, recorded with no vehicle group: motor vehicles are on the list, its vehicle passport must contain the Art. 11 information (Art. 13(2)(a)), Art. 11(1)(d) reaches parts and components containing what Art. 28(1)(b) refers to, and Annex VI point 2 lists the magnet types of e-drive motors. Its recital 37 calls those provisions the sector-specific implementation of the Critical Raw Materials Act while saying the Art. 28 labelling applies. Whether that displaces Art. 28(3) to (7) under Art. 28(8) is a legal reading this record does not make. Dates, as corrected: Art. 28(2) had the Commission adopt the labelling-format implementing act by 24 November 2025, not 2026 as first printed (Corrigendum 2024/90330), and Art. 28 applies two years after that act enters into force; from 24 May 2029 it applies to magnetic resonance imaging devices, motor vehicles and category L vehicles (Art. 28(10)). Art. 29(1) applies from 24 May 2027 or two years after its delegated act (due 24 May 2026), whichever is later, and Art. 29(6) gives those three product types five years from that act. Art. 28(12) empowers a delegated act listing Combined Nomenclature codes for the listed products. A Commission proposal to amend the Regulation, COM(2025) 946, would widen the Art. 28(1) list; it is a proposal and changes nothing recorded here. Text read: the Official Journal text of 3 May 2024 with Corrigenda 2024/90330 and 2024/90589. The consolidated text is the one to cite."
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
"obligation": "required",
"from": { "date": "2029-09-23", "basis": "sourced" }
},
"customerPersonalData": { "storage": "explicitConsentOnly", "provision": "Regulation (EU) 2026/405 Art. 22(h)" },
"productGroups": [
{
"productGroup": "detergent",
Expand Down
1 change: 1 addition & 0 deletions site/dpp-docs/src/data/instruments/espr.json
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
"passport": { "obligation": "required" },
"retentionYears": 10,
"retentionYearsBasis": "assumed",
"customerPersonalData": { "storage": "explicitConsentOnly", "provision": "Regulation (EU) 2024/1781 Art. 10(1)(e)" },
"productGroups": [
{
"productGroup": "textile",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
},
"retentionYears": 10,
"retentionYearsBasis": "sourced",
"customerPersonalData": { "storage": "explicitConsentOnly", "provision": "Regulation (EU) 2025/2509 Art. 20(10)" },
"productGroups": [
{
"productGroup": "toy",
Expand Down
2 changes: 1 addition & 1 deletion site/dpp-landing/core-source.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"_comment": "Provenance for everything this site vendors from dpp-core. One commit backs every source, so the product groups and the regulations on the site can never describe two different states of the library. `pnpm run sync:core` copies each source at this commit; `pnpm run check:core` fails the build when a vendored copy differs from it. Pinning to a commit rather than to core's main keeps this repository's CI deterministic: an unrelated merge in core cannot turn a pull request here red, and a change that must land in both repositories cannot deadlock on which merges first. Bumping the commit is a deliberate, reviewable line in a diff.",
"repository": "odal-node/dpp-core",
"commit": "b60317cf50b73a2e6c33d661654b7f288293f7a4",
"commit": "7f22658b1a75d37d269706ea0d8feb318ab940ce",
"sources": {
"product-groups": {
"path": "crates/dpp-domain/product-groups",
Expand Down
1 change: 1 addition & 0 deletions site/dpp-landing/src/components/ActCard.astro
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ const tone: Record<string, string> = {
expected: "bg-neutral-100 text-neutral-600 ring-neutral-200",
none: "bg-neutral-100 text-neutral-600 ring-neutral-200",
elsewhere: "bg-neutral-100 text-neutral-600 ring-neutral-200",
included: "bg-neutral-100 text-neutral-600 ring-neutral-200",
};
---

Expand Down
14 changes: 14 additions & 0 deletions site/dpp-landing/src/data/instruments/crm-act-2024-1252.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
{
"id": "crm-act-2024-1252",
"title": "Critical Raw Materials Act — Regulation (EU) 2024/1252",
"celex": "32024R1252",
"kind": "adjacent",
"status": "adopted",
"currency": { "state": "consolidated", "asOf": "02024R1252-20240503", "checkedOn": "2026-10-08" },
"passport": {
"obligation": "includedIn",
"basis": "Regulation (EU) 2024/1252 Art. 28(6)"
},
"productGroups": [],
"notes": "Held as a record of what the act requires of a passport, not as a passport instrument. The word 'passport' occurs only in Art. 28(6), twice, and nowhere else in the Regulation:'For products referred to in paragraph 3 for which a product passport is required pursuant to another Union legal act, the information referred to in paragraph 4 shall be included in that product passport.' So the act creates no passport and displaces none, and it is not 'no passport' either: it owes content to the passport another act requires, which is what includedIn says. It was first filed as an act that defines a list of materials. Annexes I and II do supply the strategic and critical raw materials lists, which is why schema prose cites it, but Art. 28 is a disclosure duty. It binds a closed list of products: magnetic resonance imaging devices, wind energy generators, industrial robots, motor vehicles, light means of transport, cooling generators, heat pumps, electric motors including where integrated in other products (a motor there is one rated at 0,12 kW or more, Art. 2(47)), automatic washing machines, tumble driers, microwaves, vacuum cleaners and dishwashers. Art. 28(1): a conspicuous, legible, indelible label saying whether the product incorporates permanent magnets and of which of four types. Art. 28(3) and (4), where it does: a data carrier on or in the product, linked to a unique product identifier, giving access to the responsible person's name, trade name or trademark and postal address, each magnet's weight, location and chemical composition, the presence and type of coatings, glues and additives, and how to reach and remove every magnet safely. Art. 28(5) lets the magnet detail be replaced by the location and removal of the electric motors where the magnets are only in motors. Art. 28(7) puts accuracy and availability for at least the product's typical lifetime plus 10 years, including after an insolvency, on the person placing it on the market, at model level or, where units differ, batch or unit, open to repairers, recyclers, market surveillance and customs authorities. retentionYears is left unset because that period is relative to a lifetime and is not a number. Art. 28(8): where Union harmonisation legislation sets permanent-magnet recycling information requirements for a listed product, those apply in place of Art. 28. Art. 29 is a separate duty: a free-access website must show the recycled share of eight named elements where the magnets of types (i) to (iii) in a listed product weigh more than 0,2 kg. Art. 31 is not product content; it empowers footprint rules for the raw materials themselves. No product group in this catalog is on the Art. 28(1) list, so the instrument is deliberately unbound. The nearest case is Regulation (EU) 2026/1738, recorded with no vehicle group: motor vehicles are on the list, its vehicle passport must contain the Art. 11 information (Art. 13(2)(a)), Art. 11(1)(d) reaches parts and components containing what Art. 28(1)(b) refers to, and Annex VI point 2 lists the magnet types of e-drive motors. Its recital 37 calls those provisions the sector-specific implementation of the Critical Raw Materials Act while saying the Art. 28 labelling applies. Whether that displaces Art. 28(3) to (7) under Art. 28(8) is a legal reading this record does not make. Dates, as corrected: Art. 28(2) had the Commission adopt the labelling-format implementing act by 24 November 2025, not 2026 as first printed (Corrigendum 2024/90330), and Art. 28 applies two years after that act enters into force; from 24 May 2029 it applies to magnetic resonance imaging devices, motor vehicles and category L vehicles (Art. 28(10)). Art. 29(1) applies from 24 May 2027 or two years after its delegated act (due 24 May 2026), whichever is later, and Art. 29(6) gives those three product types five years from that act. Art. 28(12) empowers a delegated act listing Combined Nomenclature codes for the listed products. A Commission proposal to amend the Regulation, COM(2025) 946, would widen the Art. 28(1) list; it is a proposal and changes nothing recorded here. Text read: the Official Journal text of 3 May 2024 with Corrigenda 2024/90330 and 2024/90589. The consolidated text is the one to cite."
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
"obligation": "required",
"from": { "date": "2029-09-23", "basis": "sourced" }
},
"customerPersonalData": { "storage": "explicitConsentOnly", "provision": "Regulation (EU) 2026/405 Art. 22(h)" },
"productGroups": [
{
"productGroup": "detergent",
Expand Down
1 change: 1 addition & 0 deletions site/dpp-landing/src/data/instruments/espr.json
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
"passport": { "obligation": "required" },
"retentionYears": 10,
"retentionYearsBasis": "assumed",
"customerPersonalData": { "storage": "explicitConsentOnly", "provision": "Regulation (EU) 2024/1781 Art. 10(1)(e)" },
"productGroups": [
{
"productGroup": "textile",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
},
"retentionYears": 10,
"retentionYearsBasis": "sourced",
"customerPersonalData": { "storage": "explicitConsentOnly", "provision": "Regulation (EU) 2025/2509 Art. 20(10)" },
"productGroups": [
{
"productGroup": "toy",
Expand Down
7 changes: 5 additions & 2 deletions site/dpp-landing/src/data/product-groups/battery.json
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,12 @@
"2.4.0",
"2.5.0",
"2.6.0",
"2.7.0"
"2.7.0",
"2.8.0",
"2.9.0",
"2.10.0"
],
"currentSchemaVersion": "2.7.0",
"currentSchemaVersion": "2.10.0",
"productCategories": [
"portable",
"industrial",
Expand Down
7 changes: 4 additions & 3 deletions site/dpp-landing/src/data/product-groups/electronics.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,10 @@
"1.1.0",
"1.2.0",
"1.3.0",
"1.4.0"
"1.4.0",
"1.5.0"
],
"currentSchemaVersion": "1.4.0",
"currentSchemaVersion": "1.5.0",
"productCategories": [
"smartphone",
"other-mobile-phone",
Expand All @@ -22,5 +23,5 @@
"criticalRawMaterials": "restricted"
},
"plugin": "product-group-electronics",
"notes": "v1.4.0 (current) replaces the mandatory gtin with productIdentifier, a union of the EN 18219:2026 clause 5 ID schemes; a v1.3.0 record is read forward by a lens that wraps its gtin as scheme 1. v1.3.0 adds repairabilityIndexInputs, the six Reg. (EU) 2023/1669 Annex IV point 5 parameters the enacted repairability index is computed from, and indexScopeExclusion for the Art. 1(a) and 1(b) carve-outs; it was absent from this list until v1.4.0 landed, though the schema has always been embedded. v1.2.0 narrows productCategory to exactly the four Reg. (EU) 2023/1670 Art. 1(1) device types — laptop/monitor/tv/server/router/charger/earphone/pcb/other are removed: none of them has a DPP obligation, in force or dated, under any EU instrument. v1.1.0 corrects repairabilityScore to the structured {overall, criteria} shape; v1.0.0 is kept for historical immutability, having declared repairabilityScore as a bare number."
"notes": "v1.5.0 (current) labels the name and countryOfOrigin of a critical raw material restricted, as the criticalRawMaterials array and the casNumber and weightGrams beside them already were; it changes no shape and no audience's view. v1.4.0 replaces the mandatory gtin with productIdentifier, a union of the EN 18219:2026 clause 5 ID schemes; a v1.3.0 record is read forward by a lens that wraps its gtin as scheme 1. v1.3.0 adds repairabilityIndexInputs, the six Reg. (EU) 2023/1669 Annex IV point 5 parameters the enacted repairability index is computed from, and indexScopeExclusion for the Art. 1(a) and 1(b) carve-outs; it was absent from this list until v1.4.0 landed, though the schema has always been embedded. v1.2.0 narrows productCategory to exactly the four Reg. (EU) 2023/1670 Art. 1(1) device types — laptop/monitor/tv/server/router/charger/earphone/pcb/other are removed: none of them has a DPP obligation, in force or dated, under any EU instrument. v1.1.0 corrects repairabilityScore to the structured {overall, criteria} shape; v1.0.0 is kept for historical immutability, having declared repairabilityScore as a bare number."
}
3 changes: 2 additions & 1 deletion site/dpp-landing/src/data/product-groups/mattress.json
Original file line number Diff line number Diff line change
Expand Up @@ -11,5 +11,6 @@
"svhcSubstances": "restricted",
"disassemblyInstructionsUrl": "restricted"
},
"notes": "Split out of furniture: the working plan selects mattresses separately, with their own ranking and adoption year. Schema is furniture v1.1.0 with productType removed and nothing added — no delegated act exists for either group, so neither field set is more than a best reading. No plugin is bound yet; furniture's would have to branch on a category that no longer exists."
"plugin": "product-group-mattress",
"notes": "Split out of furniture: the working plan selects mattresses separately, with their own ranking and adoption year. Schema is furniture v1.1.0 with productType removed and nothing added — no delegated act exists for either group, so neither field set is more than a best reading. The plugin is a group's own, not furniture's, because furniture's would have to branch on a category that no longer exists."
}
5 changes: 3 additions & 2 deletions site/dpp-landing/src/data/product-groups/textile.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,10 @@
"1.0.0",
"1.1.0",
"1.2.0",
"1.3.0"
"1.3.0",
"1.4.0"
],
"currentSchemaVersion": "1.3.0",
"currentSchemaVersion": "1.4.0",
"productCategories": [],
"disclosure": {
"svhcSubstances": "restricted",
Expand Down
15 changes: 13 additions & 2 deletions site/dpp-landing/src/lib/regulations.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,8 @@ type Basis = "sourced" | "assumed";
type Passport =
| { obligation: "required"; from?: { date: string; basis: Basis } }
| { obligation: "notRequired" }
| { obligation: "displacedBy"; system: string; basis?: string };
| { obligation: "displacedBy"; system: string; basis?: string }
| { obligation: "includedIn"; basis?: string };

type Binding = {
productGroup: string;
Expand Down Expand Up @@ -141,7 +142,7 @@ export function withPassportDates(text: string): string {

export type PassportView = {
/** Short state, for a chip. */
state: "required" | "not-yet-operable" | "undated" | "per-act" | "expected" | "none" | "elsewhere";
state: "required" | "not-yet-operable" | "undated" | "per-act" | "expected" | "none" | "elsewhere" | "included";
label: string;
/** One plain sentence expanding the label. */
detail: string;
Expand All @@ -162,6 +163,16 @@ export function passportView(i: Instrument): PassportView {
detail: `Its product information goes into ${SYSTEM[p.system] ?? p.system}, instead of a passport.`,
};
}
if (p.obligation === "includedIn") {
// The act creates no passport and displaces none: it owes content to the
// passport another act requires (CRM Act Art. 28(6)). Without this branch it
// would fall through to "undated" and read as a passport with no date.
return {
state: "included",
label: "Feeds other passports",
detail: "It creates no passport of its own, but where another act requires one, its information has to be included in it.",
};
}
if (i.status === "anticipated") {
return { state: "expected", label: "Expected", detail: "Not adopted yet. There is no text, so there is no date." };
}
Expand Down
Loading