|
16 | 16 | 3. [Protocol Overview](#3-protocol-overview) |
17 | 17 | 3.5. [Minimal Interop Flow v0.1.1](#35-minimal-interop-flow-v011) |
18 | 18 | 4. [MaterialDNA Specification](#4-materialdna-specification) |
| 19 | +4.5. [ProductDNA Specification](#45-productdna-specification) |
19 | 20 | 5. [LoopCoin Specification](#5-loopcoin-specification) |
20 | 21 | 6. [LoopSignal Specification](#6-loopsignal-specification) |
21 | 22 | 7. [LoopCost Calculation](#7-loopcost-calculation) |
@@ -95,6 +96,8 @@ The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "S |
95 | 96 |
|
96 | 97 | **MaterialDNA**: Globally unique identifier for any material item or batch |
97 | 98 |
|
| 99 | +**ProductDNA**: Globally unique identifier for a product or product batch, referencing constituent MaterialDNA entries |
| 100 | + |
98 | 101 | **LoopCoin (LC)**: Local digital currency with expiry properties |
99 | 102 |
|
100 | 103 | **LoopSignal**: Community-expressed preference percentage for material categories |
@@ -174,6 +177,8 @@ Payloads using `schema_version: "0.1.1"` remain valid against v0.2.0 schemas (ba |
174 | 177 |
|
175 | 178 | - **MaterialDNA** |
176 | 179 | Schema: `https://local-loop-io.github.io/projects/loop-protocol/schemas/v0.2.0/material-dna.schema.json` |
| 180 | +- **ProductDNA** |
| 181 | + Schema: `https://local-loop-io.github.io/projects/loop-protocol/schemas/v0.2.0/product-dna.schema.json` |
177 | 182 | - **Offer** |
178 | 183 | Schema: `https://local-loop-io.github.io/projects/loop-protocol/schemas/v0.2.0/offer.schema.json` |
179 | 184 | - **Match** |
@@ -317,6 +322,141 @@ electronics/ |
317 | 322 |
|
318 | 323 | --- |
319 | 324 |
|
| 325 | +## 4.5 ProductDNA Specification |
| 326 | + |
| 327 | +### 4.5.1 Overview |
| 328 | + |
| 329 | +ProductDNA represents the **product layer** in LOOP's two-tier hierarchy: materials compose products. While MaterialDNA tracks raw or processed materials (e.g., plastic-hdpe, metal-copper), ProductDNA tracks finished or semi-finished products (e.g., office desks, laptops) that contain those materials. |
| 330 | + |
| 331 | +This separation aligns with: |
| 332 | +- **EU ESPR (Art. 9-10)**: Digital Product Passports are defined at the product level |
| 333 | +- **UNTP ProductPassport**: Materials are nested inside product passports |
| 334 | +- **GS1/EPCIS**: Trade items (products) are the primary tracking unit |
| 335 | + |
| 336 | +### 4.5.2 Hierarchy |
| 337 | + |
| 338 | +``` |
| 339 | +MaterialDNA (composition layer) ProductDNA (product layer, DPP-facing) |
| 340 | + ├── category: plastic-hdpe ├── product_category: electronics-laptop |
| 341 | + ├── quantity: 2kg ├── material_ids: [DE-MUC-2025-PLASTIC-..., ...] |
| 342 | + ├── origin_city: Munich ├── condition: good |
| 343 | + └── passport (DPP fields) ├── passport (DPP fields, ESPR-aligned) |
| 344 | + └── lifecycle_stage: in-use |
| 345 | +``` |
| 346 | + |
| 347 | +A ProductDNA entry MAY reference zero or more MaterialDNA entries via `material_ids`. This composition link enables traceability from product to constituent materials. |
| 348 | + |
| 349 | +### 4.5.3 Identifier Format |
| 350 | + |
| 351 | +ProductDNA identifiers MUST follow this pattern: |
| 352 | + |
| 353 | +```bash |
| 354 | +PRD-{COUNTRY}-{CITY}-{YEAR}-{CATEGORY}-{UNIQUE} |
| 355 | +``` |
| 356 | + |
| 357 | +Where: |
| 358 | +- `PRD`: Fixed prefix identifying a product |
| 359 | +- `COUNTRY`: ISO 3166-1 alpha-2 code |
| 360 | +- `CITY`: Three-letter city code |
| 361 | +- `YEAR`: Four-digit year of registration |
| 362 | +- `CATEGORY`: Product category keyword |
| 363 | +- `UNIQUE`: Alphanumeric unique identifier (min 6 characters) |
| 364 | + |
| 365 | +Example: |
| 366 | +```bash |
| 367 | +PRD-DE-MUC-2025-DESK-F4A7B2 |
| 368 | +``` |
| 369 | + |
| 370 | +### 4.5.4 ProductDNA Object |
| 371 | + |
| 372 | +```json |
| 373 | +{ |
| 374 | + "@context": "https://local-loop-io.github.io/projects/loop-protocol/contexts/loop-v0.2.0.jsonld", |
| 375 | + "@type": "ProductDNA", |
| 376 | + "schema_version": "0.2.0", |
| 377 | + "id": "PRD-DE-MUC-2025-DESK-F4A7B2", |
| 378 | + "product_category": "furniture-office", |
| 379 | + "name": "Standing Desk — Ergotron WorkFit", |
| 380 | + "condition": "good", |
| 381 | + "quantity": { "value": 12, "unit": "piece" }, |
| 382 | + "origin_city": "Munich", |
| 383 | + "current_city": "Munich", |
| 384 | + "available_from": "2026-03-15T08:00:00Z", |
| 385 | + "manufacturer": "Ergotron", |
| 386 | + "model": "WorkFit-S", |
| 387 | + "manufacture_year": 2021, |
| 388 | + "functional_status": "fully-functional", |
| 389 | + "lifecycle_stage": "end-of-first-use", |
| 390 | + "material_ids": [ |
| 391 | + "DE-MUC-2025-METAL-4EB84C", |
| 392 | + "DE-MUC-2025-PLASTIC-96FE78" |
| 393 | + ] |
| 394 | +} |
| 395 | +``` |
| 396 | + |
| 397 | +### 4.5.5 Required Fields |
| 398 | + |
| 399 | +- `schema_version`: Schema version (0.2.0) |
| 400 | +- `id`: Unique ProductDNA identifier (PRD- prefix) |
| 401 | +- `product_category`: Standardized product category |
| 402 | +- `name`: Product name (2-200 characters) |
| 403 | +- `condition`: Physical condition (new, like-new, good, fair, poor, for-parts) |
| 404 | +- `quantity`: Amount and unit |
| 405 | +- `origin_city`: Registering city |
| 406 | +- `current_city`: Current custodian city |
| 407 | +- `available_from`: When product becomes available |
| 408 | + |
| 409 | +### 4.5.6 Product Categories |
| 410 | + |
| 411 | +``` |
| 412 | +furniture/ |
| 413 | + furniture-office # Office furniture |
| 414 | + furniture-residential # Residential furniture |
| 415 | + furniture-industrial # Industrial furniture |
| 416 | +
|
| 417 | +building/ |
| 418 | + building-structural # Structural building components |
| 419 | + building-fixture # Fixtures and fittings |
| 420 | + building-hvac # HVAC equipment |
| 421 | + building-electrical # Electrical installations |
| 422 | +
|
| 423 | +electronics/ |
| 424 | + electronics-computing # Computers and peripherals |
| 425 | + electronics-mobile # Mobile devices |
| 426 | + electronics-appliance # Household appliances |
| 427 | + electronics-components # Electronic components |
| 428 | +
|
| 429 | +textiles/ |
| 430 | + textile-garment # Garments and clothing |
| 431 | + textile-industrial # Industrial textiles |
| 432 | +
|
| 433 | +packaging/ |
| 434 | + packaging-reusable # Reusable packaging |
| 435 | +
|
| 436 | +vehicles/ |
| 437 | + vehicle-parts # Vehicle parts and components |
| 438 | +
|
| 439 | +equipment/ |
| 440 | + equipment-industrial # Industrial equipment |
| 441 | + equipment-medical # Medical equipment |
| 442 | +``` |
| 443 | + |
| 444 | +### 4.5.7 Offer/Match/Transfer with Products |
| 445 | + |
| 446 | +The Offer, Match, and Transfer schemas accept either `material_id` or `product_id`. At least one MUST be present. This allows the same lifecycle flow (Offer → Match → Transfer) to work for both materials and products. |
| 447 | + |
| 448 | +```json |
| 449 | +{ |
| 450 | + "@type": "Offer", |
| 451 | + "product_id": "PRD-DE-MUC-2025-DESK-F4A7B2", |
| 452 | + "from_city": "Munich", |
| 453 | + "to_city": "Berlin", |
| 454 | + ... |
| 455 | +} |
| 456 | +``` |
| 457 | + |
| 458 | +--- |
| 459 | + |
320 | 460 | ## 5. LoopCoin Specification |
321 | 461 |
|
322 | 462 | ### 5.1 Currency Properties |
@@ -1058,6 +1198,8 @@ POST munich.loop/api/v1/federate/offer |
1058 | 1198 | - Conformity claims model (UNTP-aligned) |
1059 | 1199 | - EPCIS event references and W3C VC pointers in traceability blocks |
1060 | 1200 | - Schema versioning policy (RFC-0003) |
| 1201 | +- **ProductDNA schema** — product-level DPP entity referencing MaterialDNA composition |
| 1202 | +- Offer/Match/Transfer schemas accept `product_id` as alternative to `material_id` |
1061 | 1203 |
|
1062 | 1204 | ### 13.2 Future Features |
1063 | 1205 |
|
@@ -1141,6 +1283,10 @@ Key properties of the v0.2.0 context: |
1141 | 1283 | - Clarified dual license (MIT for code, CC BY-SA 4.0 for prose) |
1142 | 1284 | - Established schema versioning policy (RFC-0003) |
1143 | 1285 | - Backend API paths aligned to `/api/v1/` |
| 1286 | +- Added ProductDNA schema (product-level DPP entity, ESPR Art. 9-10 aligned) |
| 1287 | +- Offer/Match/Transfer schemas now accept `product_id` as alternative to `material_id` (anyOf) |
| 1288 | +- Added product category enum (17 categories across furniture, building, electronics, textile, packaging, vehicle, equipment) |
| 1289 | +- Added ProductDNA term mappings to JSON-LD context |
1144 | 1290 |
|
1145 | 1291 | ### Version 0.1.1 (2025-12-20) |
1146 | 1292 |
|
|
0 commit comments