1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
//! [`LifeStatus`] — where a unit sits in its product life, per Annex XIII 4(c).
use ;
/// The product-life status of an individual battery.
///
/// ✅ COMPLIANCE-PIN: EU 2023/1542, Annex XIII point 4(c)
/// (OJ L 191, 28.7.2023, p. 109) — "information on the status of the battery,
/// defined as 'original', 'repurposed', 're-used', 'remanufactured' or
/// 'waste'".
///
/// # Not the same thing as `PassportStatus`
///
/// [`PassportStatus`](crate::status::PassportStatus) is a
/// **publication** lifecycle: draft, published, suspended, retired, superseded,
/// deactivated. This is a **product-life** status. They are orthogonal, and the
/// clearest case is a repurposed unit, whose passport is perfectly ordinarily
/// `Published` while its life status is `Repurposed`. Before this type existed
/// the change-of-status information the Regulation requires had nowhere to live.
///
/// # The list is closed
///
/// Point 4(c) enumerates the five values, so a sixth would be an invention
/// rather than an extension. In particular there is no "approaching end of
/// life": that phrase appears nowhere in Regulation (EU) 2023/1542, and an
/// earlier draft of the design note carried it in place of `'original'`.
///
/// # Not public
///
/// Point 4 sits under the heading "INFORMATION AND DATA RELATING TO AN
/// INDIVIDUAL BATTERY ACCESSIBLE ONLY TO PERSONS WITH A LEGITIMATE INTEREST",
/// so this field is classified
/// [`Disclosure::Individual`](crate::disclosure::Disclosure::Individual) in
/// [`PASSPORT_FIELD_DISCLOSURE`](crate::disclosure::PASSPORT_FIELD_DISCLOSURE).
/// That classification is load-bearing rather than decorative: the passport
/// policy's `default_disclosure` is `Public`, so an envelope field nobody
/// classifies is served to anonymous readers.
///
/// # Four of the five are set at create; one is not
///
/// Art. 77(7) makes each of the four second-life operations produce a **new**
/// passport, so a second-life unit is born already knowing its status.
/// `Waste` is the exception, and the difference is structural: Art. 77(7)'s
/// second subparagraph moves responsibility on a battery becoming waste and
/// mandates **no new passport**, while point 4(a) expects values reported "when
/// the battery is placed on the market and when it is subject to changes in its
/// status". A create-time-only field could therefore never reach `Waste` — one
/// of the five values the law enumerates.
///
/// The transition is nonetheless not a free patch: `lifeStatus` is in
/// [`PROTECTED_PATCH_FIELDS`](crate::ports::passport_repo::PROTECTED_PATCH_FIELDS),
/// so moving a published record to `Waste` is a new passport **version** via
/// `supersedes_id`, which keeps the signature honest and leaves an audit trail.
/// A dedicated port method would have had to re-sign the served body, which is a
/// version bump wearing a disguise.