Skip to content

Commit 1d38b8e

Browse files
authored
feat: add regulatory compatibility roadmap (#13)
1 parent b59b54a commit 1d38b8e

12 files changed

+471
-91
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ Local Optimization with Overflow Protocol. A federated circular economy concept
1414
- `schemas/`: JSON Schema definitions.
1515
- `examples/`: sample payloads for interop.
1616
- `contexts/`: JSON-LD contexts.
17+
- `docs/regulatory-alignment-roadmap.md`: long-horizon EU and German compatibility plan.
1718
- `rfcs/`: RFCs and design notes.
1819

1920
## Quickstart

SPECIFICATION.md

Lines changed: 26 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -167,7 +167,9 @@ This subsection defines the smallest interoperable flow required for lab-only de
167167

168168
#### Required entities
169169

170-
All payloads MUST include `@context`, `@type`, and `schema_version` set to `0.1.1`.
170+
All payloads MUST include `@context`, `@type`, and `schema_version`.
171+
Emitters targeting the v0.1.1 baseline MUST set `schema_version` to `0.1.1`.
172+
Receivers SHOULD accept additive `0.1.x` patch-line versions when unknown fields can be preserved or ignored without data loss.
171173

172174
- **MaterialDNA**
173175
Schema: `https://local-loop-io.github.io/projects/loop-protocol/schemas/v0.1.1/material-dna.schema.json`
@@ -182,6 +184,16 @@ All payloads MUST include `@context`, `@type`, and `schema_version` set to `0.1.
182184

183185
To remain GDPR-aligned for lab demos, payloads **MUST NOT** include personal data. Node identifiers, city names, and organization identifiers are permitted; emails, phone numbers, and names are not permitted in these entities.
184186

187+
#### Additive compatibility extensions
188+
189+
To improve forward compatibility with emerging regulatory data requirements, implementations MAY attach additive extension blocks such as `passport`, `classification`, and `traceability`.
190+
These extensions:
191+
192+
- MUST remain optional in the v0.1.1 baseline
193+
- MUST NOT weaken the data-minimization rule above
194+
- SHOULD use the canonical JSON-LD context or explicit namespaced terms
195+
- SHOULD preserve unknown fields when relaying payloads between nodes
196+
185197
---
186198

187199
## 4. MaterialDNA Specification
@@ -785,7 +797,7 @@ Nodes maintain a registry of peers:
785797
"id": "munich.loop",
786798
"endpoint": "https://munich.loop/api/v1",
787799
"public_key": "-----BEGIN PUBLIC KEY-----...",
788-
"capabilities": ["v0.1", "loopcoin", "loopsignal"],
800+
"capabilities": ["interop-v0.1.1", "loopcoin", "loopsignal"],
789801
"location": {"lat": 48.1351, "lon": 11.5820},
790802
"status": "active",
791803
"last_seen": "2025-05-27T15:00:00Z"
@@ -1078,40 +1090,18 @@ Goal: Submit to standards body (W3C, IETF) after v1.0
10781090

10791091
## Appendix A: JSON-LD Context
10801092

1081-
```json
1082-
{
1083-
"@context": {
1084-
"@version": 1.1,
1085-
"loop": "https://local-loop-io.github.io/projects/loop-protocol/contexts/loop-v0.1.1.jsonld/",
1086-
"schema": "https://schema.org/",
1087-
"MaterialDNA": "loop:MaterialDNA",
1088-
"LoopCoin": "loop:LoopCoin",
1089-
"LoopSignal": "loop:LoopSignal",
1090-
"LoopCost": "loop:LoopCost",
1091-
"id": "@id",
1092-
"type": "@type",
1093-
"category": {
1094-
"@id": "loop:category",
1095-
"@type": "@id"
1096-
},
1097-
"quantity": "loop:quantity",
1098-
"value": "schema:value",
1099-
"unit": "schema:unitText",
1100-
"quality": "loop:quality",
1101-
"location": "schema:location",
1102-
"lat": "schema:latitude",
1103-
"lon": "schema:longitude",
1104-
"available_from": {
1105-
"@id": "schema:availabilityStarts",
1106-
"@type": "schema:DateTime"
1107-
},
1108-
"expires": {
1109-
"@id": "schema:availabilityEnds",
1110-
"@type": "schema:DateTime"
1111-
}
1112-
}
1113-
}
1114-
```
1093+
The canonical JSON-LD context is published at:
1094+
1095+
`https://local-loop-io.github.io/projects/loop-protocol/contexts/loop-v0.1.1.jsonld`
1096+
1097+
Implementations MUST treat that file as the source of truth.
1098+
This appendix is intentionally brief to avoid drift between the specification text and the published context file.
1099+
1100+
Key properties of the canonical context:
1101+
1102+
- It defines stable mappings for the published v0.1.1 fields
1103+
- It sets `@vocab` to the LOOP terms namespace so additive fields expand predictably
1104+
- It keeps date-time fields typed for interoperable processing
11151105

11161106
---
11171107

contexts/loop-v0.1.1.jsonld

Lines changed: 72 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,15 @@
11
{
22
"@context": {
33
"@version": 1.1,
4-
"loop": "https://local-loop-io.github.io/projects/loop-protocol/contexts/",
4+
"@vocab": "https://local-loop-io.github.io/projects/loop-protocol/terms/",
5+
"loop": "https://local-loop-io.github.io/projects/loop-protocol/terms/",
56
"schema_version": "loop:schema_version",
67
"node_id": "loop:node_id",
78
"name": "loop:name",
8-
"endpoint": "loop:endpoint",
9+
"endpoint": {
10+
"@id": "loop:endpoint",
11+
"@type": "@id"
12+
},
913
"capabilities": "loop:capabilities",
1014
"timestamp": {
1115
"@id": "loop:timestamp",
@@ -17,22 +21,75 @@
1721
"Transfer": "loop:Transfer",
1822
"id": "@id",
1923
"category": "loop:category",
20-
"quantity": {
21-
"@id": "loop:quantity",
22-
"@type": "@id"
23-
},
24+
"quantity": "loop:quantity",
2425
"value": "loop:value",
2526
"unit": "loop:unit",
27+
"quality": "loop:quality",
2628
"origin_city": "loop:origin_city",
2729
"current_city": "loop:current_city",
30+
"location": "loop:location",
31+
"lat": "loop:lat",
32+
"lon": "loop:lon",
33+
"address": "loop:address",
2834
"available_from": {
2935
"@id": "loop:available_from",
3036
"@type": "http://www.w3.org/2001/XMLSchema#dateTime"
3137
},
38+
"expires": {
39+
"@id": "loop:expires",
40+
"@type": "http://www.w3.org/2001/XMLSchema#dateTime"
41+
},
3242
"available_until": {
3343
"@id": "loop:available_until",
3444
"@type": "http://www.w3.org/2001/XMLSchema#dateTime"
3545
},
46+
"certifications": "loop:certifications",
47+
"images": {
48+
"@id": "loop:images",
49+
"@type": "@id"
50+
},
51+
"metadata": "loop:metadata",
52+
"source": "loop:source",
53+
"batch_number": "loop:batch_number",
54+
"notes": "loop:notes",
55+
"passport": "loop:passport",
56+
"passport_id": "loop:passport_id",
57+
"passport_url": {
58+
"@id": "loop:passport_url",
59+
"@type": "@id"
60+
},
61+
"backup_copy_url": {
62+
"@id": "loop:backup_copy_url",
63+
"@type": "@id"
64+
},
65+
"passport_status": "loop:passport_status",
66+
"data_carrier_id": "loop:data_carrier_id",
67+
"issuer": "loop:issuer",
68+
"access_scope": "loop:access_scope",
69+
"supported_regimes": "loop:supported_regimes",
70+
"classification": "loop:classification",
71+
"ewc_code": "loop:ewc_code",
72+
"hs_code": "loop:hs_code",
73+
"cn_code": "loop:cn_code",
74+
"battery_category": "loop:battery_category",
75+
"traceability": "loop:traceability",
76+
"batch_id": "loop:batch_id",
77+
"serial_number": "loop:serial_number",
78+
"lot_number": "loop:lot_number",
79+
"source_operator_id": "loop:source_operator_id",
80+
"facility_id": "loop:facility_id",
81+
"retention_until": {
82+
"@id": "loop:retention_until",
83+
"@type": "http://www.w3.org/2001/XMLSchema#dateTime"
84+
},
85+
"document_refs": {
86+
"@id": "loop:document_refs",
87+
"@type": "@id"
88+
},
89+
"due_diligence_ref": "loop:due_diligence_ref",
90+
"material_id": "loop:material_id",
91+
"offer_id": "loop:offer_id",
92+
"match_id": "loop:match_id",
3693
"from_city": "loop:from_city",
3794
"to_city": "loop:to_city",
3895
"status": "loop:status",
@@ -47,6 +104,14 @@
47104
"received_at": {
48105
"@id": "loop:received_at",
49106
"@type": "http://www.w3.org/2001/XMLSchema#dateTime"
50-
}
107+
},
108+
"updated_at": {
109+
"@id": "loop:updated_at",
110+
"@type": "http://www.w3.org/2001/XMLSchema#dateTime"
111+
},
112+
"reason": "loop:reason",
113+
"source_node": "loop:source_node",
114+
"route": "loop:route",
115+
"mode": "loop:mode"
51116
}
52117
}

docs/implementation-guide.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# Implementation Guide
22

3-
This guide summarizes the minimum steps to build a compliant LOOP node. For normative requirements, follow `SPECIFICATION.md`.
3+
This guide summarizes the minimum steps to build a compatibility-oriented LOOP lab node. For normative requirements, follow `SPECIFICATION.md`.
44

55
## Minimum viable node
66
- HTTPS server with TLS 1.3+ and valid certificates.
Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
1+
# Regulatory Alignment Roadmap
2+
3+
LocalLoop remains a lab-demo project with no public pilots or production deployments.
4+
This roadmap is a compatibility plan, not a certification claim and not legal advice.
5+
6+
## Why this roadmap exists
7+
8+
The LOOP Protocol now needs to stay additive and interoperable as EU product, packaging, battery, and waste-traceability rules become more digital.
9+
The immediate goal is to make v0.1.1 payloads easier to extend without breaking existing lab integrations.
10+
11+
## Current baseline
12+
13+
- `v0.1.1` remains the emitter baseline for minimal interop payloads.
14+
- Receivers should accept additive `0.1.x` patch releases when they can preserve or safely ignore unknown fields.
15+
- Minimal interop payloads must stay free of personal contact data.
16+
- Passport, classification, and traceability blocks are optional extension points, not required fields.
17+
18+
## Regulatory signals to track
19+
20+
### EU ESPR and Digital Product Passport
21+
22+
- Regulation (EU) 2024/1781 entered into force on July 18, 2024.
23+
- The regulation establishes the Digital Product Passport framework and requires delegated acts to define product-specific rules.
24+
- The first ESPR Working Plan for 2025-2030 prioritizes product groups including textiles, furniture, tyres, mattresses, iron and steel, and aluminium.
25+
- Implication for LocalLoop:
26+
use additive passport identifiers, access-scope metadata, classification hints, and stable traceability references without hard-coding product-specific delegated-act fields too early.
27+
28+
### EU Batteries Regulation
29+
30+
- Regulation (EU) 2023/1542 entered into force on August 17, 2023.
31+
- Digital battery passport obligations start applying from February 18, 2027 for light means of transport, industrial batteries above 2 kWh, and electric-vehicle batteries.
32+
- Implication for LocalLoop:
33+
support passport IDs, battery category hints, due-diligence references, retention metadata, and role-based access boundaries.
34+
35+
### EU Packaging and Packaging Waste Regulation
36+
37+
- Regulation (EU) 2025/40 entered into force on February 11, 2025 and applies from August 12, 2026, with later phased obligations.
38+
- Reusable transport packaging and grouped packaging will increasingly rely on harmonized identification and data-carrier requirements.
39+
- Implication for LocalLoop:
40+
preserve packaging identifiers, reusable-loop references, and document links without assuming a single passport format yet.
41+
42+
### EU Waste Shipment and Traceability
43+
44+
- Regulation (EU) 2024/1157 entered into force on May 20, 2024.
45+
- The move toward electronic documentation and stricter cross-border controls makes evidence references and retention windows more important.
46+
- Implication for LocalLoop:
47+
keep document references, facility IDs, operator IDs, and retention dates attachable to material records and transfer events.
48+
49+
### Germany National Circular Economy Strategy
50+
51+
- Germany adopted the National Circular Economy Strategy in December 2024.
52+
- The strategy emphasizes digital product information, reuse, repair, municipal circularity, and better data availability across value chains.
53+
- Implication for LocalLoop:
54+
keep municipal-node interoperability, reusable material identity, and digital passport alignment as first-class design goals.
55+
56+
### GDPR and green claims governance
57+
58+
- GDPR Article 5 requires personal data to be adequate, relevant, and limited to what is necessary.
59+
- Directive (EU) 2024/825 on empowering consumers for the green transition tightens how sustainability claims can be presented.
60+
- The Green Claims proposal remains in legislative process as of March 7, 2026.
61+
- Implication for LocalLoop:
62+
do not present protocol metadata as proof of compliance or environmental performance unless the required evidence and verification model exists.
63+
64+
## Delivery plan
65+
66+
### Horizon 1: now to 90 days
67+
68+
- Accept `application/ld+json` end-to-end in the backend.
69+
- Remove PII-bearing fields from minimal interop payloads.
70+
- Publish canonical versioned schema paths in the site mirror.
71+
- Expand the JSON-LD context so additive fields expand predictably.
72+
- Add sync and validation checks so protocol, backend copies, and site mirrors cannot silently drift.
73+
74+
### Horizon 2: 3 to 12 months
75+
76+
- Introduce profile-based extension guidance for battery, packaging, and waste-shipment use cases.
77+
- Model access scopes for public, operator, and regulator-visible passport data.
78+
- Add retention-policy and evidence-reference guidance for transfer and status events.
79+
- Map current LOOP categories to product and waste classifications without freezing product-specific delegated-act structures too early.
80+
81+
### Horizon 3: 12 to 24 months
82+
83+
- Add conformance tests for additive patch releases and profile-specific extensions.
84+
- Prototype adapter layers for battery passport and DPP service-provider integrations once implementing acts mature.
85+
- Add reusable packaging and municipal reuse scenarios to lab flows.
86+
87+
### Horizon 4: 24 months and beyond
88+
89+
- Track product-specific delegated acts and standards as they are adopted.
90+
- Promote stable extension profiles into normative schema modules only when rules are sufficiently concrete.
91+
- Add machine-readable evidence and verification models before making any compliance-facing product claims.
92+
93+
## Design guardrails
94+
95+
- Preserve backward compatibility by keeping the v0.1.1 baseline payloads valid.
96+
- Preserve forward compatibility by allowing additive patch-line versions and unknown extension fields.
97+
- Keep regulated or sensitive attributes optional until a delegated act or standard makes them precise enough to model safely.
98+
- Avoid embedding personal data in shared protocol payloads.
99+
- Separate interoperability readiness from legal compliance claims in every public-facing document.
100+
101+
## Official sources
102+
103+
- ESPR Regulation (EU) 2024/1781: https://eur-lex.europa.eu/eli/reg/2024/1781/oj/eng
104+
- ESPR Working Plan 2025-2030: https://environment.ec.europa.eu/publications/ecodesign-sustainable-products-and-energy-labelling-working-plan-2025-2030_en
105+
- Batteries Regulation (EU) 2023/1542: https://eur-lex.europa.eu/eli/reg/2023/1542/oj/eng
106+
- Packaging and Packaging Waste Regulation (EU) 2025/40: https://eur-lex.europa.eu/eli/reg/2025/40/oj/eng
107+
- Waste Shipment Regulation (EU) 2024/1157: https://eur-lex.europa.eu/eli/reg/2024/1157/oj/eng
108+
- Germany National Circular Economy Strategy: https://www.bmuv.de/en/topics/circular-economy/national-circular-economy-strategy
109+
- GDPR Regulation (EU) 2016/679: https://eur-lex.europa.eu/eli/reg/2016/679/oj/eng
110+
- Empowering Consumers for the Green Transition Directive (EU) 2024/825: https://eur-lex.europa.eu/eli/dir/2024/825/oj/eng
111+
- Green Claims proposal status page: https://eur-lex.europa.eu/legal-content/EN/HIS/?uri=CELEX:52023PC0166

examples/01-material-registration.json

Lines changed: 28 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,34 @@
2525
"images": [
2626
"https://example.com/material-photo.jpg"
2727
],
28-
"contact": {
29-
"name": "Munich Recycling Center",
30-
"email": "materials@munich.loop",
31-
"phone": "+49-89-123456"
28+
"passport": {
29+
"passport_id": "DPP-DE-MUC-2025-B847F3",
30+
"passport_url": "https://example.com/passports/DPP-DE-MUC-2025-B847F3",
31+
"backup_copy_url": "https://example.com/passports/DPP-DE-MUC-2025-B847F3/backup",
32+
"passport_status": "available",
33+
"data_carrier_id": "urn:epc:id:sgtin:426001.123456.2025B847F3",
34+
"issuer": "lab-hub.loop",
35+
"access_scope": "role-based",
36+
"supported_regimes": [
37+
"espr-dpp",
38+
"waste-shipment",
39+
"nkws"
40+
]
41+
},
42+
"classification": {
43+
"ewc_code": "15 01 02",
44+
"hs_code": "391510",
45+
"cn_code": "39151000"
46+
},
47+
"traceability": {
48+
"batch_id": "2025-W22-01",
49+
"source_operator_id": "munich-recycling-center",
50+
"facility_id": "munich-sort-line-02",
51+
"retention_until": "2030-06-03T10:00:00Z",
52+
"document_refs": [
53+
"https://example.com/documents/dispatch-note-2025-W22-01"
54+
],
55+
"due_diligence_ref": "DD-2025-PLASTIC-0042"
3256
},
3357
"metadata": {
3458
"source": "consumer-collection",

schemas/match.schema.json

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,13 @@
2828
"const": "Match"
2929
},
3030
"schema_version": {
31-
"description": "Schema version for the minimal interop flow",
31+
"description": "Schema version for the minimal interop flow. Emitters SHOULD use 0.1.1; receivers SHOULD accept additive 0.1.x patch releases.",
3232
"type": "string",
33-
"const": "0.1.1"
33+
"pattern": "^0\\.1\\.[1-9]\\d*$",
34+
"examples": [
35+
"0.1.1",
36+
"0.1.2"
37+
]
3438
},
3539
"id": {
3640
"description": "Match identifier",

0 commit comments

Comments
 (0)