File size: 225,073 Bytes
82d9553
 
 
 
 
 
 
 
 
 
 
 
bd56acd
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
82d9553
 
c7d5d98
 
 
 
 
 
 
82d9553
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
30e8503
 
 
 
 
 
 
b636dfd
 
 
 
 
 
 
 
 
 
 
 
 
30e8503
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
fbe4c36
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
cedc5cb
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
82d9553
 
30e8503
 
 
 
 
 
 
 
 
 
 
82d9553
 
 
 
30e8503
 
 
 
 
82d9553
 
 
cedc5cb
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4fb1dc8
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
08031d9
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2662738
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2ba75d6
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
e3fa964
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2de326a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
a354f2b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3d2958f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
bd56acd
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3c7b883
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
faf80ea
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
fc780fa
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6ea03da
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
bb5a0c1
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6ea03da
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
bb5a0c1
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
eb395ee
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
82d9553
 
4fb1dc8
 
cedc5cb
 
 
 
7d93fb8
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
c64ca4a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9fd6de6
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
c7d5d98
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
41a82cd
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
e44c7a4
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ab4b0fd
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
25432c8
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4e17cd1
a94f6b9
 
 
 
4e17cd1
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2cabcac
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
54b578c
 
 
 
 
 
 
 
 
e382bfa
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6627f14
 
 
 
 
 
 
 
 
 
 
 
 
edd5d5e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
075488b
43761b5
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
075488b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
60e7aaf
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2000281
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
a6c0af5
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
645d27e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
698401a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
86f3f93
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
f5f3fda
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4be2283
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
80003d7
 
 
 
 
 
 
 
24b7f13
 
 
 
 
 
 
 
 
 
 
 
b6d4319
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1cefc38
 
 
 
 
 
 
 
 
ba865a1
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
67d461d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4d3b32e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
34c30a6
 
 
 
 
 
 
 
 
 
 
 
 
 
60d65da
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
e4745d2
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
88db96b
 
 
 
 
 
 
 
 
 
e4aaa05
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3704c62
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
771168f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8e0e67b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
89df098
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
b8318dc
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8107fda
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
a85a987
 
 
 
 
 
4bc9676
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ead8fbc
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
1893
1894
1895
1896
1897
1898
1899
1900
1901
1902
1903
1904
1905
1906
1907
1908
1909
1910
1911
1912
1913
1914
1915
1916
1917
1918
1919
1920
1921
1922
1923
1924
1925
1926
1927
1928
1929
1930
1931
1932
1933
1934
1935
1936
1937
1938
1939
1940
1941
1942
1943
1944
1945
1946
1947
1948
1949
1950
1951
1952
1953
1954
1955
1956
1957
1958
1959
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970
1971
1972
1973
1974
1975
1976
1977
1978
1979
1980
1981
1982
1983
1984
1985
1986
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033
2034
2035
2036
2037
2038
2039
2040
2041
2042
2043
2044
2045
2046
2047
2048
2049
2050
2051
2052
2053
2054
2055
2056
2057
2058
2059
2060
2061
2062
2063
2064
2065
2066
2067
2068
2069
2070
2071
2072
2073
2074
2075
2076
2077
2078
2079
2080
2081
2082
2083
2084
2085
2086
2087
2088
2089
2090
2091
2092
2093
2094
2095
2096
2097
2098
2099
2100
2101
2102
2103
2104
2105
2106
2107
2108
2109
2110
2111
2112
2113
2114
2115
2116
2117
2118
2119
2120
2121
2122
2123
2124
2125
2126
2127
2128
2129
2130
2131
2132
2133
2134
2135
2136
2137
2138
2139
2140
2141
2142
2143
2144
2145
2146
2147
2148
2149
2150
2151
2152
2153
2154
2155
2156
2157
2158
2159
2160
2161
2162
2163
2164
2165
2166
2167
2168
2169
2170
2171
2172
2173
2174
2175
2176
2177
2178
2179
2180
2181
2182
2183
2184
2185
2186
2187
2188
2189
2190
2191
2192
2193
2194
2195
2196
2197
2198
2199
2200
2201
2202
2203
2204
2205
2206
2207
2208
2209
2210
2211
2212
2213
2214
2215
2216
2217
2218
2219
2220
2221
2222
2223
2224
2225
2226
2227
2228
2229
2230
2231
2232
2233
2234
2235
2236
2237
2238
2239
2240
2241
2242
2243
2244
2245
2246
2247
2248
2249
2250
2251
2252
2253
2254
2255
2256
2257
2258
2259
2260
2261
2262
2263
2264
2265
2266
2267
2268
2269
2270
2271
2272
2273
2274
2275
2276
2277
2278
2279
2280
2281
2282
2283
2284
2285
2286
2287
2288
2289
2290
2291
2292
2293
2294
2295
2296
2297
2298
2299
2300
2301
2302
2303
2304
2305
2306
2307
2308
2309
2310
2311
2312
2313
2314
2315
2316
2317
2318
2319
2320
2321
2322
2323
2324
2325
2326
2327
2328
2329
2330
2331
2332
2333
2334
2335
2336
2337
2338
2339
2340
2341
2342
2343
2344
2345
2346
2347
2348
2349
2350
2351
2352
2353
2354
2355
2356
2357
2358
2359
2360
2361
2362
2363
2364
2365
2366
2367
2368
2369
2370
2371
2372
2373
2374
2375
2376
2377
2378
2379
2380
2381
2382
2383
2384
2385
2386
2387
2388
2389
2390
2391
2392
2393
2394
2395
2396
2397
2398
2399
2400
2401
2402
2403
2404
2405
2406
2407
2408
2409
2410
2411
2412
2413
2414
2415
2416
2417
2418
2419
2420
2421
2422
2423
2424
2425
2426
2427
2428
2429
2430
2431
2432
2433
2434
2435
2436
2437
2438
2439
2440
2441
2442
2443
2444
2445
2446
2447
2448
2449
2450
2451
2452
2453
2454
2455
2456
2457
2458
2459
2460
2461
2462
2463
2464
2465
2466
2467
2468
2469
2470
2471
2472
2473
2474
2475
2476
2477
2478
2479
2480
2481
2482
2483
2484
2485
2486
2487
2488
2489
2490
2491
2492
2493
2494
2495
2496
2497
2498
2499
2500
2501
2502
2503
2504
2505
2506
2507
2508
2509
2510
2511
2512
2513
2514
2515
2516
2517
2518
2519
2520
2521
2522
2523
2524
2525
2526
2527
2528
2529
2530
2531
2532
2533
2534
2535
2536
2537
2538
2539
2540
2541
2542
2543
2544
2545
2546
2547
2548
2549
2550
2551
2552
2553
2554
2555
2556
2557
2558
2559
2560
2561
2562
2563
2564
2565
2566
2567
2568
2569
2570
2571
2572
2573
2574
2575
2576
2577
2578
2579
2580
2581
2582
2583
2584
2585
2586
2587
2588
2589
2590
2591
2592
2593
2594
2595
2596
2597
2598
2599
2600
2601
2602
2603
2604
2605
2606
2607
2608
2609
2610
2611
2612
2613
2614
2615
2616
2617
2618
2619
2620
2621
2622
2623
2624
2625
2626
2627
2628
2629
2630
2631
2632
2633
2634
2635
2636
2637
2638
2639
2640
2641
2642
2643
2644
2645
2646
2647
2648
2649
2650
2651
2652
2653
2654
2655
2656
2657
2658
2659
2660
2661
2662
2663
2664
2665
2666
2667
2668
2669
2670
2671
2672
2673
2674
2675
2676
2677
2678
2679
2680
2681
2682
2683
2684
2685
2686
2687
2688
2689
2690
2691
2692
2693
2694
2695
2696
2697
2698
2699
2700
2701
2702
2703
2704
2705
2706
2707
2708
2709
2710
2711
2712
2713
2714
2715
2716
2717
2718
2719
2720
2721
2722
2723
2724
2725
2726
2727
2728
2729
2730
2731
2732
2733
2734
2735
2736
2737
2738
2739
2740
2741
2742
2743
2744
2745
2746
2747
2748
2749
2750
2751
2752
2753
2754
2755
2756
2757
2758
2759
2760
2761
2762
2763
2764
2765
2766
2767
2768
2769
2770
2771
2772
2773
2774
2775
2776
2777
2778
2779
2780
2781
2782
2783
2784
2785
2786
2787
2788
2789
2790
2791
2792
2793
2794
2795
2796
2797
2798
2799
2800
2801
2802
2803
2804
2805
2806
2807
2808
2809
2810
2811
2812
2813
2814
2815
2816
2817
2818
2819
2820
2821
2822
2823
2824
2825
2826
2827
2828
2829
2830
2831
2832
2833
2834
2835
2836
2837
2838
2839
2840
2841
2842
2843
2844
2845
2846
2847
2848
2849
2850
2851
2852
2853
2854
2855
2856
2857
2858
2859
2860
2861
2862
2863
2864
2865
2866
2867
2868
2869
2870
2871
2872
2873
2874
2875
2876
2877
2878
2879
2880
2881
2882
2883
2884
2885
2886
2887
2888
2889
2890
2891
2892
2893
2894
2895
2896
2897
2898
2899
2900
2901
2902
2903
2904
2905
2906
2907
2908
2909
2910
2911
2912
2913
2914
2915
2916
2917
2918
2919
2920
2921
2922
2923
2924
2925
2926
2927
2928
2929
2930
2931
2932
2933
2934
2935
2936
2937
2938
2939
2940
2941
2942
2943
2944
2945
2946
2947
2948
2949
2950
2951
2952
2953
2954
2955
2956
2957
2958
2959
2960
2961
2962
2963
2964
2965
2966
2967
2968
2969
2970
2971
2972
2973
2974
2975
2976
2977
2978
2979
2980
2981
2982
2983
2984
2985
2986
2987
2988
2989
2990
2991
2992
2993
2994
2995
2996
2997
2998
2999
3000
3001
3002
3003
3004
3005
3006
3007
3008
3009
3010
3011
3012
3013
3014
3015
3016
3017
3018
3019
3020
3021
3022
3023
3024
3025
3026
3027
3028
3029
3030
3031
3032
3033
3034
3035
3036
3037
3038
3039
3040
3041
3042
3043
3044
3045
3046
3047
3048
3049
3050
3051
3052
3053
3054
3055
3056
3057
3058
3059
3060
3061
3062
3063
3064
3065
3066
3067
3068
3069
3070
3071
3072
3073
3074
3075
3076
3077
3078
3079
3080
3081
3082
3083
3084
3085
3086
3087
3088
3089
3090
3091
3092
3093
3094
3095
3096
3097
3098
3099
3100
3101
3102
3103
3104
3105
3106
3107
3108
3109
3110
3111
3112
3113
3114
3115
3116
3117
3118
3119
3120
3121
3122
3123
3124
3125
3126
3127
3128
3129
3130
3131
3132
3133
3134
3135
3136
3137
3138
3139
3140
3141
3142
3143
3144
3145
3146
3147
3148
3149
3150
3151
3152
3153
3154
3155
3156
3157
3158
3159
3160
3161
3162
3163
3164
3165
3166
3167
3168
3169
3170
3171
3172
3173
3174
3175
3176
3177
3178
3179
3180
3181
3182
3183
3184
3185
3186
3187
3188
3189
3190
3191
3192
3193
3194
3195
3196
3197
3198
3199
3200
3201
3202
3203
3204
3205
3206
3207
3208
3209
3210
3211
3212
3213
3214
3215
3216
3217
3218
3219
3220
3221
3222
3223
3224
3225
3226
3227
3228
3229
3230
3231
3232
3233
3234
3235
3236
3237
3238
3239
3240
3241
3242
3243
3244
3245
3246
3247
3248
3249
3250
3251
3252
3253
3254
3255
3256
3257
3258
3259
3260
3261
3262
3263
3264
3265
3266
3267
3268
3269
3270
3271
3272
3273
3274
3275
3276
3277
3278
3279
3280
3281
3282
3283
3284
3285
3286
3287
3288
3289
3290
3291
3292
3293
3294
3295
3296
3297
3298
3299
3300
3301
3302
3303
3304
3305
3306
3307
3308
3309
3310
3311
3312
3313
3314
3315
3316
3317
3318
3319
3320
3321
3322
3323
3324
3325
3326
3327
3328
3329
3330
3331
3332
3333
3334
3335
3336
3337
3338
3339
3340
3341
3342
3343
3344
3345
3346
3347
3348
3349
3350
3351
3352
3353
3354
3355
3356
3357
3358
3359
3360
3361
3362
3363
3364
3365
3366
3367
3368
3369
3370
3371
3372
3373
3374
3375
3376
3377
3378
3379
3380
3381
3382
3383
3384
3385
3386
3387
3388
3389
3390
3391
3392
3393
3394
3395
3396
3397
3398
3399
3400
3401
3402
3403
3404
3405
3406
3407
3408
3409
3410
3411
3412
3413
3414
3415
3416
3417
3418
3419
3420
3421
3422
3423
3424
3425
3426
3427
3428
3429
3430
3431
3432
3433
3434
3435
3436
3437
3438
3439
3440
3441
3442
3443
3444
3445
3446
3447
3448
3449
3450
3451
3452
3453
3454
3455
3456
3457
3458
3459
3460
3461
3462
3463
3464
3465
3466
3467
3468
3469
3470
3471
3472
3473
3474
3475
3476
3477
3478
3479
3480
3481
3482
3483
3484
3485
3486
3487
3488
3489
3490
3491
3492
3493
3494
3495
3496
3497
3498
3499
3500
3501
3502
3503
3504
3505
3506
3507
3508
3509
3510
3511
3512
3513
3514
3515
3516
3517
3518
3519
3520
3521
3522
3523
3524
3525
3526
3527
3528
3529
3530
3531
3532
3533
3534
3535
3536
3537
3538
3539
3540
3541
3542
3543
3544
3545
3546
3547
3548
3549
3550
3551
3552
3553
3554
3555
3556
3557
3558
3559
3560
3561
3562
3563
3564
3565
3566
3567
3568
3569
3570
3571
3572
3573
3574
3575
3576
3577
3578
3579
3580
3581
3582
3583
3584
3585
3586
3587
3588
3589
3590
3591
3592
3593
3594
3595
3596
3597
3598
3599
3600
3601
3602
3603
3604
3605
3606
3607
3608
3609
3610
3611
3612
3613
3614
3615
3616
3617
3618
3619
3620
3621
3622
3623
3624
3625
3626
3627
3628
3629
3630
3631
3632
3633
3634
3635
3636
3637
3638
3639
3640
3641
3642
3643
3644
3645
3646
3647
3648
3649
3650
3651
3652
3653
3654
3655
3656
3657
3658
3659
3660
3661
3662
3663
3664
3665
3666
3667
3668
3669
3670
3671
3672
3673
3674
3675
3676
3677
3678
3679
3680
3681
3682
3683
3684
3685
3686
3687
3688
3689
3690
3691
3692
3693
3694
3695
3696
3697
3698
3699
3700
3701
3702
3703
3704
3705
3706
3707
3708
3709
3710
3711
3712
3713
3714
3715
3716
3717
3718
3719
# Experiment history

Chronological record of everything tried, with the CV protocol and scores.
All numbers are mean `total_cost` per scenario from the official `evaluate_plan`
(lower is better).

## CV protocol

- **Unit**: (device, origin) pairs; an *origin* is a planning time-zero. Features
  use only data ≤ origin; the label is death within the 42-day window after it.
- **Walk-forward**: at every scored origin the model is refit on all pairs whose
  window *closed* before that origin (fully observed labels, built-in embargo).
- **Current protocol** (since the 2026-08-18 protocol change, after phase 10):
  champion selection on the merged **34-origin panel s_8–s_41** with
  repeated-split stability - accept a challenger only if selected in ≥60% of
  2000 random half-splits AND modal under blocked splits; the public
  leaderboard is the only remaining holdout and is spent deliberately.
- **Three-regime scorecard** (since phase 20): the panel alone samples one
  regime (native fleet, mature calibration, expensive false swaps). Standing
  additional blocks: **warm-up s_0–s_7** (cold-start calibration; where the
  phase-19 floor was proven) and **near-end s_42–s_47** (censored shipped
  truth - the same scoring the remote evaluator applies to a held-out split's
  near-end scenarios; where the phase-11/14 mechanisms are measured).
  Adoption of a deployment-regime mechanism requires: no panel regression
  (tie-aware selection stability) AND a win in its target regime block AND
  the regime being reachable by a local harness - "architecturally sound" is
  not sufficient (see the foreign-fleet floor, built and refuted within one
  day in phase 20). selection_stability counts decided splits only;
  summarize() reports late/early/ops components by default.
- **Other blocks**: warm-up s_0–s_7 (3–16 unique training deaths) is excluded
  from champion selection but scored since phase 17 for cold-start behavior;
  s_42–s_47 stay unscored (windows extend past data end 2026-07-31).
- **Historical blocks (phases 1–10)**: dev s_8–s_23 (all tuning) / test
  s_24–s_41 (counted looks only, ledger at the end); merged once 8 looks had
  spent the test block. Per-phase "dev"/"test" columns below refer to these.
- **Reference points** (test block): shipped example 6779 · defer-everything 2512
  · lowest-voltage-15 heuristic 2034 · oracle (true EOL) 186.
- **Protocols live in `batteryswap_example/cv.py`** (phase 40), not in `/tmp`:
  `all48` (full-fleet walk-forward, three-regime scorecard), `static` (the
  deployment gate - one foreign-fleet fit, no refits, ORDERING questions only),
  `screen` (offline model screen grouped by BATTERY, never by scenario or row).
  All three report ranking precision at the operating N beside the cost: cost
  alone cannot distinguish a change that reordered the list from one that only
  cut it deeper, and AUC 0.947 has already coexisted with recall 0.000.

## Phase 0 - understanding the problem

| finding | consequence |
|---|---|
| Plans past day 42 are dropped free (`evaluate.py`) | the decision is *swap in-window vs park*; ~9 of ~450 batteries/scenario matter |
| Penalty asymmetry 0.5/day early vs 10/day late | cost-optimal swap day ≈ 5th percentile of EOL distribution |
| Example model predicts constant 120d for every battery | its 43 in-window swaps are arbitrary; 8673 all-48 |
| Defer-everything scores 3325 all-48 (−62%) | the real bar for any model |
| Last in-band voltage: AUC 0.95, 100% coverage | age (install+2y) is useless: AUC 0.63, P@5=0.00 (survivorship: median alive age > median lifetime) |

## Phase 1 - first model lineage (v1, submitted 2026-08-17)

| step | dev | test | notes |
|---|---|---|---|
| voltage-k heuristic, k=15 | — | 2034 | beats defer 14/18; k tuned on cost, not precision |
| 72-config sweep: {rank-v, logistic, gbm, aft} × {onepd, sched, batch} × p\* × day-q | best 2580 (aft/batch/p0.35) | — | batch > sched > onepd for every model |
| logistic/batch, p\*=0.5 | 2473 | **1735** (look 1) | threshold minimum confirmed (0.35: 2678, 0.65: 2601, 0.8: 2989) |
| **diagnosis**: p42 scale drifts as training grows; at s_38–41 the 0.5 threshold includes 0 batteries while 5–7 die | | | fixed thresholds are structurally brittle |
| **topsum**: include top-N by p42, N = 0.8·Σp42 | 2502 | **1368** (look 2) | beats fixed on 15/18; **v1, public LB 1964.29 (rank 3)** |

Rejected in phase 1: AFT expected-cost planner (3182 dev - uncalibrated
probabilities), Platt calibration (+40–50 dev), GBM (behind logistic at every
data size).

## Phase 2 - features, expected cost, routing

| step | dev | test | notes |
|---|---|---|---|
| recall diagnostic | | | deaths ranked fine (median rank 13) but excluded; worst misses had NaN slopes (sparse traces) |
| +5 features (slope_lastk, drop_recent, below_frac, accel, n_30) | 2390 | — | window-free slope closes sparse-trace gap |
| ecday: include/park + swap day by expected cost under predicted day-distribution | 2327 | — | low-p batteries automatically scheduled later |
| **ecroute**: + local search over building-group days vs exact mobility simulator | **2197** | 1478 (look 3) | simulator reproduces evaluator to 0.000 after replicating its return-leg double-count quirk |
| tsroute hybrid (topsum inclusion + ecroute scheduling) | 2229 | 1502 (look 4) | tied on dev |
| physics: master discharge curve | | | validated: EOL = 2.40 V crossing (±0.034 across all 82 deaths), temp coeff +4.9 mV/°C; `tau_hat` AUC 0.927 alone but **redundant** with voltage features → rejected (2274 dev) |

## Phase 3 - training-data augmentation

| step | dev | test | notes |
|---|---|---|---|
| sudden-death check | | | only 2/79 deaths lack voltage droop → late_swap is recoverable |
| **synthetic origins** every 4 days back to Feb-2025 | tsroute **2126**, ecroute 2161 | 1476 (look 5) | positives at s_24: 253 → 688; recovers 3 deaths no scenario window covered |
| day-distribution blend toward uniform | 2174–2214 | — | rejected by dev |

## Phase 4 - error screen and targeted fixes

Error buckets on test (per origin): miss→emergency **718** · false-positive
early **340** · timing of caught deaths 41 (solved).

| step | dev | test | notes |
|---|---|---|---|
| **tau_projected** = C⁻¹(v_corr_last) − staleness | 2147 (neutral) | **1439** (look 6) | targets the 8 "dark" devices (staleness ~62d) = 25 of 60 misses; AUC 0.676 where model was blind |
| break-even top-up (include p42 ≥ 0.2) | 2487–2742 | — | rejected by dev |
| placement floor for uncertain inclusions | 2263 | — | rejected by dev |

**Recurring lesson**: every absolute-probability knob motivated by test-block
failures (blend, top-up, floor) was refuted on dev - the p42 scale shifts with
death prevalence. Only *scale-free* mechanisms survive: count-based inclusion,
ranks, physics projections.

## Phase 5 - spending the 30-minute runtime budget (current, fc9c286)

| step | dev | test | notes |
|---|---|---|---|
| within-day visit ordering fix (building/room sort) + merge-move search with restarts | 2120 | — | interleaved rows paid repeated building changes the search never saw |
| **logbag**: 15-fold bagged logistic | **2074** | **1398** (look 7) | variance reduction near the inclusion cutoff |
| aggressive challenger α=1.15 | — | 1516 (look 7) | leader-like profile (late 722/early 550); kept as `BATTERYSWAP_ALPHA` knob, not default |
| **adaptive runtime refit** (`submit.py`) | | | refits at every scenario origin on the target split's own self-masked history; honest all-48 train metric 2202; 280 s/split native; deadline guards → static-pickle fallback |

**Public leaderboard (2026-08-18, adaptive submission): 1767.87, rank 2** - v1 was
1964.29. Mobility+limits 315.9 now beats the leader astar's 334.6; the whole
remaining gap to astar (1652.6) is timing balance (our late/early 1296/156 vs
their 660/658). An α=1.15 change motivated by that profile was committed, then
reverted before submission: the local α sweep rejected it (see phase 6) -
selection stays on CV, not public feedback.

## Phase 6 - voltage-silent deaths (exploration, all rejected by CV)

Silent deaths are **fast plungers**, not a separate mechanism: all 16 deaths that
looked healthy 30d out (v_corr > 2.55) were at ~2.47 by 7d out and ~2.41 the day
before - the same 2.40 V crossing, compressed into ~3 weeks.

| candidate | evidence in isolation | dev CV | verdict |
|---|---|---|---|
| room/building failure clustering | AUC 0.52-0.54 (chance) | not attempted | dead on arrival |
| lifetime mean temperature | AUC 0.64; corr(lifetime, temp) 0.21 | not attempted | too weak alone |
| install-cohort clock (age - batch median lifetime) | **AUC 0.906** on silent pairs; batch explains ~90% of lifetime variance | 2074 -> 2279 (raw), 2433 (overdue-neutral encoding) | **rejected**: 14%/54% coverage - the no-information majority degrades the fit in every encoding |
| alpha re-sweep 0.7-1.3 (public-LB-motivated 1.15) | public late/early ratio 8 vs leaders' ~1 | minimum stays at **0.8** (2074; 1.15: 2219, losing 12/16 origins) | 1.15 reverted; late saturates ~1100 for alpha >= 1.15 - remaining misses are not an inclusion problem |

## Phase 7 - full coordinate sweep (nothing adopted; champion is a local optimum)

One-knob-at-a-time sweep around the champion, ~25 knob values across both axes.
Acceptance rule fixed in advance: adopt only if dev improves by >= 60 AND wins
>= 10/16 origins head-to-head. Full cartesian grids were ruled out: dev's
resolution is ~150 points (16 correlated origins), so a large grid guarantees
spurious winners.

| axis | best variant | Δ vs champion 2073.9 | verdict |
|---|---|---|---|
| bag count | 30 bags | −9.4 | closest of all; 6x short of the bar |
| search budget | restarts 4 / iters 120 | −0.4 | saturated |
| day-model GBR | dtrees=50 | −0.6 | insensitive |
| regularization | C=0.3 | +64.8 | C=1.0 confirmed (0.1: +148.6, 3.0: +76.7) |
| training set | dthaz (discrete-time hazard, open windows) | +15.4 | statistically tied while using a different likelihood and more data - the natural committee partner if one is ever wanted |
| recency weighting | half-life 240d | +30.7 | no drift-adaptation gain (120d: +99.7) |
| blends | logbag+gbm | +190.6 | GBM drags; blend_dh +1367.9 |
| routing-aware inclusion | tspig membership repair | +46.5 | right shape, does not pay at these travel costs |
| piggyback inclusion | tspig2 α₂=1.3 / 1.6 | +293.1 / +497.7 | over-includes |
| determined labels | logbag_open | +3080 (std 11k) | blows up at early origins - tiny determined sets |

Disclosures: `emergency_day` is structurally inert for tsroute (it prices parking,
which the count rule never consults); the q6 day-quantile grid is inert because
cost_curves reads only the four standard quantile columns (CDF-resolution axis
untested); `logbag_aux*` variants await their feature columns in the table.

**Conclusion**: every axis is flat or worse around the champion - remaining cost
is structural (fast-plunge deaths), not hyperparameters.

### Classifier-family addendum (RandomForest and friends)

| model | dev | Δ | note |
|---|---|---|---|
| RandomForest (500, leaf 5) | 2273.1 | +199 | ranks well (AUC 0.94 at s_23 vs logbag 0.85) but probabilities too compressed for topsum's count |
| RF deep (leaf 1, 1000) | 2325.9 | +252 | |
| RF class-balanced | 2890.2 | +816 | worst config ever tested - inflated Σp42 over-includes massively |
| ExtraTrees | 2245.3 | +171 | |
| MLP (32,16, early stop) | 2768.7 | +695 | |
| rank_rf hybrid (RF ranking, logbag scale - Σp42 preserved) | 2166.2 | +92 | RF's ranking edge does not transfer across origins even with the scale problem removed |

Complete p42-classifier ledger: logistic-family (champion), HGB/GBM x4,
Weibull AFT, discrete hazard (tied), RF x3, ExtraTrees, MLP, and five blends -
linear + bagging wins throughout. With ~1000 positives, one dominant monotone
signal (voltage level), and a planner that needs a stable probability scale,
that is the expected outcome.

## Phase 8 - the silent-death campaign (closed: unactionable within this data)

Target: the ~27 test-block misses with p42 < 0.10 - fast plungers whose voltage
collapse starts AFTER the planning origin.

Precursor screen (9 candidates, silent subpopulation = 11,599 healthy-voltage
pairs, 24 deaths): only volatility carries signal - rng_30 AUC 0.833, vstd_30
0.810; diurnal-amplitude drift 0.60, temp-sensitivity drift (beta) 0.57,
reading-rate change 0.58, low-side outliers and range-ratio ~ chance.

| attempt | dev | test | verdict |
|---|---|---|---|
| rng_30 + vstd_30 as global features | +17 | 1438.7 vs 1397.5 (worse) | rejected - signal diluted across the healthy majority |
| SilentFix override (blind-zone logistic re-ranks silent batteries only; count untouched, scale-free) | w=0.15 inert, w=0.3 +6, w=0.6 +38 | w=0.3: byte-identical plans (1397.5) | rejected - inert at safe weight, harmful at active weight |
| cohort clock (phases 6) | +205..+359 | - | rejected twice |
| inclusion expansion (alpha, p_be, floors) | all rejected | late saturates ~1100 regardless | not an inclusion problem |

**Why this is a wall, quantified**: blind-zone death prevalence is 24/11,599 =
0.2%. Even at AUC 0.83 the precursor's precision at any usable operating point
is a few percent, so acting on it loses in expectation: adding a silent battery
costs ~50-90 (early) against ~0.02-0.05 x 215 (expected emergency saved);
swapping one in displaces a ~30%-p42 candidate. Every mechanism - global
feature, ordering override, count expansion - hits the same arithmetic. The
remaining silent misses (~290/origin on test) are the price of predicting a
42-day window from a signal that only turns on ~3 weeks before death. This
ceiling moves only with new information: more observed deaths maturing the
cohort clock (batch explains ~90% of lifetime variance - the physics is there,
the coverage is not), or upstream data (duty cycles, battery lot IDs).

## Trajectory

| champion | dev | test | combined (34) | all-48 metric | public LB |
|---|---|---|---|---|---|
| shipped example | — | 6779 | — | 8673 | — |
| defer-everything | — | 2512 | — | 3325 | — |
| voltage-15 | — | 2034 | — | — | — |
| logistic + fixed p0.5 | 2473 | 1735 | 2082 | — | — |
| **v1** topsum | 2502 | 1368 | 1901 | 2150 | 1964.29 (rank 3) |
| + features + ecroute | 2197 | 1478 | 1816 | — | — |
| + synthetic origins (tsroute) | 2126 | 1476 | 1782 | — | — |
| + tau_projected | 2147 | 1439 | 1772 | 2081 | — |
| **current**: + bagging + search + adaptive runtime | **2074** | **1398** | **1716** | 2202* | **1767.87 (rank 2)** |

\* honest walk-forward (adaptive path), not comparable to earlier in-sample-ish
pickle numbers.

Current champion in full: **logbag (15-bag logistic, C=1.0, 13 features) +
tsroute (topsum inclusion α=0.8, expected-cost day placement, merge-move day
search against the exact mobility simulator) + adaptive per-origin runtime
refits**, confirmed a local optimum by the phase-7 sweep.

Oracle bound: 186 (test). Remaining gap is dominated by deaths with p42 < 0.10 -
batteries whose voltage has not moved by the origin (27 of 60 test misses).

## Phase 8 - restart-from-baseline sweep of unexplored directions (2026-08-18)

Systematic pass over mechanisms *not* tried in phases 0-5. Champion reproduced
first (logbag/tsroute α=0.8: dev 2073.9). All tuning on dev only.

| idea | dev | notes |
|---|---|---|
| EV-based piggyback: post-routing add/drop by expected value vs exact mobility delta (`tspig`) | 2120 | EV decisions inherit the p42-scale brittleness - again |
| rank-gated piggyback: extend inclusion to next-ranked batteries in already-visited buildings (`tspig2`, α2=1.0/1.3/1.6) | 2162/2367/2572 | monotonically worse: α=0.8 is the true inclusion optimum; even zero-travel extras lose |
| recency-weighted training (half-life 120/240 d) | 2174/2105 | rejected |
| discrete-time hazard on censored open windows (`dthaz`) | 2089 | close but no win; open windows add little given synthetic-origin augmentation |
| determined-label training (open-window deaths as positives, `logbag_open`) | 5154 | prevalence bias wrecks sum(p42) → runaway inclusion |
| logbag+gbm blend / logbag+dthaz blend | 2265 / 2078 | rejected |
| logistic C sweep 0.1/0.3/3.0 | 2223/2139/2151 | C=1.0 was already optimal |
| in-origin fleet ranks of v_last, tau_projected (leak-free) | 2055 | helps bare logbag, redundant with aux features |
| v_proj = v_last + slope_lastk·staleness | 2122 | redundant with tau_projected |
| **aux usage-dynamics features** from raw hourly data (`aux_features.py`: daily discharge depth rng_90 AUC 0.78, vstd_30 0.77, rng_ratio, gap_max_60) | **2035** (α 0.85: 2030) | only dev-positive find; paired stats soft (7/16 wins, t≈-0.7) |
| UCB inclusion (rank by bagged mean + k·std) | 2038/2053 | neutral |
| log1p-compressed heavy-tail features | 2098 | rejected |
| more bagging (30/50) / more search restarts (8) | 2046-2058 / 2031 | flat |
| cohort_* columns (batch-age clock) | — | skipped: AUC ≤ 0.55 standalone |

**Test look 8**: logbag_aux/tsroute/α0.8 → 1510 (vs incumbent 1398); combined
1757 vs 1716. Dev gain does not transfer - the incumbent **stays champion**.
Conclusion: the (device,origin) table is mined out around the current operating
point; inclusion count, probability model class, training-set construction, and
routing search are all at local optima that reinforce each other. The remaining
gap to oracle is the no-signal-yet deaths, and neither usage stress, hazard
pooling, nor uncertainty boosting reaches them on test.

## Phase 9 - literature-driven approaches (2026-08-18, all rejected by CV)

Two approaches from the prognostics/decision-learning literature, implemented
and walk-forward tested. In-run reference: logbag/tsroute α0.8 = 2091 (FEATURES
had gained vstd_30/rng_30 from the phase-7 sweep by this point).

**Wiener first-hitting-time RUL** (`fht_features.py` + `WienerFHT`): temp-
corrected voltage as Brownian motion with per-device drift (shrunk toward the
population), EOL = first passage of the validated 2.40 V threshold, closed-form
barrier-crossing CDF, dark devices conditioned on surviving their silence.
Ranks well (AUC 0.91-0.96 spot-checked) but probability mass is overdispersed
(sum p42 ≈ 35-54 vs 8-15 true deaths), and the planner runs on probability mass:

| config | dev |
|---|---|
| wiener standalone, α 0.8 / 0.3 | 2868 / 2884 |
| 0.5·logbag + 0.5·wiener, α 0.8 / 0.6 | 2309 / 2329 |
| wiener overrides logbag where staleness > 14 d | 2503 |
| FHT projections as logistic features (fht_days, wnr_m, wnr_s2 / fht_days) | 2405 / 2222 |

Redundant with tau_projected where data is dense, noisy where it is sparse.

**Conformal risk-controlled inclusion** (`ConformalCut` + `tscut`): per-refit
cutoff = risk_q quantile of the model's scores on dying calibration pairs from
the last 120 d of closed windows - scale-free by construction, the literature's
answer to exactly our probability-drift failure mode.

| risk_q (allowed miss rate) | dev |
|---|---|
| 0.15 in-sample / 0.15 split-calibration | 3266 / 5907 |
| 0.25 / 0.40 / 0.50 in-sample | 2480 / 2286 / 2296 |

Even at the cost-matched operating point (~0.4-0.5) it loses ~200 to topsum:
the cutoff is a quantile of ~10-30 recent death scores and inherits their
sampling noise, while topsum's count integrates over the whole fleet's p42
mass. Verdict: count-based inclusion beats threshold-based inclusion even when
the threshold is conformally recalibrated at every refit.

Not attempted from the same review, with reasons: decision-focused learning /
SPO (16 dev origins cannot support cost-gradient tuning without overfitting the
block), deep sequence RUL (82 deaths), RL scheduling (sample complexity),
MNAR state-space voltage models (gap features were already dev-neutral;
highest-effort/lowest-evidence of the batch).

## Phase 10 - late_swap gap: cohort-gated rescue (rejected; bucket is empty)

Motivation: public-LB late/early = 1296/156 vs leader 660/658; misses→emergency
is ~718/origin of test cost. Hypothesis: the phase-6 cohort clock (AUC 0.906 on
silent pairs) was unfairly rejected because dev-era coverage was 35%, vs 72%
test / 84% deployment-era - so deploy it *gated to covered devices only* and
validate on the late-dev block s_18-23 where coverage is representative.

Quantifying first where the cohort signal lives (covered pairs, s_18-41):

| subgroup | n | deaths | cohort_overdue_m AUC |
|---|---|---|---|
| all covered | 6134 | 131 | 0.584 |
| dark >14d / >30d (the actual miss bucket) | 1282/1144 | 26/23 | **0.426 / 0.410 - worse than chance** |
| looks healthy (v_corr > 2.55) | 4734 | **4** | 0.902 |

The 0.906 was real but rests on 4 positives: fast plungers that were still
healthy at origin. Even perfect recall there is ~4 catches per 24 origins, and
reaching them means including high-overdue healthy devices at hopeless
precision (~60:1) x ~100 early-cost each.

CV confirmation (`CohortGate`: logbag + per-device lift to a cohort-hazard
logistic on covered devices; 'silent' mode lifts only p42 < 0.2), late-dev
s_18-23: logbag 1943 · cg_all 2421 · cg_silent 2421 (identical plans - all
lifts land in the p<0.2 bucket) · cg_silent α0.9 2588. **Rejected.**

Conclusion on the late_swap gap: the remaining misses' plunge onset is *after*
the planning origin. No origin-time feature in this dataset sees them: voltage
is healthy, usage stress is flat (phase 8), FHT drift is flat (phase 9), and
the batch clock is uninformative exactly where the misses live. The late/early
imbalance vs the leader is not recoverable by rebalancing (phase 6 α-sweep) or
by any tested signal; parity would require either mid-window replanning (not
allowed by the submission format) or a signal source we do not have.

## Protocol change (2026-08-18): dev and test merged into one 34-origin block

After 8 counted looks the test block no longer provides an unbiased holdout,
and dev s_8-23 is structurally unrepresentative of deployment (smaller refits,
35% cohort coverage vs 84% at deployment-era origins). Before merging, every
near-miss candidate without a test number was scored on s_24-41 (look 9):

| model | dev16 | test18 | combined34 |
|---|---|---|---|
| **logbag (incumbent)** | 2073.9 | 1398.0 | **1716.1** |
| logbag_rank | 2055.3 | 1446.0 | 1732.7 |
| logbag_aux | 2035.5 | 1510.2 | 1757.4 |
| dthaz | 2089.3 | 1502.6 | 1778.7 |
| aux_proj | 2036.5 | 1596.7 | 1803.7 |

The incumbent wins the combined block against every dev-winner - merging the
blocks retroactively changes no decision ever made, which is the strongest
available evidence the dev-only selection was sound. Going forward: tune on all
34 origins (s_8-41) with a pre-registered acceptance rule (mean improvement
AND per-origin win count AND no era-block regression); the public leaderboard
is the only remaining holdout and is spent deliberately.

**Repeated-split selection (adopted with the merge)**: training stays
walk-forward (time-locked), but champion selection is resampled - choose the
best config on a random half of the 34 origins, measure it on the other half,
repeat (2000 iid splits + all 20 blocked 3-of-6-chunk splits, which respect
window-overlap correlation). On the 5-finalist panel: logbag is the modal
champion (63% iid / 50% blocked selection frequency, and just as often the
true best on the held-out half); logbag_rank is the only live challenger
(27%/35%); aux/dthaz variants essentially never win. Mean selection regret
~38-64 cost units. The historical dev->test split turns out to have been an
unlucky draw: on the current feature set, dev-16 alone would select
logbag_rank while the test half's best is logbag. Acceptance rule for future
candidates: selected in >=60% of random splits AND modal under blocked splits.

## Phase 11 - price-adaptive inclusion (ADOPTED: break-even top-up, fresh-only, m0.8/pm25)

Trigger: new public leader (sackriti 1477.48, late/early 804/343 + 179 in
worker-limit penalties). Their +187 early for -492 late vs us is a 2.6:1
winning trade; our own dev frontier re-measured that same trade LOSING at
0.5:1 (α0.8→1.2: -213 late, +406 early). Not a modelling gap - a *price* gap.

**The price structure**: a false swap costs 0.5/day against the imputed EOL
(device end_time + 30d), so it depends on distance to the split's data end:
dev origins 81-133 per false swap (day-42 placement), test 18-77 falling
monotonically, s_41 17.7 - and ~0.5 for scenarios adjacent to a split's data
end, which the runtime splits contain. α=0.8 is the CV-optimal response to
dev's prices, not a universal constant. Crucially the runtime planner and the
evaluator read the same /tmp/data metadata, so a price-based rule cannot
disagree with the scorer about prices.

**Counterfactual harness** (`/tmp/counterfactual.py`): same dev origins, same
real deaths, same evaluator - end_time/EOL observability truncated at
origin+50d to reproduce cheap pricing (~19/false swap) from local data only.
There, break-even inclusion (ecroute m1.0) wins 1678 vs champion 1754; α
widening still fails (+10 at best) - a fixed count cannot express "include
everything break-even at today's prices".

**Iterations under the merged-block protocol** (panel = all 34 origins +
repeated-split selection):

| candidate | panel mean | random-split sel% | verdict |
|---|---|---|---|
| champion (fixed α0.8) | 1715.8 | - | baseline |
| ungated break-even top-up m1.0 | +24 vs champ on real dev, worst +461 | - | rejected: EV errors are punished where wrong costs ~100 |
| + price gate pm25 (v1 e_far clip) | 1760.5 | 5.5% | rejected: clip made long-stale devices (imputed EOL in the past) look FREE; evaluator charges those swaps LATE 10/day (s_34 +411, s_36 +850, s_37 +668) |
| + two-sided unclipped pricing | 1706.6 | 42.5% | closer; price-0 "stale, imputed EOL in-window" fiction still costs mobility (s_23/s_41 flips) |
| + fresh-only (e_far >= 42), m1.0 | 1703.8 | 25.6% | s_39 -78 / s_40 -406 / s_41 +76 |
| **+ fresh-only, m0.8** | **1702.0** | **63.0%** | **ADOPTED**: s_40 -438.7, s_41 -102.2, s_39 +72.5; 31/34 exact ties |

Blocked splits: 50/50 with champion, but every champion "win" is an
alphabetical tie-break on byte-identical costs (splits excluding the last
chunk are exact ties); the hybrid wins every decided split. Mean selection
regret drops 36 -> 8. The cost_curves fix (two-sided, unclipped survivor
pricing) is byte-inert for the old champion on all 34 origins and is adopted
as a pure correction.

New champion: **logbag / tsroute α=0.8 + break-even top-up (ec_margin=0.8,
ec_pmax=25, fresh devices only) + fixed cost curves**. The top-up is
structurally empty at dev-like prices (all 16 dev origins byte-identical) and
widens exactly where a wrong inclusion is provably cheap - which is where the
runtime splits live. Expected effect is largest on public/private scenarios
near their data end; the panel contains only ~3 such origins, so the local
delta (-14) understates the deployable one.

Follow-up sweeps, both rejected by the panel: pm40 (1705.1, s_38's -721 does
not survive the fresh-only restriction) and pm40/m1.0 (1715.1). pm25/m0.8 is
the local optimum of the family. Docker all-48 verification of the adopted
champion: **2175.4** (was 2202); late 1460 / early 451.

## Phase 12 - spatial peer features (rejected: panel +106, 0% selection)

User idea: cross-room/building features, age-scaled ("what would my peers
have measured at my age?"), to catch fast plungers relatively. Attractive on
paper because it fixes phase-6's fatal flaw: batch death-clocks needed peers'
DEATHS (14-54% coverage), while peer VOLTAGE at matched age has ~100%
coverage. Recon: rooms too thin (median 4 peers); buildings workable (median
9, max 117); install-week batches age-match by construction (median 8).
Building death rates genuinely cluster (4% to 100% across 24 buildings).

Screen on the blind zone (11,599 healthy-voltage pairs, 24 silent deaths):

| feature | blind AUC | all-pairs AUC |
|---|---|---|
| deficit vs building peers (age-regressed) | 0.761 | 0.869 |
| deficit vs install-batch peers | 0.663 | 0.808 |
| building death-rate prior (smoothed, leak-free) | 0.646 | 0.721 |
| rng_30 (phase-8 incumbent) | 0.832 | 0.764 |
| v_corr_last (already in FEATURES) | 0.867 | 0.945 |

Additive test: blind logistic rng_30 alone 0.843; +peer features 0.825-0.837
(worse). Panel adjudication anyway (logbag + deficit_bldg + bldg_rate on the
phase-11 planner, 34 origins): **1807.6 vs 1702.0**, champion selected in
100% of random and blocked splits. Per-origin AUC is unchanged (s_41: 0.967
vs 0.968) - the features do not add ranking signal, only calibration noise,
which the count rule converts into worse inclusion counts.

Why it cannot work here: the master curve already performs fleet-level
age-matching (tau_projected IS "voltage vs expected-at-this-point"); local
peer medians re-estimate the same quantity from 5-20 samples instead of the
fleet. The building death-rate signal is real but weak exactly where the
misses live, and largely confounded with install batch (~90% of lifetime
variance, phase 6).

## Phase 13 - plunger mechanism hypotheses: gaps, heat, room cascade (all rejected)

Three user hypotheses for what precedes a fast plunge, each built leak-free
per (device, origin) over all 168 origins and screened on the blind zone
(11,599 healthy-voltage pairs / 24 silent deaths), then panel-adjudicated:

| hypothesis | features | blind AUC | panel (champ 1702.0) | sel% |
|---|---|---|---|---|
| telemetry gaps precede death | gap_max_90 / gap_frac_90 / gap_trend | 0.42 / 0.34 / 0.59 - INVERTED: plungers report MORE cleanly than survivors | 1875.0 | 0.0% |
| hot-running or temp spikes | temp_mean_life / temp_rise_30 / tmax30_rel / temp_hot_frac_90 | 0.68 / 0.42 / 0.39 / 0.49 - only lifetime heat mildly ages (phase-6 confirmed); recent temp is INVERTED | 1988.0 | 0.1% |
| room cascade (peer fails -> room heats -> I fail) | room_death_90 / bldg_death_90 / room_peer_temp_rise_30 | 0.54 / 0.52 / 0.37 - peers' temp FALLS before a death, recent peer deaths ~chance | 1871.8 | 0.1% |

Champion selected in 99.8% of random and 95% of blocked splits. Even the gap
family's small additive screen nudge (rng_30 0.843 -> 0.867) becomes +173 in
CV - three noisy features degrade p42 calibration, and the count rule turns
that into worse inclusion counts.

Mechanism picture after phases 6-13: the fast plunger runs slightly COOLER
than its own baseline, spikes less, reports cleanly, and shows no
environmental or neighbourhood stress - but its voltage wobbles (rng_30
0.833, the one real precursor, itself unactionable at 0.2% prevalence). This
is the signature of an internal cell failure, not an external stressor:
nothing in temperature, telemetry health, or spatial context flags it before
the plunge starts.

## Phase 14 - planner structure audit (ADOPTED: building day-splitting + censoring-aware pricing)

With WHO-prediction mined out (phases 6-13) and ops already beating the
leader's, the audit targeted WHEN precision and pricing fidelity. Four
candidates, all CV-adjudicated:

| candidate | verdict | evidence |
|---|---|---|
| **split_days=7**: sub-group buildings by best-day bucket so the day search may split a building across days (merge moves can rejoin at zero travel cost - same-day groups share the mobility simulation) | **ADOPTED** | panel **1679.2 vs 1702.0**, selected in **100% of random AND 100% of blocked** half-splits; sd14 also wins (1694.4) but sd7 dominates |
| **censoring-aware cost curves**: death mass beyond the split's data end cannot be charged late/emergency (never in shipped eol_times) - price it via the end_time+30 imputation branch and drop it from park | **ADOPTED** | byte-inert on all covered windows (panel identical to the decimal); counterfactual TRUNC=30 (last 12 window days unobservable): **1302.2 vs 1334.4** (-32), 11/16 wins - early drops 572->480 as the planner stops paying bookkeeping on unscoreable deaths |
| hazard-based WHEN (logbag WHO + DiscreteHazard conditional bucket-CDF day quantiles) | rejected | panel 1728.4 (+26); s_8's -26 did not generalize - the 4-knot GBR quantiles are the better day estimator |
| park_mobility (emergency also pays travel/overtime) | rejected | +0.8 to +2.9 on the counterfactual - noise; emergency-cost underestimation was not the binding error |

One-visit-day-per-building had been implicit in plan_tsroute since phase 5
(`offs = bldg.map(day_of)`): a building holding both a dies-day-5 and a
dies-day-40 inclusion was forced onto one compromise day, paying both sides.

New champion: **logbag / tsroute alpha=0.8 + break-even top-up (m0.8/pm25,
fresh-only) + split_days=7 + censoring-aware two-sided cost curves**.
Panel 1679.2 (from 1715.8 pre-phase-11).

## Phase 15 - undocumented swaps & unlabeled deaths (all three fixes rejected; the "noise" is the label process)

User finding (voltage_all_devices notebook): timeseries extend beyond battery
lifetimes - unrecorded preventive swaps. Parallel forensics (3 agents)
established the full scale: **31 devices with undocumented swaps** (32 events,
clustering on building maintenance days - 2025-07-14 x8 and 2025-07-23 x7 in
b_afdd8b1a066d, 2026-05-08 x6), detectable by a rule with a wide dead zone
(consecutive-day corrected-voltage jump from <= 2.85 up to >= 3.00: identical
33-event set for any jump threshold 0.10-0.25 V; real swaps jump >= 0.28,
nearest noise landing 2.989). Beyond the 2 suspected unlabeled deaths: **26
confirmed ghosts** (crossed 2.45, never recovered, stopped reporting, no EOL;
dropout days cluster on batch-removal dates: 2025-12-07 x13, 2026-02-19 x10)
plus 32 deaths-in-progress still limping below 2.45 at data end.

Three CV-adjudicated treatments (panel, sd7 champion 1679.2):

| treatment | panel | why it failed |
|---|---|---|
| A: truncate history at detected swap (age_days restarts, windows never span the swap) | 1684.5 (+5.3; ties except s_9 +101, s_14 +122, s_32 -43) | the age error only touches age_days (weak, linear); cohort features were already rejected; truncation shortens post-swap history and loses more than it fixes |
| B: exclude ghosts from plans (p42=0 if below 2.45 > 42d, still < 2.55, no EOL) | **2226.0 (+547)** | WRONG PREMISE: EOL is the ~2.40 crossing and batteries spend >42d in the 2.45->2.40 twilight - the rule zeroed genuinely dying devices |
| C: quarantine "looks dead, labeled survives" training rows (3,027 rows) | **2519.1 (+840)**, per-origin AUC collapses to ~0.51 | those negatives are LOAD-BEARING: they teach the model that deep-low voltage does not reliably produce a recorded death - which is exactly what the metric scores |

Conclusion: what looks like label noise IS the label-generating process, and
the incumbent model has already learned it (via staleness and the low-voltage
negatives). The evaluator scores recorded deaths, not physical deaths; ghosts
are unscoreable, and their "survives" labels are the correct training signal
for that objective. detect_swaps() and the GHOST_ZERO/QUARANTINE knobs remain
in the code, inert by default, with the production table and runtime paths
unchanged. Champion unchanged: panel 1679.2, all-48 Docker 2146.9.

## Phase 16 - dataset semantics (two community observations verified; no model change needed)

**Categorical metadata leak**: the train parquets' device_id dtype carries
**2,451 categories** while train uses 461 - the held-out fleets total ~1,990
devices (~4.3x train). Implications: (a) per-split adaptive refits are the
right architecture (each split has its own large fleet); (b) worker limits
(fixed 100/day) bind much harder at 4x fleet size - the public leader's
daily_limit penalties (108/scenario) are rational there; our optimize_days
prices limits exactly, but local CV never exercises limit-saturated regimes.

**end_time semantics**: locations.end_time is the ADMIN snapshot end, not
per-device last data - 445/461 devices share 2026-08-01. All 82 dead slots
keep reporting past EOL (mean 107d, max 305d): replacement batteries under
the same device_id, invisible to scoring. Verified harmless everywhere:
master_curve filters tau >= 0 (replacement data never enters), dead devices
are excluded from planning, and the 15 admin-removed unscoreable devices
(early end_time, no EOL; e.g. 11 removed 2025-12-26) are scored p42 ~ 0.01
by the model - the "stale + frozen voltage -> survives" pattern learned from
exactly these rows (phase 15's load-bearing negatives) keeps them out of
every plan. The e_far imputation pricing in cost_curves makes them
prohibitively expensive to the break-even top-up as well (two-sided fix,
phase 11). Example decoded: d_57e99ff00802 - EOL 2026-02-02 (scored death),
replacement battery reports until 2026-05-13, admin end_time 2026-08-01.

## Phase 17 - label-process modeling & count correction (all five directions closed)

A structured attack on the 1679 -> 1400 gap along the label-process and
count-error channels (user-provided plan). Every direction adjudicated:

| candidate | panel | verdict |
|---|---|---|
| label-arrival hazard (two-regime: logbag for not-crossed, KM P(EOL recorded in window \| crossed a days ago) for the death zone) | **2837.7 (+1158, 1 win/33)** | refuted: the classifier's p42 for crossed devices is ALREADY the correctly calibrated mixture - dies42 labels contain the arrival process; overriding ~0.15 with KM arrival ~0.4-0.9 inflates sum(p42), explodes N |
| + domain-split training (classifier never trained/queried in death zone) | **2938.1 (+1259)** | refuted: most positives ARE crossed near death - splitting starves the classifier of deaths |
| cost-weighted training (miss ~200 vs era FP price) | **2693.7 (+1015)** | refuted; worst exactly at early origins where FP weights are largest |
| oracle-N diagnostic (per-origin N sweep, real evaluator) | mean regret **222.6**/origin, median 185 | the pool is real but the oracle direction is era-inconsistent (winner's curse around a shallow optimum) |
| backtest-alpha corrector (pick alpha from last-K closed origins' replayed curves - simulated offline from the saved sweeps) | K=4: +113, K=6: +89, K=8: +36 vs fixed 0.8 | refuted: converges to picking 0.8 (18/26 at K=8); per-origin optimal alpha is unpredictable noise |

The label-process channel has now been attacked five ways across phases 15
and 17 (binary zeroing, hard quarantine, domain split, KM arrival hazard,
cost weighting) - each loses by hundreds. Conclusion: the bagged logistic's
implicit calibration of the label-recording process is better than every
explicit model of it we can impose, and the fixed CV-chosen count (alpha=0.8)
is better than every adaptive corrector tested.

Per the plan's own decision rule ("if the first two deliver under ~120
combined, 1400 on the panel likely isn't reachable"): they delivered negative
amounts; **1400 is not reachable on this panel without new information
channels**. The honest target remains deployment-era origins (ghost-dense,
cheap-FP), which the shipped mechanisms - adaptive per-origin refits,
break-even top-up, censoring-aware pricing, building day-splitting - already
serve, and whose panel deltas systematically understate their deployment
value. Champion unchanged: panel 1679.2, all-48 Docker 2146.9.

## Phase 18 - limit-aware constructive initializer (rejected; the limit tail is a correct trade)

Last item of the phase-17 plan: greedy urgency-ordered construction (each
group placed on the day minimizing exact partial timing+mobility cost) as an
additional best-of-starts candidate in optimize_days, targeting the
overtime/limit bucket (~172/origin, spikes 500-850 at s_21/23/33-38).

Panel: **1692.3 vs 1679.2** (+13.1), champion selected 88.5% random / 75%
blocked. Three findings close the direction: (1) 28/34 byte-ties - the
argmin-start climb already finds these optima; (2) the limit spikes are
UNTOUCHED (s_21 781, s_23 832 identical) - with exact limit pricing in the
objective, the optimizer genuinely prefers paying penalties because deaths
cluster in time and spreading costs more in timing than it saves in limits;
(3) where the constructive start did win the search objective (s_34/s_35),
realized cost got WORSE (+215/+226) - at the margin, deeper search harvests
model-curve error rather than real savings. The knob
(optimize_days.constructive) stays available, default off.

This completes the phase-17 plan: all five directions adjudicated and
rejected. Champion unchanged: panel 1679.2, all-48 Docker 2146.9.

## Phase 17 - late-swap forensics: the misses are mostly NOT silent plungers (cold-start floor ADOPTED)

Question: which batteries get replaced too late? Attributed the all-48
submission's late cost through the evaluator's own transitions (its emergency
loop books missed deaths as late_swap at 10/day, day ~43+):

- 98% of late cost (73,430 of 74,850) is 263 parked deaths swapped as
  post-window emergencies; only 1,420 is caught-but-late (deaths on days 1-7
  swapped a few days after).
- State at origin of the 263: **157 already below 2.45** (48,460 cost) · 71
  in visible droop 2.45-2.55 (17,710) · only 35 healthy+fresh (7,260). The
  phase-8-13 "silent plunger wall" is ~10% of the late cost, not the story.
- (The repo submission.csv was the phase-5-era artifact, all-48 2202; all
  numbers here use same-code regenerations.)

Mechanism 1 - **cold-start count starvation** (s_0-s_8 = 46% of all-48 late):
at warm-up origins the ranking is fine (AUC 0.97 at s_0; missed deaths at
ranks 2-8) but sum(p42) undercounts prevalence ~4x (3-16 unique training
deaths, lower-prevalence era), so n = 0.8*sum(p42) includes 1-8 batteries
while 9-19 die - catch rate 0.00/0.00/0.06 at s_0/1/2. Invisible to every
prior selection round: CV discards s_0-s_7 as warm-up. Cold-start late
~700/scenario ~= the public-LB late gap to the leader (1296 vs 660) -
phase 10's "not recoverable" verdict was derived on the test block only.

Mechanism 2 - **label-lag suppression** (bulk of the remainder): long-crossed
devices (59-275d below 2.45) score p42 0.001-0.3 - the phase-15 load-bearing
negatives working as trained; the minority whose EOL does arrive in-window
pays 300-500 each. Still open; LogbagLAH (KM crossing->EOL arrival curve) is
the drafted candidate.

Fix for mechanism 1 (ADOPTED): **gated inclusion floor** in plan_tsroute -
psum_eff = max(sum(p42), k * prev_est), with prev_est = max(deaths recorded
in the last 42d, fresh devices first crossing 2.45 within the last 42d),
active only while unique observed training deaths < 20 (true exactly at
s_0-s_7; the 34-origin panel is byte-identical to the champion by
construction).

| variant | warm-up s_0-s_7 mean |
|---|---|
| champion (no floor) | 4256.1 |
| ungated k=1.0/1.5/2.0 | 3994/3741/3354 - leaks into the panel (+21/+95/+299; recent-deaths overshoots post-peak), rejected by selection stability (champion 89.5%/80%) |
| gated, recorded-deaths only, k=1.5 | 3740.5 - recording lag blinds the label signal exactly at s_0-s_2 (recent42 = 1 while 9-17 die) |
| gated + zone signal, k=1.0/1.5/2.0 | 3313/3014/2532 |
| **gated + zone, k=2.5** | **2379.7** - wins 8/8 origins; k=3.0: 2619, k=4.0: 3191 (interior optimum) |

Registered caveat: k and the gate threshold were chosen on the same 8 origins
(no holdout exists there). Any k in [1.5, 3] recovers 29-44%, so the
qualitative result is robust; the exact k=2.5 is not.

End-to-end verification (submit.py adaptive path, floor vs same-code
control): s_8-s_47 **byte-identical costs** (gate closed), warm-up 4764.2 ->
2976.6 (-37.5%, 8/8 scenarios), **all-48 2146.6 -> 1848.7** (late 1465 ->
1125, early 434 -> 515; the control reproduces the recorded Docker 2146.9).
Champion and panel (1679.2) unchanged. Knobs: BATTERYSWAP_FLOOR (k, 0
disables the cold-start branch), BATTERYSWAP_FLOOR_GATE. Held-out-split
caveat: pooled training passes the gate earlier in calendar time there
(bigger fleet, faster death accrual) and sum(p42) carries the training
fleet's scale - the foreign-fleet floor branch in submit.py (own_frac gate)
targets that regime; the local train split cannot exercise it.

## Phase 19 - cold-start count floor (ADOPTED, gated) & ungated variants (rejected)

Public resubmission of the phase-14 champion read **1717.8 (rank 3)**: late
1296→1234, early +14 - the deployment mechanisms delivered ~-50, so public
mostly does NOT sit in the cheap-FP regime, and the remaining -240 to the
leader is late-swap conversion. Cold-start diagnosis (warm-up block): at
s_0-s_7 the model RANKS deaths at the very top (AUC 0.97) but sum(p42)
undercounts prevalence ~4x (3.8 when 17 die) - the count starves, not the
ranking; 46% of the all-48 late cost. Fix: floor the count with observable
signals - max(sum_p42, k x max(deaths recorded in last 42d, fresh
2.45-crossings)) - gated to fire only while training has seen < 20 unique
deaths. Warm-up CV: **4256 -> 2380 at k=2.5, winning 8/8 origins**; the
34-origin panel is byte-identical (gate closed everywhere).
All-48 Docker: **2146.9 -> 1851.0** (late 1465→1125).

Ungated variants, panel-adjudicated and rejected: k=1.0 recent-only +20.9,
k=1.0 +zone +75.1, k=1.25 +zone +113.9 (champion 96%/80% selection). Where
sum(p42) is natively calibrated it beats the empirical death rate (deaths are
bursty; last-42d != next-42d), and the death-zone signal counts never-dying
limpers. Sixth refutation of explicit count/label correctors in calibrated
regimes.

## Phase 20 - CV-harness upgrade: the harness catches a blind ship (foreign floor refuted)

Five CV improvements, all implemented:

1. **Fleet-holdout harness** (train the pool on half the devices, plan/score
   the full fleet): built to validate a "foreign-fleet floor" (fire the count
   floor when training positives are mostly another fleet's - the public
   early-origin hypothesis) that had been wired into submit.py on
   architectural grounds. The harness REFUTED it the same day: the
   probability scale transfers across device subsets (half-fleet training:
   sum(p42) 15.8 vs 9.1 true deaths - it OVER-counts if anything); the floor
   was inert on 15/17 origins and lost where it fired (+15.1, 0 wins).
   Branch removed before it could cost a submission. Public late-heaviness is
   therefore NOT foreign-scale starvation.
2. **Near-end block s_42-s_47** (censored shipped truth, previously
   discarded): native retro-adjudication of the deployment mechanisms -
   phase-11 top-up worth **-273** (877.6 -> 604.8), phase-14 censoring-aware
   pricing **-64** (669.2 -> 604.8). Now a standing block.
3. **Three-regime scorecard** codified in the protocol section.
4. **selection_stability** counts decided splits only (all-tie splits no
   longer break alphabetically to the incumbent).
5. **summarize()** reports late/early/ops decomposition by default.

Champion: logbag / tsroute a0.8 + top-up (m0.8/pm25) + sd7 + censor-aware
pricing + gated cold-start floor (k=2.5, gate 20). Panel 1679.2 (unchanged),
warm-up 2380, near-end 604.8, all-48 Docker 1851.0, public 1717.8.

## Phase 21 - forced-emergency timing: exact pricing tested, rejected

Evaluator fact (established by reading evaluate_plan's emergency loop): every
recorded in-window EOL the plan never swaps gets a FORCED emergency visit -
late penalty + full unoptimized ops - and the queue does not start at day 42.
It starts at the **end of the calendar week containing end_time**
(`end_day = end_time + (6 - weekday)`), then processes one battery per day in
alphabetical order. All 48 train scenarios start on Mondays, so the first
emergency is always **day 48**, and the k-th miss lands at day 48+(k-1). Our
cost model prices parking against `EMERGENCY_DAY = 45` - a systematic ~30
underprice per expected death, plus an unmodeled queue-position term.

This supersedes the phase-10 disclosure that `emergency_day` is "structurally
inert": the phase-11 top-up and optimize_days' add/drop passes both consult
`park`, so the knob is live now.

| candidate | verdict | evidence |
|---|---|---|
| emergency_day=48 (exact) | rejected | panel **1682.8 vs 1679.2** (+3.6); 31/34 plans byte-identical - the repricing only flips decisions at near-data-end origins (s_39 -74, s_40 +67, s_41 +130); near-end block s_42-47 **631.9 vs 604.8** (+27), 0 wins / 4 losses / 2 ties |
| emergency_day=50 / 52 (exact + queue pad) | rejected | +9.4 / +13.1, monotonically worse |

Why the exact price loses: the deaths we park are mostly voltage-silent
(p42 ~ 0.05), so +30 x p42 adds ~1.5 to their park price - never enough to
include them. What the pricier park DOES flip are marginal p42 ~ 0.3-0.5
devices that mostly survive: late improves -3.5 while early pays +6.6
(panel decomposition). The champion's underpriced park is a de-facto
regularizer against over-inclusion where FP prices collapse. Same conclusion
as the phase-14 park_mobility rejection from the other side: emergency-cost
underestimation is not the binding error - p42 on silent deaths is.

## Phase 22 - optimizer-constraint challenges: sd<7 and NN visit order (both rejected)

The evaluator's "constraints" are soft prices (weekly limit flat 100/blown
week, daily flat 100, overtime 2x/h past 8h; ONE worker hard-wired in the
state machine - no worker field exists in the plan schema) and mobility_cost
replicates its cost machine exactly, so the ~152/origin the champion pays in
penalties is a purchased trade (phase 18 already adversarially confirmed).
The two remaining SELF-imposed constraints were challenged:

| candidate | verdict | evidence |
|---|---|---|
| split_days=3 / 1 (finer group granularity) | rejected | panel **1685.0 / 1691.1 vs 1679.2**; ops rises 216.6 -> 223.7 -> 228.2 - finer groups fragment the local search's argmin start and it converges to worse optima with more travel; more freedom != better local search |
| nn=True (visit a day's buildings in NN route order from base instead of name order, priced in the sim AND emitted identically) | rejected | panel **1679.4 vs 1679.2** - tie; 8 wins / 13 losses / 13 ties; per-origin moves up to +-40 are search-trajectory perturbations, not route savings (with a symmetric travel matrix 2-building days are order-invariant; 3+ building days are rare and route deltas are <1 each) |

Machinery kept inert: optimize_days.nn_order (default False, cfg key 'nn'),
assemble(sort_key=). Ops pot accounting: 217/origin total = 152 penalties
(correctly purchased) + 54 travel/changes + 11 swap/room time; the recoverable
slice was bounded by ~5-10/origin and the tests found ~0. The ops channel is
CLOSED - remaining cost concentrates where it always was: late_swap (p42 on
silent deaths).

Provenance note: the first nn panel run was invalidated by a parallel-session
file race (a peer harness's frozen-file guard checked models_cv.py out to HEAD
mid-experiment; nn configs silently ran as no-ops - detected because knob
configs came back byte-identical to baseline). Long background runs now print
the imported module's md5 and assert the knob under test exists.

## Phase 23 - worker-limit saturation campaign (all rejected; non-adaptation is optimal)

The one regime local CV never samples: held-out fleets are ~4.3x train
(phase 16), where fixed worker limits bind and the public leader pays
~108/scenario in daily-limit penalties. Harness (`research/run_sat.py`,
frozen): divide each scenario's worker limits (weekly/daily/overtime_start)
by 4 on real panel origins - planner and evaluator share the transformed
settings (the phase-11 property). Champion baseline on the block: **2115.1**
(vs 1679.2 native) = late 1022 / early 446 / OT 112 / daily 262 / weekly 212 /
travel 41 - so ~585/scenario of limit-driven penalties, with late/early
unchanged from native: the champion does not adapt its plan to congestion.

Autoresearch protocol (mutable surface = opt-knob JSON only): s0 = 6-origin
saturated screen; s1 = all 34 saturated origins + native no-regression leg.
10 s0 experiments + 1 s1, all rejected:

| knob family | best variant | s0 delta | verdict |
|---|---|---|---|
| constructive start (phase 18) | on | +16.2 | worse basin under saturation too |
| search budget | r6/i120 | -13.4 | one -80 escape in six origins; 5 ties |
| split_days | 12 / 4 | -4.1 / +19.4 | both directions wash; limits untouched |
| day_q | 0.2 | 0.0 | identical plans - dead knob under saturation |
| top-up gate | pm12 | +116.3 | starving the top-up raises late AND limits |
| alpha | 0.75 / 0.7 | **-59.8** (4/6) / -10.5 | promoted at 0.75+sd12 combo -> s1 |

s1 (alpha 0.75 + sd12): sat **+20.0** (18/34 wins but 4 blow-ups sum +1835:
s_17 +628, s_8 +459, s_31 +391, s_23 +357 vs 18 wins summing -1317), native
**+42.0**. Decomposition: late +43.5 / early -27.0 / daily +5.9 / weekly -2.9 -
inclusion cuts buy ZERO congestion relief; they are a mortality bet with
fat-tailed downside, made worse by saturation (emergencies consume the same
scarce worker-hours). Screen lesson: 6-origin s0 is high-variance for
inclusion knobs (-59.8 flipped to +20.0 at s1); the s1 mean gate caught it.

**Conclusion**: the ~585/scenario limit spend is the shadow price of
scheduling MASS, not of bad choices - the day-assignment search is converged
(extra search, day quantiles, both sd directions, constructive start: all
flat or worse), and paying the flat fines beats the timing cost of leaving
peak mortality weeks. The champion's non-adaptation to congestion is optimal
within its plan space; the leader's limit penalties on the LB are likewise a
purchased trade, not an exploitable gap. The saturated-regime channel is
CLOSED; ec_margin was left untested as the same condemned inclusion family.

## Phase 23 - unmasked foreign pooling in deployment (ADOPTED; user change, holdout-validated)

User change to submit.py: the packaged train table is pooled UNMASKED on
held-out splits (all 66,890 closed-window pairs, 82 dead devices, explicit
window_closed filter), while the target split's own pairs - and any train-table
rows for devices in the target fleet - stay under the T-42d mask. The old
uniform mask was CV hygiene misapplied to deployment: it starved a held-out
split's early origins to 3-20 unique training deaths (the cold-start
mechanism). Byte-inert when the target split IS train (own-fleet guard), so
panel / warm-up / all-48 are unchanged by construction.

Validation (pooling-holdout harness /tmp/pool_holdout.py: fleet A = packaged
table, fleet B = target, B-only scenarios scored):

| regime | warm-up s_0-7 | spots s_16/24/32/40 |
|---|---|---|
| old masked pool, no floor | 1478.9 (late 1274) | 1141.9 |
| old + gated k=2.5 floor (shipped before) | **1091.0** | 1141.9 (gate closed) |
| **new unmasked pool (ships now)** | 1108.6 | **1088.4** |

- Count calibration transfers: held-out s_0 sum(p42) 0.5 -> 3.4 vs 4 true
  deaths. The starvation the phase-19 floor patched is gone at its source.
- Warm-up vs the floor: statistical tie (5W/3L; s_4 -827 for the floor - a
  local prevalence burst that own-fleet recent-death signals catch and
  foreign calibration lags). Profiles differ: floor buys insurance early
  (480 early), new stays lean (177 early / 786 late).
- The undersold gain is MID/LATE held-out origins: -53.5 (3W/1L, s_16 -438) -
  the unmasked pool improves every held-out origin's training set, and a real
  split is mostly mid-history origins.
- Deployment consequence: on held-out splits the floor gate NEVER opens now
  (uniq >= 82 from origin 0); the floor remains live only for genuinely
  history-poor local regimes (train warm-up block, all-48 metric).

## Phase 24 - pretrained time-series foundation models (rejected at tier-0 screen)

Question: can a pretrained model improve the metric? Rules check
(nora.ai docs 04): pretrained models ARE allowed if open-source, documented,
reproducible, and fully self-contained at evaluation (no network; 30-min
CPU-only, 32 GB). The runtime image ships torch 2.13 but NOT
transformers/chronos/timesfm - deployment would mean vendoring inference code
+ committing weights. Applicable class: zero-shot TS foundation models
(Chronos-Bolt, TimesFM, TTM, MOMENT - all Apache-2.0/MIT). No public
battery-specific pretrained RUL model fits this data (BatteryML et al. target
Li-ion charge/discharge cycling curves, not discharge-to-death telemetry).

Test: amazon/chronos-bolt-small zero-shot on per-device daily temp-corrected
voltage (365-d context, 64-d quantile forecast, leak-free at each origin;
0.2-0.5 s per ~400-device origin on MPS; scripts /tmp/fm_screen.py,
/tmp/fm_build_all.py, /tmp/fm_tier0.py; features for all 71,658 (device,
origin) pairs built in 26 s). Derived: P(cross 2.40 V in window) per day
(quantile-interpolated), q10/median margins at window end, days-to-crossing.

Signal screen (6 tier-0 origins): fm_margin_end AUC 0.937 all-pairs vs
v_corr_last 0.948; crossed bucket 0.621 vs slope_lastk 0.672; blind/dark
"wins" (0.815/0.986) rest on 3-4 deaths. Raw crossing-prob mass overdispersed
4-9x (sum 52-62 vs 6-15 true deaths) - the exact WienerFHT failure (phase 9).

Tier-0 (exact replica of run_experiment.tier0, lab.py untouched; baseline
reproduced bit-exact): +fm_margin_end auc_crossed 0.757, +fm_pmax42 0.801,
+trio 0.752, +fm_pmax42 dark-gated 0.781 vs baseline 0.802 (gate >=0.822 or
dying_p >=0.544): **all four REJECT** - neutral at best, and the margin/trio
variants actively degrade the crossed bucket.

Why, mechanically: a zero-shot forecaster of the voltage series is a smoothed
level/trend extrapolator - exactly the signal v_corr_last / tau_projected /
slope_lastk already saturate (phase-9 redundancy, third confirmation). The
misses that matter have flat voltage at origin (phases 8-13): no forecaster
OF THAT SERIES can see them, pretrained or not. Other FM families (TimesFM,
TTM, MOMENT embeddings) read the same series and inherit the same wall;
embeddings-as-features on 82 deaths is the already-rejected deep-RUL
sample-complexity problem. Direction CLOSED absent a new signal source.

## Phase 24b - static fit for held-out splits (ADOPTED; deployment simplification)

Follow-up question to phase 23: with the full foreign pool available at every
origin, do the per-origin refits (foreign pool + target's own accumulating
masked history) still earn their runtime? Holdout harness
(/tmp/static_holdout.py, fleet A=packaged / B=target, 16 origins):

| regime | warm-up s_0-7 | mid/late s_12-40 | all 16 |
|---|---|---|---|
| rolling refit (phase-23 shipped) | 1108.6 | 1065.4 | 1087.0 |
| **static: ONE fit on A_full** | 1072.8 | 1042.6 | **1057.7** |

6W/7L/3T - a statistical tie with a static lean (mean gap driven by s_36
-372 vs s_40 +142). The sum(p42) columns are near-identical everywhere: with
82 foreign deaths in the pool, the target's own few masked deaths perturb the
fit without informing it. Phase 20's "the probability scale transfers" holds
all the way down: even fleet-specific own-history adds no measurable
calibration.

Adopted in submit.py: held-out splits (own-fleet fraction < 0.5 vs the
packaged table) fit ONE model per split on the foreign pool and skip the
split-table build entirely - equal-or-better score, minutes instead of ~17
per split, near-zero time-budget fallback risk. Train-fleet splits keep the
rolling self-masked path (their labels are the answer key; also how the
all-48 metric is produced). Verified: synthetic held-out split (B-only data,
A-only table) takes the static branch and plans sanely (4/5/7 swaps vs 4/6/7
true deaths at s_0-2); all-48 Docker must reproduce 1851.0186805555559
byte-exact (train path untouched).

Deliberately NOT adopted: training on the target split's own post-T labels
(the runtime ships each split's full eol_times.csv). That is answer-key
training - near-oracle scores, unmistakable on a leaderboard, and the
organizers run and read this code. The label-integrity assertion stays.

## Phase 25 - HVAC environment class as a feature (rejected at tier 0; gradient is real but absorbed by voltage state)

EDA first (research/hvac_room_profiles.py, hvac_signatures.png): device
temperature signatures cleanly classify the equipment environment - 8 classes
from level, weekday-vs-weekend diurnal schedule, and seasonal swing (scheduled
AHU in unheated fan rooms sits at 1.5 C nights/weekends and steps to 8 C on
weekday operating hours; hot plants sit >30 C year-round; the -18 C minima are
Nordic AHU intakes in winter, not freezers). Raw death rates are U-shaped in
the class: cold classes 25-40%, hot plants 20-30%, mild indoor ~10%; median
dead lifetime 750 d (cold) vs 1000 d (warm). Motivation vs the three prior
temperature rejections (phases 6/8/13): those were monotone or recent-window
features; two separate exposure arms can express the U, and a static class is
low-noise where the phase-12 building death-rate prior was sampling-starved.

Leak-free encoding (research/hvac_origin_features.py, expanding life-so-far
per (device, origin_idx)): cold_frac (days with min < 5 C), hot_frac (days
with max > 32 C), sched_amp (weekday-weekend daily-range gap). Candidate
hvac_env_logbag = exact logbag replica + the 3 columns in the WHO classifier.

Tier 0: **REJECT** - auc_crossed 0.776 vs baseline 0.802 (gate +0.02),
dying_crossed_mean_p 0.450 vs 0.453; only count_err improved (5.23 vs 5.70).

Post-mortem screen (66,890 closed pairs): cold_frac standalone AUC 0.623
all-pairs (same league as phase-6 lifetime temp) but **0.400 in the crossed
bucket - inverted**, sched_amp 0.419; additive in-sample gains +0.001/+0.009.
Within v_corr_last deciles, cold_frac AUC is 0.23-0.56 (noise-to-inverted):
the lifetime mortality gradient is fully absorbed by voltage state at origin -
a cold-stressed battery's depressed state of charge IS the voltage the model
already reads, and among crossed devices the environment prior points the
wrong way (consistent with phase 13: plungers run cooler than baseline).
Class one-hots would inherit the same wall (functions of the same signatures).
Fourth and final temperature rejection; the environment channel is CLOSED for
WHO-ranking. The EDA artifacts stay in research/ (the class map itself is
sound and may serve ops/reporting, e.g. cold-room devices as a maintenance
batch - just not the model).

## Phase 26 - deployment alpha under the static foreign fit (ADOPTED: ALPHA_STATIC=1.5)

Public 2026-08-19 (phase-23 submission 3c7b883): **1661.45, rank 3** (from
1717.8; the holdout harness predicted the 30-80/origin band correctly).
Remaining gap to sackriti (1477.48) = 184, entirely the late/early exchange:
ours 1212/137 vs theirs 804/343 - they buy -408 late for +206 early. Ops now
slightly better than theirs.

Mechanism found: on a held-out fleet the static foreign fit's sum(p42)
UNDERCOUNTS (5.5 vs 8 true at s_16, 6.2 vs 9 at s_6), so N = alpha*sum(p42)
needs a larger alpha than the panel optimum. The panel's 0.8 is the optimum
for a CALIBRATED count on the native fleet - a regime public never sees.
Holdout sweep, 4 runs (3 seeds + reversed fleet direction), 16 origins each:

| alpha | 0.8 | 1.0 | 1.15 | 1.3 | 1.5 | 1.7 | 2.0 |
|---|---|---|---|---|---|---|---|
| mean total | 1156.3 | 1045.1 | 1006.8 | 956.5/967.2* | 916.4 | 908.3 | 898.8 |

(*separate run batches; 1.3 anchors both.) alpha=1.3 beat 0.8 in ALL FOUR
runs; the curve flattens from 1.5 (1.5->2.0 gains only -18, within noise).
**ALPHA_STATIC = 1.5 adopted** (env BATTERYSWAP_ALPHA_STATIC): captures ~93%
of the gain from 0.8 while staying off the plateau's unbounded edge -
over-inclusion exposure grows there if the real public fleet is better
calibrated than the half-fleet proxies. At 2.0 the late/early profile
(446/331) matches the leader's shape almost exactly.

Applies ONLY to the static held-out path; the panel champion (rolling,
native fleet) keeps alpha=0.8, where the same sweep was decisively rejected
(phases 1/6). The train path never reads ALPHA_STATIC - all-48 unaffected.

## Phase 27 - held-out-parity audit & dress rehearsal (2 fixes shipped)

Question: does our setup correctly reflect public/private mechanics? Audit of
what can vary per scenario + a Docker dress rehearsal of the EXACT remote
invocation (main() over fake public+private splits with renamed device IDs so
the own-fleet guard routes to the static path).

Findings:
1. **Per-scenario settings DO vary in train** - 27 of 48 scenarios differ,
   but only in base_location/base_room (16 distinct technician bases). The
   mobility sim reads the live settings object, so this was already handled.
   All penalties/limits/window are constant 0.5/10.0/42 across train.
2. **Hardening shipped: penalty wiring.** cost_curves priced with hardcoded
   EARLY/LATE while the evaluator charges per-scenario settings values - now
   wired through per scenario (byte-inert at default values; checksum
   confirms). planning_window_days != 42 now logs loudly (cannot be rewired:
   the 42d grid is baked into features/quantiles).
3. **Hardening shipped: failure isolation.** The rehearsal exposed that a
   data-shaped exception (e.g. a check_dataset assertion) killed the adaptive
   path AND the fallback identically - the exception escaped main(), and NO
   submission.csv was written: one bad split destroyed all splits' plans.
   Now three layers: load_best_effort (consistency check demoted to a logged
   warning), individually guarded pickle fallback, and a raw-file last resort
   (defer-everything plans; finite score, cannot poison other splits), itself
   guarded so a split can at worst lose only itself.
4. Rehearsal after fixes: public + private both take the static path (82
   deaths, own-fleet 0.00), the injected inconsistency logs as a warning,
   complete 2-split submission.csv in 35s. All-48 checksum byte-exact
   (1851.0186805555559).
5. Not verifiable locally, accepted as residual risk: held-out fleet size
   (~4x per the metadata leak; count rule is a ratio, runtime proven by two
   real submissions), scenario dates/weekdays, and the held-out label-lag
   process (the ALPHA_STATIC=1.5 bet rides on the undercount direction).

## Phase 28 - public-repo port: Attention-Heads solution mined (features/floors/queue rejected; cliff-gated static appetite CONFIRMED by the barrier-event resampler - adoption candidate)

Source: team Attention-Heads (public rank 5, 1798) left their full solution
public at huggingface.co/Attention-Heads/BatterySwapAI2026-attention-heads,
including a SOLUTION.md with measured ablations and a component breakdown
against us. (Other public repos are untouched templates; sackriti's is
private again.) Everything transferable was ported and adjudicated. Runner:
`exp_x28.py` (new file; frozen modules imported, never edited, md5-asserted
per run); outputs /tmp/x28/. Parity: champion byte-equal on s_8/s_9 vs
research/baselines/tier1_champion.csv. Their independently-derived core
matches ours (recorded-EOL-only force visits, exact evaluator replica as the
objective, censored-anchor survivor pricing, return-leg double count) - the
deltas tested here were their hourly "cliff" machinery, per-battery appetite
scaling, miss-queue park pricing, and peer-offset features.

Recon (facts stage): the data is exactly hourly (tele_n7 median 168). Their
headline mechanism - hourly mins/hours-below-threshold see a knee days before
the OFFICIAL smoothed series (temp-gated daily median + 7d rolling median),
~30% of their false negatives - does NOT transfer as detection: our features
never used the 7d roll, so we never had that lag. Cliff mask (>=35% of the
last 7d's readings below 2.45 V, >=20 readings, corrected v < 2.46) catches
54% of dying panel rows but only **2/61 of the champion-blind pre-crossing
deaths**; its catches are already-crossed knee devices - i.e. an *inclusion*
signal, not a detection signal (consistent with phase 30's label finding).

| candidate | tier-0 | panel (champ 1697.4) | static holdout, α=1.5 (base 922.9, 5 fleet splits x 16 origins, paired) |
|---|---|---|---|
| hrly / hrly2 / peer features | REJECT (auc_crossed 0.802/0.795/0.790 vs 0.802) | not run | - |
| cliff_floor25 / 50 (floor p42 on cliff rows) | floor25 promoted (auc_crossed 0.835) | **+68 / +149 regression** - floors distort the calibrated count channel the native path lives on | −16 / −35.5, worst +818 |
| cliff_floor50p (park-mode: floor rank/count only, timing raw) | - | not run | −11.3 - their scale_mode='park' lesson does NOT transfer |
| cliff_rank22 (rank-only reorder) | - | +13 tie | - |
| **cliff_count22** (rank_score & p42_sum = clip(2.2·p42,1) on cliff rows; raw p42 keeps timing honest) | n/a (p42 untouched) | +27 (late 904 / early 591 vs 1022/442) | **−54.5** (t −1.9, 4/5 splits, worst +319; late 452 / early 308 vs 580/226) |
| cliff_count_lg (+ lingerer 0.7 downweight) | - | 1698.9 tie (modal 40% blocked, 31% random < 60% bar) | −25.7 - lingerer downweight subtracts value |
| logbag+tsq (miss-queue park penalty in the ec top-up) | - | +1.7 inert | +0.8, 0/48 wins - the queue term never clears the gated break-even channel; REJECT |

Controls: plain alpha raise gets the same mean (α=2.0: −55.3) but noisier
(sd 298 vs 260), worse tail (worst +421), and the curve TURNS at α=2.5
(+32.5) - phase 26's over-inclusion fear is real; the cliff gate is
self-limiting (only knee devices scale, appetite cannot run away on
survivors). α-pairing sweep: 1.5 stays optimal under the boost (1.2: −31,
1.35: −23, 1.7: −44 noisier).

**Verdict (initial): cliff_count22 @ ALPHA_STATIC=1.5 looked like a CANDIDATE
for the static held-out path only** (same gating pattern as ALPHA_STATIC; the
native rolling path decisively prefers the raw count - panel +27), pending a
label-noise robustness check because the paired t ≈ −1.9 sat inside the range
where phase-29's label-arrival luck can decide the sign.

**Label-noise check (final): REFUTED.** Fixed holdout plans for logbag@1.5,
logbag@2.0 and cliff_count22@1.5 re-scored under 120 common-random-number
label draws (phase-29 lognormal+cure lag model refit on the full table:
mu 4.08 / sigma 1.33 / cure 0.205; crossing dates real; per-cell synth eol
covers ALL fleet-B batteries - verified, so any crossed device can die in any
draw; /tmp/x28/holdout_noise.py, results holdout_noise.csv). Paired delta vs
logbag@1.5: cliff_count22 **+60.5 ± 51.2, better in 8% of draws**; plain
α=2.0 +79.6 ± 50.9, better in 6%. The real-label −54.5 edge flips sign: it
was one favourable realisation of which knee-pool members got labelled
in-window, not mechanism. Caveat the check inherits: the fitted unconditional
lag median ~59 d is longer than the observed-event median 33 d (cure/censored
mass drags the fit), so the simulator over-weights long-lag worlds.

**Sensitivity bracket (short-lag world)**: same fixed plans and draws, lag
refit on observed events only (median 37 d, sigma 1.06, pi fixed 0.205;
/tmp/x28/holdout_noise_short.py): cliff_count22 flips to **−34.8 ± 41.1,
better in 81% of draws** (plain α=2.0: −18.2, 68%). The candidate's sign is therefore
decided by the label-process model, so a third, mechanism-true test was
built.

**Barrier-event resampler (decisive): the edge is REAL.** Phase 30
established the recorded EOL IS the 2.40 V corrected crossing (+ recording
lag, measured here independently: median 5 d, p90 21 d, n=60) - so the right
randomness for a parked knee device is a barrier event (descent continues
through 2.40 vs stalls above it), not a lag draw; both lognormal simulators
conflate descent time with recording delay. Resampler
(/tmp/x28/barrier_resampler.py): reality kept everywhere EXCEPT the contested
pool (in the 2.45 band at origin, not yet through 2.40, staleness<=7;
pool sizes 2-25 per cell), whose outcomes are redrawn from empirical
level-bucketed continuation rates (P(cross 2.40 within 42d): 0.47 / 0.69 /
0.79 for [2.44,2.45)/[2.42,2.44)/[2.40,2.42), pooled 7d state grid) plus
empirical delay and recording-lag quantiles, common random numbers across
plans. Result over 120 draws: **cliff_count22@1.5 −66.8 ± 24.1 vs
logbag@1.5, better in 120/120 draws (p95 −28.3)**; plain α=2.0 −51.2 ± 15.6
(also 100%, but ~16 worse than the cliff gate in every regime that rewards
appetite).

**Verdict (final): cliff_count22 @ ALPHA_STATIC=1.5 is a CANDIDATE FOR
ADOPTION on the static held-out path** - real-label holdout −54.5 (4/5 fleet
splits), barrier-event resampler −66.8 (sign held in every draw), and the one
adverse result (censoring-corrected lag world, +60.5) is attributable to that
model's known mechanism mismatch. The native rolling path keeps the raw
count (panel +27; same gating pattern as ALPHA_STATIC itself). Wiring cost:
submit.py computes 3 hourly columns (frac245_7, tele_n7, corrected-voltage
gate) from the split's own raw timeseries and wraps the static model's
predict; all-48 must stay byte-exact (train path untouched by construction).
Adoption is a human decision - not shipped in this phase. Side finding:
under the censoring-corrected draws, appetite raises beyond ALPHA_STATIC=1.5
price negatively across the board, retroactively supporting phase 26
stopping at 1.5. All other phase-28 candidates REJECTED.

**Independence scrutiny (closed).** Continuation events are NOT independent
across devices: per-device first-band-entry states (n=127, 54% continue)
overdisperse strongly across calendar quarters (dispersion 28.5 vs binomial
6.0, bootstrap p<0.001 - hot/cold continuation regimes exist; buildings only
mildly, p=0.10; /tmp/x28/dispersion_check.py). A correlated variant of the
barrier resampler (shared per-quarter logit shock, sigma=0.88 calibrated to
the observed ~4.7x variance inflation, maximally correlated within draws;
/tmp/x28/barrier_corr.py) leaves the verdict unchanged: cliff_count22
**−66.1 ± 26.1, better in 120/120 draws (p95 −20.2)** - cold-quarter tails
are bounded because a wrongly-included knee device sits near its imputed EOL
(cheap false swap), while hot quarters pay the 20:1 late rate. The quarterly
continuation regime itself is new label-process structure future phases
should model - see phase 31 ideas 3-5 for two candidate mechanisms recorded
there: seasonal temperature (warmer devices live longer, r=+0.20, so winter
= hot-continuation regime) and install-batch waves (85% of lifetime variance
is batch; batches descend together, confounding quarter with batch). The
correlated-shock verdict above is agnostic to the mechanism: the shock was
calibrated to the observed dispersion, and batch waves cluster in calendar
time, so per-quarter sharing proxies either cause.
Not ported (already ours or already refuted): unconditional recorded-EOL
target, censored-anchor pricing, exact-cost-model optimization, building
group moves (phase-7/22 search saturation), isotonic rejection, CDF lag
(they over-swap early; we under-swap).

**Public outcome (2026-08-20, submission 6ea03da): REFUTED - and it refutes
phase 26 with it.** 2188.78 vs 1661.45 (3c7b883, still the live phase-23
rolling config at alpha=0.8). This was the first public exposure of the
ENTIRE static stack at once (24b static fit + 26 ALPHA_STATIC=1.5 + 27
wiring + 28 cliff boost). Component signature: battery_swap 3.02 -> 5.08
(+68% swaps), early 137 -> 582 (+444), ops +70, late 1212 -> 1225 (+13 -
ZERO recall gain). That is pure over-inclusion: on the real held-out fleet
the probability scale transfers (phase 20's finding: half-fleet sum(p42)
15.8 vs 9.1 true, it OVER-counts), and the half-fleet holdout construction
that phase 26 and phase 28 both relied on manufactures the undercount their
gains priced in. Late cost on public is saturated by voltage-silent deaths
(the phases-1/6 result, again). Defaults reverted (ALPHA_STATIC=0.8,
CLIFF_SCALE=1.0; static-fit machinery and phase-27 hardening retained).
Standing lesson for every future phase: **the half-fleet holdout is refuted
as an appetite adjudicator** - it disagreed with phase 20 and public sided
with phase 20; appetite changes are public-look-only decisions now. WHY it
mispredicts (parallel session, deployment-faithful sweep same day): the
half-fleet scenarios carry ~6 deaths against public's much larger fleet, so
added inclusions look cheaper than they are; the measured marginal exchange
rate is 0.46 late-saved per early-spent at alpha 1.5->2.0 locally (0.21 at
2.0->2.5) and ~0.03 on public - all far below the 1.0 break-even. The
half-fleet holdout remains valid for structural/mechanical questions
(static-vs-rolling, failure isolation), not for anything count-related. The
cliff boost's solo effect at alpha=0.8 is unproven (it was only ever
measured on top of the refuted 1.5 baseline) and stays off by default.

## Phase 29 - fresh-eyes slate: generative label model, arrival rank/features, planner add/drop, policy control (all rejected; label-noise floor quantified)

Trigger: user-requested outside review ("maybe we went in the wrong direction
from the start"), ideated deliberately BLIND to this file (code + raw data
only), then every proposal tested. Runner: `exp_x27.py` (new file; frozen
modules imported, never edited; md5s logged per run - models_cv.py
7ead54af... matched the pinned hash in all four runs). Parity: champion
reproduced byte-equal on s_8/s_9 vs research/baselines/tier1_champion.csv.
All runs at the tier-1 budget (r0/i20); champion reference **1697.4** on the
34-origin panel. Outputs in /tmp/x27/. (Numbered 29: phase 27 = parity
audit, 28 = public-repo port, both from parallel sessions.)

Raw-data facts established during the blind review:

- All 82 recorded deaths crossed 2.45 V before EOL, and 42d before their
  crossing ALL sat in the 2.47-2.77 descent band (median 2.575); the
  >2.75 -> 2.45 descent takes median 229d (p25 108, min 4). Detection is
  saturated; the residual is timing (independently re-derives phase 15/17).
- Crossing -> recorded-EOL lag: median 33d, p90 ~140d - wider than the
  window; the label process is the dominant randomness.
- All 82 deaths transmitted up to their EOL day (median pre-EOL data silence
  0d, p90 also 0): labels REQUIRE telemetry, devices dark at their would-be
  death ghost out. 33 undocumented swaps detectable (median pre-swap v_corr
  2.667: proactive replacements; 30/33 unlabeled).

| candidate | mechanism | panel | sel% rand/blk | verdict |
|---|---|---|---|---|
| lagrank_b03 | lognormal+cure arrival prob as RANK blend (w=0.3), count untouched | 1716.6 (+19; 10W/7L/17T) | 14.8/5 | rejected |
| lagrank_ovr | same, rank override for crossed devices | 2698.2 (+1001; 1W/33L) | 0/0 | rejected - closes the phase-17 loophole: LAH fails through ORDERING too, not only count explosion |
| twostage | generative EOL date: Wiener 2.45-crossing CDF (x) lognormal+cure lag | 2924.6 | 0/0 | rejected |
| ts_anchor | logbag p42 multiset (exact count), twostage order | 2659.6 | 0/0 | rejected - the ordering itself is destructive, not just the count |
| logbag_db245 | days_below_245 as plain logistic feature | 1747.2 (12W/20L) | 9.3/15 | rejected |
| logbag_arr | stacked arrival probability as feature (soft LAH; count cannot explode) | 1755.5 (15W/15L) | 7.2/20 | rejected |
| logbag_dark | staleness>14 cliff flag | 1733.0 (13W/9L; one +1245 blow-up s_36) | 18.9/5 | rejected |
| adrop planner | add/drop moves in the day search, EXACT marginal-mobility pricing | 1769.4 (+72) | - | rejected: buys late -46 for early +130 - phase-21's losing trade reached from the planner side |
| policy rule | 3-param direct rule (tau_projected<=theta, dark cliff, day frac), odd-tuned / even-holdout | 2094.8 full (holdout 1997.6) | - | rejected: the ML stack is worth ~400/scenario; the grid independently selects the 14d dark cliff |

Champion selected 49.9% random / 55% blocked against the whole slate -
stands. Static-holdout regime not run: nothing passed the panel gate
(necessary condition per the three-regime protocol).

Mechanism findings:

1. **Why generative label models fail: cure-tail unidentifiability.** The
   walk-forward lognormal+cure MLE collapses pi -> 0.00 at every panel-era
   refit (63-69 events): sigma inflates to absorb the censored ghosts, every
   crossed device "eventually gets a label", and sum(p42) overcounts 2-3x
   (s_24: twostage 26.9 vs 9 true deaths; logbag 15.2). On the FULL table
   the cure mass IS identified (pi=0.205, mu=4.08, sigma=1.33) - the
   ghost-vs-tail decomposition becomes identifiable only with data no
   walk-forward fit can have. This is the structural reason every explicit
   label-process model (phases 15, 17, 29) loses to the discriminative
   classifier: dies42 already integrates the arrival process over exactly
   the horizon that matters, using each of the 82 events once at full
   efficiency.
2. **Label-luck noise floor (new standing capability: `exp_x27.py noise`).**
   FIXED champion plans re-scored under 150 resampled label processes (real
   crossing dates; lognormal+cure lags, per-scenario truncation so devices
   unlabeled at an origin stay unlabeled): panel-mean sd ~710 across label
   worlds; the PAIRED champion-vs-challenger delta (common draws) has sd 49
   (p5 -60 / p95 +103) for a pair whose real-panel gap is 19. Caveat: the
   fit makes synthetic worlds harsher than reality (mean 3895 vs 1697), so
   this overstates - level-scaled it is still ~+-22. Reading: panel deltas
   under ~50 are substantially label-arrival luck; this is the mechanism
   behind the 61-76 selection regret the stability runs measure. Corollary:
   lagrank_b03 BEATS logbag by 25+-49 in the synthetic worlds (where ghost
   labels do arrive) - its mechanism is real; the real world's label
   generosity decides the sign, and it decided against.

Verdict: champion unchanged (panel 1697.4 tier-1 / 1679.2 full budget). The
wrong-direction-from-the-start hypothesis is adjudicated NO from four
independent angles (generative date model, arrival-informed ranking and
features, EV-driven planner inclusion, model-free policy rule): at 82
events, bagged logistic + count-based topsum remains the sweet spot. The
durable addition is the label-noise simulator - a future candidate whose
panel delta is under ~50 should be treated as undecidable on this panel
regardless of selection percentage.

## Phase 30 - label event identified: recorded EOL IS the 2.40 V crossing (knowledge adopted; both exploitation channels closed by forensics, no panel runs spent)

Follow-up to phase 29 ("try harder"), forensics-first: identify the label
mechanism, then test exploitability directly on the champion's actual panel
misses (the saved phase-29 plans), BEFORE building any model.

1. **Mechanism.** 81/82 recorded deaths reached v_corr < 2.40 before their
   EOL; lag from first-2.40-crossing to recorded EOL: **median 5d, p25 1d**
   (vs 33d from the 2.45 crossing - phases 15/17 measured the wrong clock:
   most of the "administrative lag" is descent time 2.45 -> 2.40). v_corr at
   EOL median 2.396. Ghosts: of 34 devices crossed-2.45 >= 42d with no EOL,
   20 NEVER went below 2.40 (min v_corr median 2.405) and the 14 that dipped
   sit at 2.400 exactly. To first order the label process is a barrier event
   at ~2.40 with days-scale recording, gated on the device transmitting.
2. **Channel A - knee-projection inclusion: closed.** Champion panel misses:
   132 (3.9/origin; v_corr median 2.468: 60 crossed / 48 droop / 24
   healthy). Under per-device sub-threshold extrapolation (below-2.55 slope
   over the last 90d, projected days to 2.398 minus staleness) the misses
   rank **median 35** among non-swapped transmitting devices (best 6, ZERO
   in top-5, 7 in top-10); their own projections say median 53d - the final
   descent accelerates past any linear fit. Catching the median miss means
   ~35 false swaps x ~100-150 early cost against ~300-450 saved. The knee
   pool (30-90 devices/origin) is near-exchangeable at the 42d horizon:
   WHICH member punches through is not predictable from trajectory state.
3. **Channel B - hover-ghost demotion: closed (and instructive).** The rule
   "v_corr in [2.395, 2.47), stale <= 14d, knee slope < 0.5 mV/d" looks like
   the ghost signature at device level, but at pair level that cell dies at
   **34%** in-window - and the champion's inclusions from it die at **47%**
   vs 17% for its exclusions. logbag's p42 already discriminates within the
   knee pool BETTER than mechanistic extrapolation (drop_recent/below_frac
   carry it). Phase-15's GHOST_ZERO loss now has a mechanism: "hover" is a
   device-level survivorship artifact, not a pair-level state.

Conclusion: the panel's residual late (~1022/origin) is the exchangeable
knee-pool hazard, not a selection error. Combined with the phase-29 noise
floor (paired sd ~49), the per-device channel on the native panel is closed
with a mechanism, not just a scoreboard. The 2.40-barrier fact stands as the
correct mental model of the metric's label side - and of ALPHA_STATIC's bet:
held-out knee pools are larger and FP is cheap near data end, so buying the
pool wholesale is right exactly there. Champion unchanged. Artifacts:
/tmp/x27/miss_forensics.csv; zero panel runs consumed by this phase.

## Phase 31 - user ideas screened: donor-curve k-NN and best-case-deficit (both rejected at tier 0; tau_projected residual re-ranking discovered as a deployment candidate)

Two user-proposed similarity channels, adjudicated by the phase-30 forensic
protocol (rank-of-misses on the champion's saved panel plans + cell AUCs) -
zero panel runs spent. Screen code: exp_knn_screen.py, /tmp/x27/knn_screen.log.

**Idea 1 - donor-curve k-NN EOL** (align recent v_corr history against each
INDIVIDUAL dead device's trajectory, k=5 weighted by fit error, donors
restricted to deaths <= origin): the only channel all day that beats the
champion's own residual ordering - misses rank median 16.5 (knee channel:
35), 27/102 in the residual top-5 vs logbag-next's 21. But it is DOMINATED
by plain tau_projected re-ranking (35 in top-5), loses global AUC to it
(0.883 vs 0.926, 1/34 origins) and times deaths worse (median |err| 14.7d vs
11.5d). Verdict: rejected - the median master curve + per-device alignment
already saturates the donor-similarity signal; individual donors add k-NN
variance, not information (descent shapes are stereotyped; speed varies but
speed is not identifiable early - phase 30).

**Idea 2 - deficit vs the longest-lived donor** (age-aligned v_corr gap to a
best-case reference curve from the top-3 longest-lived donors dead by
origin; target: EARLY degradation sign on the healthy cohort): AUC on
healthy pairs (v_corr > 2.55) **0.565** vs v_drop 0.795 and tau_projected
0.725 - worse than the existing own-baseline features exactly where it was
supposed to help; all-pairs 0.812 (dominated); residual top-5 23 vs tau 36.
Verdict: rejected. Mechanism: cross-device age alignment inherits per-device
voltage offsets (own-baseline v_drop cancels them) and the ~190d-sd lifetime
spread means same-age devices sit at wildly different life fractions on a
flat plateau - the deficit is offset noise until the knee, where level
features already fire.

**Discovery (the useful residue): tau_projected as residual re-ranker.**
Ordering the champion's NON-swapped descent-band devices by tau_projected
catches 24/36/44 of its 132 panel misses in top-3/5/10 - better than knn
(16/27/41) and than logbag's own next-by-p42 (15/21/35). The linear logistic
underweights its best timer exactly in the descent band where its misses
live. At panel FP prices (~120/false swap) even 36% top-5 precision is
EV-negative (+5 adds ~600 vs ~360 saved), so NOT a panel candidate. It IS
the natural ordering for the static path's ALPHA_STATIC marginal inclusions
(held-out FP ~20-40 -> strongly +EV if precision transfers): adjudicate in
the fleet-holdout harness with the phase-28/29 label-noise check before any
adoption. Logged as the open deployment-regime candidate.

**Idea 3 - V-T coupling (rolling correlation/slope of voltage vs
temperature, seasonality removed): rejected.** Physics hypothesis: rising
internal resistance couples voltage to temperature before the level moves.
Four leak-free variants screened (exp_vt_screen.py): within-day slope
bvt_60 (seasonality-proof by construction), its own-baseline change
bvt_delta, within-day correlation cvt_60, and the literal detrended 90d
rolling correlation rcorr_90. The physics is REAL but lagging: bvt_60
carries AUC 0.779 on all pairs - and is dominated by v_drop (0.888) and
tau_projected (0.909) in every cell, including the healthy early-sign
target (best variant bvt_delta 0.675 vs v_drop 0.795, beats it on 3/12
origins). Residual-miss test: 2-5 in top-10 vs tau_projected's 44. Twist:
the correlation form is ANTI-predictive on healthy pairs (cvt_60 AUC 0.288,
inverted 0.712) - on the healthy cohort the informative direction is V-T
DE-coupling (erratic voltage), which is the already-adjudicated
vstd_30/rng_30 plunge-precursor channel (phase 6/SilentFix, rejected).
Same verdict shape as phase 25: the gradient exists, the voltage state has
already priced it in.

**Idea 4 - temperature std as plunge precursor: rejected (no signal).**
User recollection check: the recorded precursor was VOLTAGE std
(vstd_30/rng_30, phase 6/SilentFix, tested and rejected); temperature std
itself had never been tested. Three leak-free variants screened
(/tmp/x27/tstd_screen.log): within-day temp std (30d median), its
own-baseline delta, and detrended 30d rolling std of daily medians. All at
or near chance (best cell: detrended rolling std on healthy pairs, AUC
0.628 vs v_drop 0.795); residual-miss test 3-8 in top-10 vs tau_projected's
44. Curiosity only: within-day temp std is INVERTED on healthy pairs (AUC
0.217, i.e., 0.783 flipped - flat temperature readings precede death),
still below v_drop and consistent with a sensor-quality artifact of the
sagging supply voltage rather than an independent channel.

**Idea 5 - infer per-device load, improve the theoretical (coulomb) model:
rejected at the physics level.** Load IS partially inferable (reads/day
17-24 p10-p90, thermal exposure, within-day sag all vary), but lifetime
variance decomposition on the 82 deaths (full-life averages; mechanistic
study, not an origin feature) shows there is nothing for it to explain:
install-date batch alone R^2 = 0.853 (30 batches; confirms the recorded
~90% claim), all four load proxies together R^2 = 0.102 alone and +0.04
incremental over batch-month; within-batch residual sd 90d with best proxy
correlation r = +0.23 (t_mean) - perfect load inference would shrink the
90d within-batch spread by ~2d. Death timing in this fleet is set at
manufacture (lot capacity), not by usage; the load-adjusted clock collapses
to the batch clock, already rejected (phases 6/10). Sign note: warmer
devices live LONGER (r = +0.20), opposite the self-discharge story -
consistent with cold raising internal resistance and pulling the 2.40
crossing earlier.

## Phase 32 - "is p42 dangerous?" - window-portability bug FIXED, miss-cost ranking rejected

Two user hypotheses about p42, both tested; one found a real catastrophic-tail
bug, the other closed a channel.

**(a) Window portability.** Worry: public/private could use a window other
than 42d. The evaluator honours `planning_window_days` per scenario, so this
is directly measurable: score unchanged plans against 28/56/84d evaluators.

| evaluator window | before fix | after fix |
|---|---|---|
| 28d | 728.5 | 728.5 (inert) |
| 42d | 1086.6 | 1086.6 (byte-identical) |
| 56d | **23581.9** | **1688.0** |
| 84d | (same failure mode) | 3283.1 |

The model side degrades gracefully; the danger was in the OUTPUT convention.
plan_tsroute parks non-included batteries at day 43 and relies on the
evaluator cutting rows past the window - with W > 42 the evaluator EXECUTES
all ~200 parked rows as real swaps and charges early penalties on the whole
fleet. **Fixed** (`repark_for_window`, applied in all three plan paths):
parked rows move to `max(W, 42)+1` read from the live settings. Inert at
W <= 42 by construction (all-48 checksum byte-exact). Residual rise at 56/84d
is legitimate, not a bug: a longer window simply contains deaths a 42d-ahead
planner never scheduled for.

**(b) Miss-cost inclusion ranking (rejected).** Hypothesis: late_swap is high
because inclusion ranks by raw p42, which treats a day-5 death (~430 if
missed) like a day-40 death (~80). Tested `rank_score = p42 x E[late penalty
if parked]` on the static held-out path (same alpha=1.5 count, same planner,
only the boundary ORDER changes), 3 fleet splits x 16 origins:

| run | p42 | miss-cost | delta |
|---|---|---|---|
| s0 | 925.9 | 894.9 | -31.0 |
| s0 reversed | 778.6 | 815.1 | +36.4 |
| s1 | 914.0 | 898.7 | -15.3 |

13W/12L/23T - no unanimity, rejected under the phase-26 standard. The
mechanism does what it claims where it wins (late 462->439, 524->504) but the
gains are small and reverse on one split: **p42 and death-day are strongly
correlated** (a confident p42 usually means already-deep decline, i.e. dying
soon), so the boundary is already nearly cost-ordered and the differences
trade on day-quantile noise. Conclusion for the record: the residual
late_swap is NOT mis-ordering among visible deaths - it is the voltage-silent
deaths (channel closed, phases 6-13) plus label-lag noise.

## Phase 33 - late-swap root cause: the count is optimal, ranking is the wall

Public 6ea03da = 2188.78 (vs 3c7b883 1661.45) triggered a full attack on
late_swap. Six mechanisms tested, all rejected; the diagnosis is now closed
and quantitative.

### Forensics (panel s_8-41, alpha=0.8, full evaluator)
- late is **97.9% MISSES** (31070) vs 2.1% caught-but-swapped-late (660 over
  34 origins). We already swap a median **12.2 days BEFORE** EOL, so the
  "shift swap days earlier" 20:1 lever DOES NOT EXIST.
- recall 176/308 = 57%. Caught deaths: max rank 20, median rank 5.
  Missed deaths: **median rank 35** of ~450 - not marginal, not invisible.
- miss signature = **LINGERERS**: median days_below_245 **63** vs 29.5 for
  caught; tau_projected 17.7 vs 6.4. They entered the 2.45 V zone long ago
  and decline slowly.
- marginal economics: a marginal swap costs ~54 early and catches 8% x 251 =
  **EV 21**. Break-even density is 54/251 = **21.5%**. Ranks 11-12 run 32%
  (keep), 13-15 run 11.7%, 13-30 run 8% (reject).

### The alpha question, settled on the SHIPPING path
Definitive curve (rolling native fit, panel, full cost):

| alpha | 0.6 | **0.8** | 1.0 | 1.2 | 1.5 | 2.0 |
|---|---|---|---|---|---|---|
| swaps | 13.6 | **15.2** | 17.4 | 19.4 | 22.8 | 28.5 |
| late | 1270 | **1019** | 944 | 866 | 817 | 691 |
| early | 330 | **444** | 604 | 758 | 1017 | 1409 |
| total | 1844 | **1679** | 1771 | 1862 | 2084 | 2369 |

Clean U with the minimum exactly at 0.8 (1.0 is better on 7 origins, worse on
24). More swaps DO cut misses - late falls 1019->691 - but early rises 3x
faster. At 28.5 swaps our late (691) still never reaches the leader's 499
while our early (1409) is 2.3x theirs: **there is no alpha that reaches the
leader profile**. Their 19 swaps are a CONSEQUENCE of better ranking
(marginal hit rate ~40% vs our 8%), not a cause. Matches the public result
(+8 swaps -> late -13, early +444) and the 0.46 -> 0.21 -> 0.03 marginal
rates from phase 28's addendum.

### Ranking attacks - all rejected, all with the same signature
Metric note (IMPORTANT): score WHO candidates on **top-12 recall**, never
AUC. Every candidate below RAISED AUC while LOWERING the recall that
converts to cost.

| candidate | AUC | top-12 recall (base 175/308) | verdict |
|---|---|---|---|
| zone features (days_below_245, in-zone, zone rate) | +0.0061 | 167 | rejected |
| v_corr_last + thresh_dist (the label IS the 2.40 crossing) | +0.0088 | 173 | rejected |
| both | +0.0111 | 169 | rejected |
| RF ranking (rank_score) + logbag count | +0.0140 | 161 | rejected |
| rank-avg 50/50, 75/25 logbag | +0.014 | 172 / 176 | noise (4W/3W) |
| cohort model (train only on at-risk) | +0.0163 | 170 | rejected |
| cohort + zone | +0.0185 | 169 | rejected |
| sub-daily/intra-day (daily min, dip depth, dip accel, min-slope, dispersion) | +0.0009 | band hits 73->72 | rejected |
| miss-cost ranking (p42 x E[late if parked]) | - | 13W/12L/23T | rejected |
| prevalence recalibration (floor count by recently RECORDED deaths) | - | corr -0.03..-0.18 vs sum(p42) +0.39..+0.52 | rejected |

Cohort diagnostic (why the AUC/top-k divergence): the at-risk cohort is
28.9% of devices and holds **99% of deaths** (7.6% death rate inside vs 0.03%
outside). A global model spends most capacity on the healthy-vs-sick boundary
that AUC rewards and we never act on; but restricting to the cohort did NOT
help either (170 vs 175), so the dilution hypothesis is refuted too.

Sanity check - ML ranking vs raw physics (top-12 of 308): logbag **175**,
own-trajectory time-to-2.40 119, thresh_dist 108, v_corr_last 108,
master-curve tau 51. Our ranking is far better than physics; it is simply not
good enough at ranks 13-40 to make extra swaps pay.

**Conclusion**: late_swap is bounded by WHO-ranking quality among lingerers,
not by appetite, timing, features-on-hand, or model family. The count channel
is closed on the panel AND on the public leaderboard.

## Test-look ledger

8 looks total (now historical - see protocol change above); look 9 = the
near-miss backfill table. Original ledger: 8 looks (threshold stack, topsum, ecroute+ablations, tsroute, aug-tsroute,
+tau_projected, logbag+α-challenger, aux-features). Dev/test disagreed
persistently by ~0.7σ (dev prefers richer stacks, test the simpler v1);
selection followed dev + the combined mean, with the public leaderboard as
final arbiter.

## Phase 34 - cross-fleet CV produces its SECOND confident false positive

Four candidates confirmed on the real leak-free full-fleet all-48 walk-forward
(`/tmp/all48_rank.py`, `/tmp/all48.py shape`). Base reproduced **1661.7 exactly**,
so the harness is sound.

| candidate | all-48 | delta | W/L/T | warm-up | panel | near-end |
|---|---|---|---|---|---|---|
| base (champion) | **1661.7** | - | - | 2379.7 | 1679.2 | 604.8 |
| rankavg (.75 logbag + .25 rf rank) | 1717.0 | **+55.3** | 12/19/17 | 2610.2 | 1703.1 | 604.8 |
| cohort_hybrid (at-risk cohort refit, gated) | 1713.1 | **+51.5** | 13/20/15 | 2573.3 | 1706.4 | 604.8 |
| both | 1679.2 | +17.5 | 16/23/9 | 2519.2 | 1670.7 | 607.4 |
| shape features (sh_*) | 1791.4 | +129.7 | - | 2500.6 | 1830.0 | 627.1 |

`rankavg` had won cross-fleet CV at **-18.4, 27/32 folds, fold-level p=0.0002**,
robust to outlier removal and surviving Bonferroni across 5 candidates. It is
+55.3 **worse** on real data. This is not a warm-up-weighting artifact: it loses
on the **panel alone** (+23.9), where models are well trained.

**Second validity boundary of cross-fleet CV** (the first was half-fleet appetite
bias, which refuted `ec_pmax=inf`): every fold trains on the FULL history, so the
harness *structurally cannot* reproduce cold-start scarcity. RF ranks well when
well-trained and is noise at 3-20 deaths; blending it helps in a world where
every model is well-trained, and hurts in ours (warm-up +230.5 of the +55.3).

**Verdict: cross-fleet CV is retired as a selection instrument.** Both effects it
called significant failed to transfer. It over-rejects nothing and over-accepts
anything that (a) shifts count/appetite or (b) benefits from a large train set -
which is nearly every candidate worth testing. Screen on full-fleet all-48 only.

### Also closed this phase

- **Warm-up physics prior** (`/tmp/warmup_prior.py`): at the cold origins s_0-7
  logbag is *already* the best ranking source - top-16 recall **75** vs
  blend25phys 72, blend50 70, phys_ttc 66, master-curve tau 50. At s_8-11 logbag
  dominates outright (39 vs 31/30/29). No physics prior to graft on. Line closed.
- **Optimizer budget** (`/tmp/a48opt.py`): 2 restarts x 60 iters is at the
  optimum. 6x120 = +2.1 (13W/12L/23T), 12x200 = +6.7 (19W/20L/9T). More search
  buys nothing; the day-placement objective is not search-limited.
- **Feature LOO at bags=120**: best removal is `-age_days` at top12 177 vs 175
  (+2/308, well inside noise); `-v_last` collapses it to 160, confirming v_last
  as the load-bearing feature. No removal adopted.

### Note on regime weighting (not acted on)

Warm-up is 23.9% of the all-48 checksum, but `submit.py` fits held-out splits
with a **single static foreign model** (line ~218) - those splits never see
cold-start. The checksum therefore over-weights a regime the scored public and
private splits do not have. Left as-is: the leak-free alternatives all
reintroduce the half-fleet appetite bias, and every phase-34 candidate loses on
the panel too, so nothing hinges on the weighting.

## Phase 35 - full re-screen on the surviving instrument (72 configs)

Everything ever judged on a retired instrument (cross-fleet CV, the half-fleet
static holdout, panel-only, top-12 recall) re-run on the leak-free full-fleet
all-48 walk-forward. Base reproduced 1661.7 in every group. `/tmp/screen48.py`.

**Nothing beat the champion.** Summary of deltas (negative = better):

| group | result |
|---|---|
| cliff (8 flavours) | count 1.5/2.2/3.0 = +19.0/+21.0/+3.0; rank-only +22.9; linger +9.5; p42-floor 0.25/0.50 = +40.3/+104.0; park-floor +102.5 |
| appetite alpha | 0.9 +67.8, 1.0 +113.8, 1.2 +228.2, **1.5 +479.1** (W3 L40) |
| ec_margin | 0 +44.2, 0.4 +12.5, 0.5 -10.9, 0.6 -3.2, 0.7 -5.9, 0.75 -4.2, 0.9 +7.1, 1.0 +19.2, 1.2 +47.8 |
| ec_pmax | 10 +41.9, 60 +16.0, inf +28.8 |
| route | sd0 +17.9, sd3 +16.3, sd14 +16.6, nn +0.6, emerg48 +6.0, emerg52 +21.3, **ecroute 0.8/1.0 = +441.1/+436.3** |
| floor | scale 1.5/2.0/3.0/3.5/4.5 = +105.8/+25.3/+39.8/+83.3/+172.5; gate 0/10/30/40 = +530.4/+158.2/+127.3/+150.8; nozone +113.3 |
| daycurve | day_q and p_conf **inert (T48, delta exactly 0)**; pbe0.3 +125.8, pbe0.5 +2.4, fday3 +7.7, fday7 +12.7 |
| model | **rf +151.3**, C0.3 +48.5, C3 +60.4, bags200 +11.9 |
| features | zone +104.9, vcorr +32.8, ts +116.3, shape +129.8 |

### Cross-fleet CV: four false positives and one sign inversion

| mechanism | cross-fleet said | all-48 says |
|---|---|---|
| ec_pmax=inf | -35.3, p=0.031 | +28.8 |
| rankavg | -18.4, p=0.0002, 27/32 folds | +55.3 |
| ecroute1.0 | -27.7 (862.1 vs 889.8) | **+441.1** |
| rf | -26.4 (863.4 vs 889.8) at 8.2 swaps vs 7.3 | **+151.3** |
| alpha | monotone DOWN to 1.2 (805.4) | monotone UP (+479 at 1.5) |

Every one is an appetite artifact of scoring half a fleet. Retired for good.

### gbm is not merely bad, it is undeployable

`HistGradientBoostingClassifier` raises `ValueError: window shape cannot be
larger than input array shape` binning the walk-forward training sets - at
s_0-7 AND at s_8-47. It only ever ran under cross-fleet CV because every fold
there trains on the full history. Shipping it would have been a hard crash.

### The break-even top-up is a switch, not a dial

`ec_margin`/`ec_pmax` move only s_39-46; s_0-38 and s_47 are byte-identical.
Cause: the gate is `fp_price = EARLY*(e_far-42) <= ec_pmax` with
`e_far = (device end_time - T) + 30`, and `end_time` is one global constant
(the dataset's last timestamp, 2026-08-01). Eligibility is therefore a step
function of calendar distance to the data end:

| scenarios | eligible |
|---|---|
| s_0-38 | 0-2.6% |
| s_39-46 | **96.1%** |
| s_47 | 0% (e_far < 42, gate fails) |

s_39 sits on the edge at fp_price 24.7 vs the 25.0 cap. Consequences:

1. The apparent `ec_margin=0.5/0.7` wins (-10.9/-5.9) rest on 8 scenarios, one
   of which (s_40) swings +389/+463. The curve is non-monotone across
   0.5->0.6->0.7. Noise, not an optimum. **Not adopted.**
2. `park_mobility` 1.0/2.0/3.0 are byte-identical and move exactly ONE
   scenario (s_39, -247). Single-scenario luck. **Not adopted.**
3. **Deployment has the SAME geometry - our harness is faithful here.**
   `iterate_scenarios` (batteryswap_public/utils.py:163) truncates the
   *timeseries* per scenario (`flat.loc[:scenario_start]`) but passes the
   locations table through untruncated, so `end_time` at runtime is the
   split's global data end, exactly as locally. And `load_context`
   (models_cv.py:1814) calls `iterate_scenarios` itself, so the all-48
   harness reproduces the runtime geometry exactly. The switch therefore
   fires on the same ~8-of-48 tail fraction on a held-out split, assuming a
   similar scenario spread; it is NOT secretly active everywhere at runtime.
   (An earlier draft of this section claimed the opposite, reading the
   plan_tsroute comment's "widens automatically ... at runtime" as meaning
   every held-out scenario. It does not - only those within ~12-61 days of
   the split's data end.) Residual unknown: the held-out splits' scenario
   spread relative to their data end is not observable from here.

### Latent hole: `unobserved_eol_days` is hardcoded

The evaluator imputes EOL = `location end_time + settings.unobserved_eol_days`
(evaluate.py:291). models_cv hardcodes `+ 30.0` twice: cost_curves:1169 (the
survivor branch of EVERY day-cost curve) and plan_tsroute:1451 (the top-up
gate). submit.py wires EARLY/LATE per scenario and warns on
planning_window_days, but not this.

Exposure measured (`/tmp/unobs.py`, planner-assumes-30 vs planner-wired, the
evaluator using U in both arms; U=30 control reproduced 1661.7 with the arms
byte-identical):

| U | unwired | wired | gap | worst scenario gap |
|---|---|---|---|---|
| 10 | 1623.9 | 1619.4 | +4.5 | +790 |
| 20 | 1642.7 | 1621.4 | +21.3 | +747 |
| 30 | 1661.7 | 1661.7 | **0.0** | 0 |
| 45 | 1699.6 | 1698.8 | +0.9 | +170 |
| 60 | 1737.6 | **1756.8** | **-19.2** | +289 |

Wiring is a provable no-op at the default and helps in 3 of 4 off-default
cases, but is 19.2 WORSE at U=60 - because `ec_pmax=25` was itself tuned
assuming 30, so correcting the price without retuning the cap just moves the
switch. Not a free correctness win.

**Risk assessment**: all 48 local scenarios carry an explicit settings block,
and the ONLY fields the organizers vary are `base_location` (16 values) and
`base_room` (27). Every economic setting - window, penalties,
unobserved_eol_days, limits, overtime - is constant. So the hole is real but
unlikely to fire. Left unwired pending a decision; models_cv.py is hash-pinned
(exp_x28.py PINS) and the fix is not a measured gain.

## Phase 36 - the fit-protocol axis: a real warm-up mechanism that deployment never runs

Features, model families, hyperparameters and planner knobs are all swept out.
The untouched axis was **how the training set is built and weighted**.
Motivation: at s_0 the training set is ~10k rows holding 3-20 positives, each
device contributes ~168 autocorrelated grid rows (so long-lived devices
dominate by negative count), and `tau_projected` is entirely NaN there - the
imputer silently drops it. `/tmp/screenfit.py`.

Ungated arms, full-fleet all-48 (base 1661.7):

| arm | warm-up | panel | all-48 |
|---|---|---|---|
| base | 2379.7 | 1679.2 | 1661.7 |
| quar (QUARANTINE on) | **2202.4 (-177.3)** | 2172.7 | +395.0 |
| devw (device-equal weight) | **2211.0 (-168.7)** | 2053.0 | +254.7 |
| bal (class_weight balanced) | 2467.2 | 4709.4 | +2442.9 |
| recw180 / recw365 | 2465.6 / 2505.1 | 1748.4 / 1747.0 | +51.5 / +64.8 |
| thin2 / thin4 | 2401.4 / 2533.6 | 1697.4 / 1906.5 | +20.3 / +191.1 |
| logcal | 2756.1 | 1772.6 | +139.6 |
| ddepth3 | 2499.7 | 1680.9 | +16.7 |

Clean regime split: `quar` and `devw` help warm-up and wreck the panel. Mechanism
is coherent - dropping the 26 "looks dead, labeled survives" ghosts and
de-weighting long-lived devices removes label noise/imbalance that only bites
when positives are scarce; with hundreds of positives those same rows are
informative hard negatives.

**Gate them the way the floor is gated** (`train_deaths < 20`). Verified the
gate splits exactly at s_0-7: gated arms leave panel (1679.2) and near-end
(604.8) byte-identical.

| gated arm | warm-up | all-48 | delta | W/L/T |
|---|---|---|---|---|
| devw_g12 / g20 / g30 | 2318.1 / 2211.0 / 2211.0 | 1651.4 / 1633.5 / 1653.2 | -10.3 / **-28.1** / -8.4 | 6/2/40 at g20 |
| quar_g12 / g20 / g30 | 2249.8 / 2202.4 / 2202.4 | 1640.0 / 1632.1 / 1663.9 | -21.6 / **-29.6** / +2.3 | 7/1/40 at g20 |
| **dq_g20** (both stacked) | **2124.7** | **1619.1** | **-42.5** | 7/1/40 |
| dq_g30 | 2124.7 | 1659.4 | -2.3 | 7/5/36 |

Gate 30 leaks into the panel (1736.0) and destroys the gain; 20 is the optimum,
matching FLOOR_GATE. Seed stability for the `devw` resample (`/tmp/seedcheck.py`,
6 seeds): warm-up 2081.2 +/- 36.0, all-48 delta **-49.8 +/- 6.0**, range
[-58.8, -42.5]. **Every seed improves**, and the reported seed 0 is the worst
of the six. The mechanism is real and not a resampling artifact.

### ...and it is inert in deployment

`submit.py` scores `public,private` only; both are held-out, so both take the
static branch where `train_uniq = static_uniq` = unique dead devices in the
full foreign train pool. **That number is 82.** Every gate tested (12/20/30/40)
is far below it, so the branch never executes on a scored split.

This generalises beyond the candidate: **the whole warm-up regime - 23.9% of
the all-48 checksum - is structurally absent from the scored splits**, and the
existing cold-start floor has the same property. It retro-explains the record:
the floor moved all-48 2146.9 -> 1851.0 (a huge local gain) while public did
not move until phase 23's unmasked pooling landed independently.

**Consequence for measurement**: s_8-47 is the deployment-faithful window - the
gate is shut there locally exactly as it is in deployment. Base on that metric
is **1518.0**. dq_g20 is byte-identical on it.

Not adopted: inert where it is scored, and it would reset the checksum baseline
and break comparability with every prior phase.

### Free re-analysis: all 86 screened configs re-ranked on s_8-47

If warm-up had been dragging a good config down, re-scoring on the deployment
window would surface it. It does not. The only negatives are the same
tail artifacts already rejected in phase 35 - ec0.5 -13.0 (still hostage to
s_40 +389), ec0.7 -7.1, parkmob -6.2 (one scenario), ddepth3 -4.0 (21W/18L,
noise). No hidden winner.

## Phase 37 - can the phase-36 mechanism be made always-on? No.

dq_g20 is worth -49.8 on all-48 but never fires in deployment
(static_uniq=82 vs gate 20). Two hypotheses for why the UNGATED version cost
+374/+493 on the panel, both tested. `/tmp/always.py`.

### H1: devw's harm was a double-bootstrap artifact - REFUTED

The phase-36 `devw` resampled with replacement and then handed the result to
BaggingClassifier, which bootstraps again. Re-implemented with true
`sample_weight` inside a manual 15-bag loop, with a uniform-weight control
(`mbag`) to absorb the implementation difference (that control is itself +90.5,
so comparisons are made against IT, not against base):

| arm | vs base | **vs mbag control** |
|---|---|---|
| mbag (uniform) | +90.5 | - |
| mbag_devw (1/n) | +479.7 | **+389** |
| mbag_devsq (1/sqrt n) | +288.9 | +198 |
| mbag_dev25 (1/n^0.25) | +91.0 | +0.5 |

Clean dose-response: the more device weighting, the worse. With the double
bootstrap removed the harm is unchanged, so the implementation was not the
cause. Weak weighting is simply inert.

### H2: quar's threshold (2.48) is over-broad - REFUTED

The filter is meant to remove the ~26 "ghost" trajectories (below the 2.45
death threshold, no EOL recorded). At s_30 it actually drops:

| v_thr | rows | devices |
|---|---|---|
| 2.40 | 169 (0.3%) | **24** |
| 2.45 | 642 (1.3%) | 53 |
| 2.48 | 1066 (2.2%) | **77** |

So 2.48 removes 3x the genuine ghost count - mostly real slow-decliners that
survived. Tightening it toward the ghosts should have kept the cold-start gain
and dropped the panel harm. It does not. On s_8-47 (base 1518.0):

| v_thr | 2.40 | 2.44 | 2.45 | 2.46 | 2.47 | 2.48 | k=0.5 | k=0.8 |
|---|---|---|---|---|---|---|---|---|
| delta | **+36.7** | +163.0 | +181.3 | +198.9 | +458.8 | +509.5 | +138.6 | +78.3 |

Monotone, every value positive, and the limit of the trend is "do not filter"
(base = 0). Softening (keeping 50%/80% of the poison rows instead of deleting
them) walks the same curve back toward zero without crossing it. And at v_thr
2.40 the warm-up block is 2379.7 - **identical to base** - i.e. the tight
filter that spares the panel also delivers no cold-start gain.

### Conclusion

The benefit and the harm come from the SAME rows. Devices that look dead and
survive are label noise when the model has 3-20 positives and informative hard
negatives when it has 800+; the effect does not attenuate with data, it
**changes sign**. No threshold, no soft-weighting and no sample-weight scheme
separates the two. dq_g20 is intrinsically a cold-start mechanism and cannot be
made always-on - which, given static_uniq=82, means it cannot be made to matter
in deployment at all.

## Phase 38 - the label process reverse-engineered (2026-08-21)

User question ("the voltage continues past the EOL line - if the battery fails
we should not have voltage anymore") exposed a documented error and, chasing
it, the exact rule that generates `eol_times.csv`.

### Correction: post-EOL telemetry is the SAME battery, not a replacement

Phase 16 recorded: "All 82 dead slots keep reporting past EOL (mean 107d, max
305d): **replacement batteries** under the same device_id", marked
human-verified. The durations are right (measured: median 85 d, mean 105, max
305). **The interpretation is wrong.** Median voltage tracked against
days-since-EOL over all 82:

| window | -90..-61 | -60..-31 | -30..-8 | -7..0 | +1..14 | +15..30 | +31..60 | +91..300 |
|---|---|---|---|---|---|---|---|---|
| median V | 2.562 | 2.510 | 2.454 | **2.398** | 2.379 | 2.363 | 2.352 | 2.295 |

Smooth through the line, no discontinuity, and only **3 of 78** devices ever
reach fresh-battery level (>2.9 V) afterwards. Phase 16's own named example
`d_57e99ff00802` reports to 2026-05-13 as claimed and never exceeds 2.559 V.

Genuine swaps DO exist and are unmistakable - 34 censored devices jump to
>=2.95 V and hold (caveat 1 verified, ~30 claimed). They just never occur at
recorded EOLs. **Consequence**: a feature window spanning a recorded EOL does
not mix two batteries; segmenting history at recorded EOLs is unnecessary. The
only genuine two-battery contamination is those 34 censored resets.

### The rule: gated 10-30 C, threshold 2.40 V, sustained crossing

`smooth_series`'s 10-30 C band is the ORGANISERS' default
(batteryswap_public/utils.py:42) but is never called by the evaluator - we
reimplemented it and inherited the constants. Never swept until now. Which
(band, threshold) best reproduces the recorded EOL dates:

| band | median lag at 2.40 | coverage |
|---|---|---|
| 0-50 | 6.0 d | 100% |
| 5-35 | 6.0 d | 100% |
| 8-32 | 4.0 d | 100% |
| **10-30** | **3.0 d** | **100%** |
| 12-28 | 3.0 d | 98% |
| 15-25 | 5.5 d | 88% |

2.42 is far worse everywhere (10-23 d); 2.38 loses coverage. **(10-30, 2.40)
is the unique pair with 100% coverage at minimum lag.** The gate and the
threshold are one definition, not two choices that happen to agree - a voltage
reading is meaningless without a temperature. Independently, 10-30 is also the
tightest band retaining all 82 deaths (12-28 drops to 77, 15-25 to 70) and
peaks voltage AUC at 0.9604.

**EOL marks the SUSTAINED crossing.** Median lag 3 d (IQR 3-6), but 12 of 81
devices lag >21 d, max 163. Those are not measurement gaps: during the lag they
have a median of 23 gated readings and **83% go back above 2.40** (mean 57% of
readings above). They wobble. The lag is NOT predictable from origin-time
features: RF leave-out Spearman **+0.006** (p=0.95), R2 -0.193, and flagging
the tail hits base rate exactly. Volatility runs the wrong way (vstd_30 rho
-0.194). Characterisation, not a lever.

**No calendar structure**: EOL day-of-week is flat (weekend share 26% vs 29%
chance), so no human/administrative recording process; month is confounded with
fleet aging by window exposure; 68 distinct dates for 82 deaths is random
collision. Calendar features rejected as a memorisation trap - fleet-history
facts cannot transfer to splits at other dates.

**Consequence for relabelling (user-asked): do not.** The evaluator scores
against `eol_times.csv` verbatim, the label is tight (100% within 7 d of a
sub-2.40 gated reading, median 0), and the nearest relabelling - adding the ~26
ghost deaths - was measured harmful at six thresholds in phase 37. Residual
error is entirely trajectory-forecast error with no label-process component,
which retro-explains phase 17's label-arrival-hazard rejection: arrival is
near-deterministic, so there was no hazard to model.

Artifacts: `notebooks/all_batteries.ipynb` (all 461 devices, categorised
DEAD-SILENT 18 / DEAD-VISIBLE 64 / RESET 34 / GHOST 17 / ADMIN-GONE 67 /
HEALTHY 261), `notebooks/silent_deaths.ipynb`.

## Phase 39 - four hypotheses closed, four measurement laws (2026-08-21)

Five parallel sessions. Every line closed negative; the durable output is the
laws.

| hypothesis | verdict |
|---|---|
| install-batch death clock | CLOSED on 3 implementations. The famous "AUC 0.91 on silent pairs" rests on **4 positives** (phase 10 already knew: all-covered 0.584, dark bucket 0.426-0.410 - worse than chance). Coverage was never the blocker: 83-95% monthly at late origins. Gated rank-only form measured **+97.9 harm**. |
| `temp_mean` (30 d, pre-filter) | Mechanism replicates (deaths 18.67 C vs survivors 20.18) but **absorbed**: -1.1pp recall@12 on production. Fifth temperature rejection; the beta correction already occupies the channel. Gains +6.4pp on a champion with no temperature handling. |
| battery-type clustering | Types are real (13x risk spread surviving level-removal) but miss rate is FLAT across types. Cannot buy recall. |
| dv42 voltage-drop regression | CLOSED on 4 implementations. **Out-of-time R2 is negative everywhere** (-0.117 / -0.029 / -0.172): the drop cannot be forecast. The score was a differently-parameterised linear classifier anchored on voltage - ties the incumbent at N=12. Censoring-aware variant exactly inert (3% of rows); quantile variant worst on a full panel. Phase 10's wall from the other side. |

### The four measurement laws

All the same shape: **pick the denominator that matches the question.**

1. **Report recall at the operating N, not AUC.** With ~400 negatives/origin,
   AUC 0.93-0.95 says nothing about a rule taking 12. Silent deaths measured
   AUC 0.947 ("p42's strongest region") and recall@12 **0.000 of 24**, median
   rank 60. Same fact, one currency.
2. **A candidate must beat the incumbent ranker ON ORDERING before any
   architecture can make blending it safe.** "Gated + rank-only" excludes
   calibration and count damage but NOT ordering damage: reordering a good list
   with a chance-level signal costs in proportion to the weight (+97.9 at
   w=0.05). No safe non-zero weight exists for a ~0.5-AUC feature.
3. **Condition on the outcome, not row shares.** Any partition (building,
   cohort, type, room) looks significant against row shares because missed
   deaths concentrate where deaths are. chi2 13.00 -> 2.67 on conditioning.
4. **Always report the test panel.** Requiring a recent in-band reading on test
   rows deleted 18% of deaths and swung v_now recall@12 from **0.800 to 0.382**
   - larger than every modelling effect measured that day, and it reversed the
   ranking of every arm. A recency filter deletes the silent population by
   construction.

### Caution on the blind-harness champion lineage

Two sessions independently found raw current voltage BEATS their champion's own
ranker at the operating N (.721 vs .668; .703 vs .672). On production the
reverse holds (.572 vs .429, +14.3pp). That lineage was ablated on COST under a
threshold rule where every feature change moves depth as well as order, so a
4-feature set losing to `last_voltage` on ordering is more likely over-pruned
than optimal. **Do not port anything from it without re-running the ablation on
recall at fixed N.**

## Phase 40 - the research loop's CV discipline, ported into this repo

Every prior phase re-derived its harness in `/tmp` and lost it. The three
measurement disciplines the blind loop paid leaderboard points to learn are now
repo-resident in `batteryswap_example/cv.py`, with the champion config itself
promoted out of `/tmp/all48.py` into `cv.CHAMPION`.

    venv/bin/python -m batteryswap_example.cv all48  [base|vcorr|zone|vrel]
    venv/bin/python -m batteryswap_example.cv static [variant] [n_seeds]
    venv/bin/python -m batteryswap_example.cv screen

**1. Ranking precision at the operating N, reported beside the cost.**
`models_cv.rank_stats` now runs inside `walk_forward`, so `dev`/`panel`/`test`
and the new protocols all emit rec12, rec20, operating-point recall/precision,
the count actually bought, and the median rank of missed deaths.
`summarize()` prints them, pooling caught/deaths over origins rather than
averaging per-origin ratios (a 1-death origin must not outvote a 12-death one).

Base reproduces **1661.7 / 2379.7 / 1679.2 / 604.8** exactly, so the additions
are diagnostic only. What they show that eight phases of cost-only reporting
could not:

| block | n | total | rec12 | rec20 | recall | prec | sched | median miss rank |
|---|---|---|---|---|---|---|---|---|
| warmup s_0-7 | 8 | 2379.7 | 0.526 | 0.735 | 0.763 | 0.570 | 19.8 | 30.5 |
| panel s_8-41 | 34 | 1679.2 | 0.572 | 0.675 | 0.571 | 0.458 | 11.3 | **57.0** |
| nearend s_42-47 | 6 | 604.8 | 0.837 | 0.935 | 0.893 | 0.250 | 16.7 | 50.8 |
| ALL-48 | 48 | 1661.7 | 0.597 | 0.718 | 0.641 | 0.453 | 13.4 | 49.2 |

**The panel's missed deaths sit at median rank 57**, 45 ranks past the cut. That
is the closed appetite axis stated as a measurement rather than as an argument:
no value of N reaches rank 57, which is why +395 swaps on the real fleet caught
zero. It also localises the warm-up floor - rec12 0.526 there but recall 0.763,
i.e. the floor buys catches with depth (19.8 swaps), not with order.

**2. `screen`: leave-BATTERY-out vs leave-SCENARIO-out, side by side.**
66503 closed pairs, 461 batteries, 1130 positive rows from **80 batteries**.
The effective n is 80, not 1130.

| model | battery AUC | battery rec12 | scenario AUC | scenario rec12 |
|---|---|---|---|---|
| logistic | 0.9669 | 0.541 | 0.9716 | 0.639 |
| logbag | 0.9669 | 0.535 | 0.9718 | 0.641 |
| rf | 0.9745 | 0.564 | **0.9946** | **0.832** |
| gbm | 0.9749 | 0.540 | 0.9921 | 0.786 |

Scenario grouping inflates rf's margin over logistic from +0.008 to +0.023 AUC
and from +0.023 to +0.194 rec12 - an 8x exaggeration of the tree advantage,
because holding out a scenario leaves the same batteries in train and test.
Levels are not comparable across columns (a battery fold ranks ~92 devices, a
scenario fold ~430); the margin within a column is. Selection reads the battery
column. This is the offline-screen counterpart of what all-48 already knew: the
harness rejected `rankavg` (+55.3) after cross-fleet CV had confirmed it at
-18.4, p=0.0002.

**3. `static`: the deployment gate, made measurable.**
Fit ONE model on half the buildings' fully-closed pairs, plan every origin of
the other half with it - no refits, no accumulating own history, cold-start
floor off (82 foreign deaths keeps gate 20 permanently shut in deployment).
That is submit.py's held-out branch. 11 s a seed, so variants are screened
across 5 building splits, not one.

Its levels are NOT comparable to all48 (half the fleet, half the deaths, and
the count rule scales with the fleet) and its appetite readings are known-bad -
this construction manufactured the sum(p42) undercount that phase 20 refuted
and phase 26 believed (public 1661 -> 2189). **Ordering only, variant vs
variant.** Both facts are enforced in the printout.

### What the two instruments said about three feature variants

| variant | static gate (5 seeds, paired) | mechanism on the gate | all48 | verdict |
|---|---|---|---|---|
| `vrel` (+vrel, vmin7_rank) | **-24.6** +/- 9.3, W143/L66 | caught 460 -> 463, **sched 1176 -> 1060**, rec12/rec20 flat | **+138.7** | reject |
| `vcorr` (+v_corr_last, thresh_dist) | -24.8 +/- 13.5, W115/L98 | caught 460 -> **478**, sched 1176 -> 1191, rec20 +0.007 | **+32.7** | reject |
| `zone` (+z_days, z_in, z_rate) | +12.3, prec 0.391 -> 0.349 | sched 4.9 -> 5.6 | +104.9 (phase 34) | reject |

Champion unchanged. Two things are worth keeping from the exercise.

`vcorr`'s +32.7 reproduces the phase-34 measurement of +32.8 to within 0.1 - a
third independent confirmation that the all-48 harness is deterministic and
sound.

`vrel` is the discipline working. It won the gate by the widest margin of the
three (W143/L66, 4 of 5 seeds) and it won it **entirely through the count**:
116 fewer swaps for 3 more deaths, with rec12 and rec20 flat to three decimals.
The gate's own docstring says a count reading from this protocol is invalid,
and the native path then charged +138.7 for it. Had the gate been read the way
phase 26 read its ancestor, this would have shipped.

### Latent deployment bug fixed: `unobserved_eol_days`

`cost_curves` and `plan_tsroute` hardcoded the evaluator's imputed-EOL offset
as `+ 30.0` while the evaluator reads `settings.unobserved_eol_days`
per-scenario - and submit.py imports `plan_tsroute` from this module, so the
hardcode shipped. All 48 train scenarios use 30.0, which is precisely why no
local protocol could ever catch it: the same shape as the hardcoded 42-day park
that `repark_for_window` exists to undo. Now a module global that
`plan_tsroute` overwrites from the settings it is handed; verified to
propagate (30 -> 90) and to leave all-48 byte-identical at 1661.7.

## Phase 41 - the phase-39 directive discharged: fleet-relative port REJECTED

Phase 39 left a standing rule: *"Do not port anything from [the blind-harness
champion] lineage without re-running the ablation on recall at fixed N."* The
`vrel` / `vmin7_rank` port in `features.py` was exactly the case it describes,
and it was sitting half-landed - computed by `features.py` and shipped in the
packaged parquet, absent from `models_cv.FEATURES`.

**Why the earlier cost measurement did not discharge the directive.** Under the
topsum rule a feature moves `p42`, `p42` moves `sum(p42)`, and `sum(p42)` moves
`N`. So a cost delta is the sum of an ordering change and a depth change and
cannot separate them - which is how the blind lineage concluded a 4-feature set
beat its own champion. `cv.ablate` holds N fixed and varies only the score. No
planner and no evaluator are involved: recall at fixed N and the rank
distribution of misses are functions of the score alone.

### Deaths caught at fixed N, paired per origin, bootstrap 95% CI

| variant | native N=12 | native N=20 | static N=12 | static N=20 |
|---|---|---|---|---|
| `vrel` alone | **-6 [-12,-1]** | +4 [-1,+9] | +6 [+0,+13] | -1 [-9,+7] |
| `vmin7_rank` alone | -1 [-5,+2] | +4 [+0,+9] | -5 [-11,+1] | +0 [-4,+4] |
| both | -7 [-15,+0] | +5 [-1,+11] | +4 [-2,+10] | -1 [-9,+7] |
| `v_last` alone | **-39 [-57,-22]** | -8 [-20,+5] | +7 [-10,+25] | +5 [-10,+20] |

454 deaths over 48 native origins; 976 over 240 origin-seeds on the gate.

**Verdict: reject.** The sign flips with N on both instruments and every CI for
the port straddles zero. The single CI that excludes zero is `vrel` alone,
native, N=12 - and it is **negative**. Decisive corroboration: the ordering is
*byte-identical* at 36-41 of 48 native origins and at 228-230 of 240 static
ones. These features barely enter the ranking. The +138.7 cost penalty measured
in phase 40 was therefore almost entirely a depth effect, exactly as the
directive predicted, and the -24.6 the static gate liked was the same depth
effect with the opposite sign.

### The phase-39 claim reproduces - and it is protocol-specific, not over-pruning

`v_last` alone was the specific claim: two blind sessions found raw current
voltage beating their champion's own ranker at the operating N.

- **Static gate**: `v_last` alone is statistically **tied** with the full
  13-feature champion (+7 [-10,+25] at N=12), with a *better* mean rank
  (11.9 vs 13.3) and a much better missed-death rank (48 vs 65).
- **Native**: `v_last` alone is **-39 [-57,-22]** at N=12, rec@12 0.478 vs
  0.564 - **-8.6pp**. Phase 39 measured +14.3pp on production; same sign, same
  magnitude class, independently reproduced.

So the lineage's finding was real *for its protocol* - one static fit on a
foreign fleet - and does not survive the refit path. The cause is not an
over-pruned feature set and not the threshold rule phase 39 suspected:
**the champion's 12 features beyond `v_last` are worth ~8.6pp recall@12 when
the model is refit on the native fleet and worth approximately nothing to a
single static fit on a foreign one.**

That is a statement about training data, not about features, and it read at
the time as the first independent argument for what phase 40 shipped: in-fleet
pooling gives the static branch 164 own deaths against the foreign 82. **The
public leaderboard refuted that reading within the hour - see phase 42.**
Tripling the static fit's death count bought no recall at all, so training
volume is not the binding constraint the argument assumed.

`features.py` keeps computing both columns (deleting them means regenerating
the packaged parquet on submission day for ~1s inside a 360s build budget) but
now carries the rejection and these numbers inline, so the port cannot be
re-attempted by inspection.

## Phase 42 - PUBLIC: in-fleet pooling is a wash (1665.89 vs 1661.45)

Submission d5b03a1 (phase 40, `HELDOUT_POOL=1`). This push also carried phases
34-37, which had never reached the remote - but they touch submit.py by one
deleted line, so the held-out path's behaviour change is pooling.

| | pooled (d5b03a1) | champion (3c7b883) | delta |
|---|---|---|---|
| **total** | **1665.89** | **1661.45** | **+4.44** |
| late_swap | 1222.92 | 1212.29 | +10.63 (**+51 late-days**) |
| early_swap | 133.69 | 137.47 | -3.78 (-363 early-days) |
| ops | 309.28 | 311.69 | -2.41 |
| swaps | 571 | 580 | -9 |

All four inversions land on integers (571 swaps, 5870 late-days, 12834
early-days, 54 penalised days), so public is still 48 scenarios at default
settings - which also confirms the phase-40 `unobserved_eol_days` fix was inert
here, as predicted.

**Verdict: a wash, marginally negative.** Pooling made the model slightly less
eager - 9 fewer swaps, 363 fewer early-days, 2.4 fewer ops hours - and paid 51
late-days for it. Net +4.4 on a 1661 baseline is 0.27%, inside any reasonable
noise band, but the sign is wrong and there is no recall gain hiding in it.

**The finding is not "pooling is neutral", it is where the neutrality comes
from.** The static branch went from 82 foreign deaths to 246 (82 foreign + 164
own, in-fleet, same-fleet, correctly embargoed). That is 3x the training
signal, on the target fleet itself, and **the ordering did not improve**. Put
beside phase 41 - where `v_last` alone ties the full 13-feature champion on a
held-out fleet - the two results say the same thing from opposite directions:

> On a fleet the model has not seen, the ranking is essentially determined by
> raw voltage, and neither richer features nor 3x more in-fleet training data
> moves it. The information needed to rank better is not in what we are
> feeding the model.

This closes the training-data axis the way phases 1/6/28 closed the appetite
axis. The remaining late cost is the voltage-silent population (recall 0.000 at
the operating N, median rank 60 of ~450), and it is invisible to every signal
in the current feature space - which is exactly what the phase-38/39 silent-
death campaign concluded before it was closed.

Standing champion remains **3c7b883 at 1661.45**.

## Phase 43 - innovation sweep: three new axes opened and closed, one leak found

Directive: challenge assumptions, look for exploits in the setup, do not stop
early. Five things were tested; four are new.

### (a) The setup leaks the answer (VERIFIED, NOT USED - see the caveat)

Scenarios are spaced **exactly 7 days** apart and the split ships **one**
timeseries file. For 42 of 48 scenarios the entire 42-day death window is
already present in that file; mean window coverage is **93.9%**. Combined with
the reverse-engineered label rule (gated 10-30 C daily median voltage sustained
below 2.40 V), reading forward reconstructs the labels directly:

| | recall | precision |
|---|---|---|
| future-voltage reconstruction (10-line rule, all 48) | **0.841** | **0.874** |
| production model at its operating point | 0.641 | 0.453 |

382 of 454 in-window deaths identified with 55 false positives, day error
median -3 d (the confirmation lag). A tuned version reaches the 81/82-exact
level `check_labels.py` already demonstrates, i.e. approximately the oracle
(186 vs our 1661.7).

**This circumvents the sanctioned accessor.** `iterate_scenarios` explicitly
truncates (`cut = flat.loc[:scenario_start]`), so past-only is the intended
contract and reading the raw file past the origin breaks it. Recorded because
it bounds what the leaderboard can mean, **not** adopted. Our own path is
clean: `features_at_origin` filters `day <= origin` (features.py:73) and every
physics/beta path does the same.

### (b) Late cost decomposed: 85% ranking, 15% timing

Of 454 deaths: **163 never swapped** (ranking failure -> emergency queue),
**95 swapped AFTER EOL** (timing failure, 150.8/scenario, mean 7.6 d late),
196 swapped before EOL at a median 13 d early. So 84.7% of late cost is
inclusion, 15.3% is placement. First time these have been separated.

### (c) The emergency queue is convex - and unexploitable

From `evaluate_plan`: misses are swapped one per day in **alphabetical**
battery order from `end_day`, each with a dedicated round trip and its own
`end_previous_day`. A miss at queue position k therefore pays an extra 10k,
and including a battery shifts every alphabetically-later miss one day earlier.
That externality is real and unpriced - the true marginal cost of a miss is
~330, not the ~220 previously used, which moves break-even from 25% to ~16%.

Tested as a rank bonus. First form (additive) scored **+1007**: an additive
bonus is just alphabetical sorting, because the shift only occurs if the
battery actually dies. Corrected to the p42-conditional form
`p42 * (1 + qw * 10 * E[misses after b] / 54)`:

| qw | 0.25 | 1.0 | 3.0 |
|---|---|---|---|
| all-48 delta | +60.0 | +160.1 | +275.1 |

Monotone loss, rejected. The mechanism is a ~9% pricing correction but it
reorders by **alphabet**, a variable with zero predictive content - measurement
law #2 again: ordering damage beats pricing gain at the boundary.

### (d) Lead-time bias on day placement - real trade, break-even

(b) says the day model is systematically optimistic, and late/early trades at
20:1. Two implementations:

| k days early | 0 | 2 | 4 | 7 | 10 |
|---|---|---|---|---|---|
| shift the OUTPUT | 1661.7 | +36.2 | +33.6 | +53.0 | +87.9 |
| shift the BELIEF (quantiles, re-solve) | 1661.7 | **-12.0** | -0.3 | -9.7 | -11.3 |

Shifting the output works on late (987 -> 878) but compresses all work into
earlier weeks and costs **+157 ops** in limit penalties. Shifting the predicted
death-day quantiles instead lets `optimize_days` re-solve with routing and the
weekly limit intact: ops stays at 206-227 and late falls to 922-962. Net best
is **-12.0 at k=2, on 23W/25L** - a coin flip, non-monotone across k. Rejected,
but it establishes that **day placement is already near-optimal**: the 95
late-swapped catches cannot be recovered by earlier scheduling because the
early penalty on the 196 correctly-timed ones plus the ops cost consumes the
whole gain.

### Standing after this sweep

Every axis now has a measurement against it: appetite (public), features
(phase 41 fixed-N), training volume (phase 42 public), routing-aware inclusion
(phases 7/22, "even zero-travel extras lose"), expected-cost ranking (phase
27b), queue pricing (c), day placement (d), silent deaths (phases 6-13, 38-39).

**The honest residual**: the leader is at 1477.48, so ~184 points are
demonstrably extractable by someone. We cannot account for them from any
mechanism measurable here, and the only path this sweep demonstrated is the
one in (a), which we are not taking.

## Phase 44 - why our late_swap is the field's highest (full leaderboard inversion)

The public board exposes all 14 teams' components. Inverting each team's
`late_swap` through the emergency-queue cost model (each miss = one dedicated
day at `(24 + k) * 10`, solved for k self-consistently) gives, per scenario:

| team | swaps | misses | caught | precision |
|---|---|---|---|---|
| J2W | 14.9 | 2.45 | 7.65 | 0.51 |
| YassY | 17.4 | 2.37 | 7.73 | 0.44 |
| CarlAlbert | 15.5 | 2.80 | 7.30 | 0.47 |
| sackriti | 14.5 | 3.21 | 6.89 | 0.48 |
| **us** | **12.1** | **4.69** | **5.41** | **0.45** |
| kalsach | 28.2 | 2.14 | 7.96 | 0.28 |

Deaths solve to ~10.1/scenario (local all-48 is 9.5 - good agreement).

**Our per-swap precision, 0.45, is mid-pack in a field of 0.28-0.51.** The
ranking is not broadly worse. We simply buy the fewest swaps in the
competition - 580, against 695 for the next-lowest and 1355 for the highest -
so we catch 5.41 where everyone else catches 7.3-8.0, and each of the ~2 extra
misses costs ~285.

### Appetite is genuinely closed - now with numbers, not an argument

From phase 28's own measurement: +8.2 swaps/scenario moved `early_swap` +444,
so a **marginal false swap costs 54**. Our ops (309 at 4.69 misses) against
J2W's (252 at 2.45) prices the emergency day at **25 per miss**, so a miss
costs 260 + 25 = **285**. Break-even is therefore **15.9%**, and our local
precision in ranks 13-20 is `(0.705-0.564)*9.5/8` = **16.7%**. The marginal
pick sits exactly on break-even. Raising alpha cannot pay.

The cliff-contamination escape is also closed: **cliff rows die at 39.4%, 17x
the base rate**, at 12.0 rows/scenario. They are good picks, so phase 28's
"zero extra catches" was not an artifact of the boost's reordering.

### The real defect, and why no local instrument can see it

Our ranks 13-20 are 16.7% precise locally and **~0% on public** (phase 28: 395
extra swaps bought `late_swap +13`). J2W's 13th-15th picks run at **80%**. The
head transfers to a foreign fleet; the tail is noise.

Where the misses live (native, 454 deaths):

| rank band | n | frac stale > 7d | median n_30 |
|---|---|---|---|
| 1-12 (head) | 256 | 0.04 | 30 |
| 13-30 (tail) | 104 | 0.03 | 30 |
| 31+ | 94 | **0.30** | 30 |
| fleet baseline | - | 0.16 | - |

Rank 31+ is the closed silent-death channel (staleness at 2x the base rate).
The tail is **fully-observed devices** - 3% stale, 30 readings in 30 days -
that we simply order below rank 12 and J2W orders above it.

Two things were tested against it and both failed:

- **Fleet calibration shift.** The half-fleet gate splits ONE fleet, so it has
  no calibration offset by construction. Injected one (+/-0.03, +/-0.06 V on
  the target fleet only, with tau moved along the curve at 572 d/V). Recall
  moved by at most 0.005 at every N. The reason is elementary and closes the
  hypothesis: **a uniform offset shifts every device's linear predictor
  equally and cannot reorder a linear model at all.** It also explains why
  `vrel` does nothing - it protects against the one perturbation that was
  already harmless.
- **Regularisation.** Effective n is ~80 death-batteries, not 66503 rows, so
  `logbag`'s `C=1.0` is tuned for a sample ~800x too large. Swept C over 100x:

  | | C=1.0 | C=0.3 | C=0.1 | C=0.03 | C=0.01 |
  |---|---|---|---|---|---|
  | gate, tail gain 13-30 | 0.154 | 0.155 | 0.157 | 0.158 | 0.153 |
  | native, tail gain 13-30 | 0.229 | 0.231 | **0.247** | 0.244 | 0.240 |
  | native rec@12 | **0.564** | 0.562 | 0.551 | 0.557 | 0.555 |

  Flat on the gate. Natively it trades head for tail (C=0.3: +5 at N=16 and +6
  at N=20, both 5W/0L, but -1 at N=12). At our operating N of ~12 it is
  negative. Rejected.

**The blocker is instrumental.** The gate reports a perfectly healthy tail -
rec@12 0.766, tail gain 0.154 - while public reports ~0% marginal precision
there. No local protocol reproduces the defect, so no local protocol can
validate a fix for it. That is the honest reason this stops here rather than
a claim that nothing is left: J2W demonstrably finds 2.2 deaths per scenario,
in well-observed data, that our ordering puts below the cut.

Standing champion remains **3c7b883 at 1661.45**.

## Phase 45 - the objective axis: pairwise ranking loss REJECTED (last open axis)

Rationale: log-loss on a 2.3% positive rate spends its capacity on the 97%
that obviously survive; the decision is a top-3% ordering, and the entire
638-point gap to the leader sits at ranks 12-20. A pairwise loss (RankNet-
style, linear scorer, within-origin death-vs-survivor difference vectors, no
intercept) optimises exactly that boundary. Two samplers: uniform survivors,
and hard negatives (survivors the incumbent ranks highest). Scored on recall
at fixed N, both instruments; score drops into rank_score so p42/count/timing
would stay byte-identical if shipped.

| variant | native rec@12 | native tail 13-30 | gate rec@12 | gate tail |
|---|---|---|---|---|
| logbag (base) | **0.564** | 0.229 | **0.766** | 0.154 |
| pair-uniform | 0.509 | 0.264 | 0.743 | 0.154 |
| pair-hard | 0.518 | **0.271** | 0.746 | 0.149 |

Paired at N=12: native -21 (4W/15L), gate -20 (19W/36L). Loses everywhere at
the operating point.

The apparent tail win (0.271 vs 0.229 native) motivated a head/tail hybrid:
logbag's top-K byte-identical, pairwise re-orders only below it. Result: the
hybrid loses at every K on both instruments (gate K12: -18 at N=16, 8W/24L;
native K12: -12 at N=16, 4W/12L). That exposes the tail win as an artifact:
**through rank 30 the two objectives catch the same deaths (native rec@30
0.793 vs 0.789, gate 0.920 vs 0.894)** - pairwise does not discover new deaths
in the tail, it demotes base's head deaths INTO the tail. When the hybrid
keeps base's head and asks pairwise to improve the tail with its own picks,
there is nothing there.

**Conclusion: the pairwise scorer extracts no information the log-loss fit
does not already have.** Same features, same data, same deaths found, lower
positions. Combined with phases 41 (features), 42 (training volume), 44
(regularisation, calibration shift), the information ceiling of this feature
space is the champion's current ordering. Every axis is now measured:

| axis | closed by |
|---|---|
| appetite / count | public (phase 28), break-even arithmetic (44) |
| features | fixed-N ablation (41) |
| training volume | public pooling (42) |
| regularisation | C sweep, flat/negative at N=12 (44) |
| calibration robustness | offset cannot reorder a linear model (44) |
| objective | this phase |
| timing / day placement | lead-time bias, coin flip (43) |
| queue pricing | alphabetical ordering damage (43) |
| routing-aware inclusion | phases 7/22 |
| silent deaths | phases 6-13, 38-39 |

What would beat 1661 from here is information we do not have locally: either
a signal J2W computes that is outside this feature space entirely, or the
forward-reading of the split file that phase 43(a) verified and declined.

Standing champion: **3c7b883 at 1661.45**. Deadline 2026-08-23.

## Phase 47 - the blind champion itself, as a whole: REJECTED (lineage fully adjudicated)

(Numbered out of order: written before the phase-46 commit landed from the
parallel session; the work predates it, the number does not.)

Question (user, 2026-08-22): the blind-repo multi-agent loop's shared champion
(`9a969a6a7dfe.py`, blind full-40 1566.7) - reusable here? The headline number
is not on our scale (its own 40-origin harness; ~55 of its margin was extra cut
depth), and most pieces were already adjudicated: CV discipline ported (40),
`vrel`/`vmin7_rank` as ADDITIONS rejected (41), in-fleet pooling a public wash
(42), trip-merge already native as building batching + group-day search
(phases 1/14). One piece had never been tested: the champion's exact 4-feature
set **as a replacement ranker** - `FEATURES=[last_voltage, vmin7, n_obs, vrel]`,
mapped here to `[v_last, v_min_7, n_30, vrel]` (`blind4` in cv.VARIANTS).

### Fixed-N ablation: a real but small head-ordering gain

Paired vs base, deaths caught, bootstrap 95% CI. `v_last_only` cross-check
reproduces phase 41 (-39 [-56,-21] native N=12 vs published -39 [-57,-22]).

| variant | native N=8 | native N=12 | static N=8 | static N=12 |
|---|---|---|---|---|
| `blind4` | +11 [-1,+23] | +9 [-8,+26] | **+27 [+7,+47]** | +14 [-2,+31] |
| `blind3` (no vrel) | +14 | +10 | +22 | +12 |

One CI of eight excludes zero (static N=8), signs consistent at N<=12 on both
instruments, and rec@30 / miss-rank get WORSE (57 -> 65 native): the small set
trades deep tail for head. `blind3` matching `blind4` everywhere settles the
phase-41 question from the other side: **vrel is not load-bearing; the gain is
the small set itself** - 4 features against effective n ~80 death-batteries,
where 13 features overfit slightly (phase 44's C-sweep said the same thing
through the regularisation knob).

### Full harness: the ordering gain does not survive the planner

| all48 | total | sched | caught/454 | early | late |
|---|---|---|---|---|---|
| base | 1661.7 | 13.4 | 291 | 473.1 | 987.5 |
| blind4, alpha 0.8 | 1765.4 | 14.6 | 298 | 584.0 | 948.3 |
| blind4, count-matched alpha 0.7342 | 1740.7 | 13.7 | 290 | 530.1 | 972.3 |

Raw: +103.8/origin - the 4-feature calibration inflates `sum(p42)`, the exact
depth confound phase 41 diagnosed, in mirror image. Count-matched: **+79.1
[-65,+231], 22W/26L, catches identical (290 vs 291)** - the +9 fixed-N catches
vanish under the real inclusion rule (topsum + break-even top-up + floor is not
top-N), and the whole residual is placement: +57 early-days/origin, because
day placement integrates the p-curve and a 4-feature curve is cruder than a
13-feature one. Ordering is only half the score's job here; timing is the
other half, and the small set is worse at it.

**Verdict: reject; nothing in the blind lineage is left unported or untested.**
The blind champion's margin decomposes fully into (a) its own harness's depth
and threshold tuning - non-transferable, appetite closed; (b) mechanisms we
already have natively; (c) a head-ordering effect real at fixed N but worth
zero catches and negative cost through this planner. Runnable via `blind4` /
`blind3` in `cv.VARIANTS`.

Standing champion: **3c7b883 at 1661.45**. Deadline 2026-08-23.

## Phase 46 - the overfitting question, audited; and the certainty-first adoption

User hypothesis: the leaders are overfitting the public board. Audited with a
4-way measurement (certain-pool size, our capture of it, the fix on both
instruments, luck bounds). Verdict: **partially right, and the audit found a
real local gain on the way.**

### How much of the board is luck

The board keeps each account's best public score, so it best-of-N selects
every team's luckiest config. From our own per-origin variance (sd 838 over 48
origins -> sd of the 48-scenario mean = 121), the expected luck of keeping the
best of N equal-skill submissions is 217/260/296/338/367 points for
N=5/10/20/50/100.

- **J2W's 210-point lead over rank 2 needs only N~4.5.** The ordering WITHIN
  the leading pack is plausibly board luck.
- **The pack's ~500-point lead over us would need N~5300.** Not luck.

### The pack's edge is real - and it is not legitimately reachable by us

The certain pool (devices whose gated daily median has sustained < 2.40 V for
3 consecutive gated readings BEFORE the origin, i.e. the label rule already
fired but the EOL has not landed - the wobble/lag population):

| rule at origin | flagged/scen | die in-window | die by +90d | never die |
|---|---|---|---|---|
| 2.40 sustained-3 confirmed | 1.06 | 94.4% | 100% | **0** |
| 2.45 zone (days_below_245>=0) | 21.8 | 24.6% | - | 62% |

So the free-certainty pool is ~1/scenario, of which our champion already ranks
42/51 in the top 12. The leaders' ~2.2 extra catches/scenario cannot be built
from any past-only certainty rule we can construct: the implied J2W marginal
precision is 0.69-0.88 (robust across all 9 inversion assumptions), on picks
that for us measure ~0% transfer precision. Either they hold a tail-ranking
signal outside this feature space entirely, or they are reading outcomes (the
phase-43a forward-read, whose ceiling - 84% recall, 1.6 misses/scen - they sit
comfortably below at 2.45 misses; or battery-toggling against public, ~1
battery learned per submission pair). Given phases 41-45 measured every
legitimate axis at ~zero, the balance of evidence is that the top of the board
is exploiting the setup, not merely lucky. Unprovable from here; recorded as
an assessment, not a fact.

### ADOPTED: certainty-first ordering (cert-first, k=3)

The audit's by-product. Force confirmed-crossing devices to the top of the
ranking (rank_score = 2 + p42; count and timing untouched):

| | all-48 | panel | W/L/T | mechanism |
|---|---|---|---|---|
| first-reading rule (LEAKS 2 future readings) | -88.2 | -124.5 | 6/0/42 | struck |
| **confirmed rule (past-only)** | **-37.9** | **-53.6** | **3/0/45** | adopted |
| k=1 / k=2 confirmation | +290.7 / +199.5 | - | 9/30 / 9/31 | recoveries flood the head |

The confirmation depth is load-bearing and equals the label rule's own sustain
parameter - k=3 is the unique safe point. Fixed-N instruments agree: native +9
catches at N=12 (6W/0L), deployment gate +6 (6W/0L, ties elsewhere) - loss-free
on every instrument at every N tested. The wins are label-lag devices our
model under-ranks BECAUSE they recovered (v_last back up) - exactly the wobble
population phase 39 characterised.

Deployment note: at runtime `iterate_scenarios` hands truncated data, so the
rule is past-only by construction there; the local strict measurement is the
honest predictor. Wired into submit.py (`BATTERYSWAP_CERT_FIRST`, default on,
both branches; stacks on top of cliff's rank_score if that is ever enabled;
p42_sum untouched so the count rule is byte-identical).

Local champion is now **cert-first at 1623.7** (from 1661.7). Public look not
yet spent; submission is the user's call. Expected public value if the wobble
rate transfers: ~-35 +/- (fires 0.46 devices/scenario locally).

## Phase 49 - four new ordering-signal families opened and closed in one sweep

Directive (user, 2026-08-22): test new ideas against the champion, be
innovative, try brand-new approaches. Everything below is a fixed-N ordering
screen (`cv.ablate` discipline, both instruments where applicable, paired per
origin, bootstrap 95% CI), so no depth confound; costs on the 1661.7 scale
(cv.run_all48 does not route through submit.py's cert-first). Screen code:
`exp_x29_new_signal_sweep.py` [long|tau|tavg]. Phase 48 is reserved for the
cert-first public adjudication (parallel session).

### (A) Longitudinal cross-origin features - the first untouched signal family

The feature table is a 168-origin snapshot grid (~3-4d apart) per device; every
existing feature reads one 30/90d window at ONE origin, and no phase had ever
read ACROSS origins. Three features, all strictly backward-looking
(merge_asof, snapshots < T): `mom28`/`mom56` = within-fleet rank change of
v_last vs 28/56d ago; `wolf` = count of snapshots >= 42d ago in the bottom
decile (device provably survived - it is alive at T).

The raw signal is REAL: bottom-decile chronics (wolf > 2) die at 20.7% vs
15.5% for newcomers, and dying devices' fleet rank slides (median mom28 -0.025
vs -0.007 for survivors). The model cannot use it:

| variant | native N=12 | gate N=12 | verdict |
|---|---|---|---|
| mom | -5 [-13,+3] | -7 [-14,+0] | reject (gate N=16/20 significantly negative) |
| wolf | **-24 [-42,-7]** | **-14 [-27,-1]** | reject |
| momwolf | -27 [-47,-7] | -15 [-30,-1] | reject |

Mechanism: the 30d-window slope/drop/accel features already price the
trajectory in; the cross-origin rank version duplicates them with extra noise,
and `wolf` duplicates the level (chronics ARE low). Effective n ~80 punishes
every redundant column.

### (B) Interaction terms - the linear champion offered its first products

`z(v_last)*z(slope_30)`, `z(v_last)*z(vstd_30)`, `z(v_min_7)*z(accel)`
(within-origin z-scores, leak-free). Flat everywhere: native +2/-2/+5/+2
across N, gate +0/-1/-5/-1, every CI straddling zero. There is no exploitable
interaction structure - the phase-45 ceiling holds against nonlinearity in
feature space, not just against nonlinear learners.

### (C) tau descent-band re-rank - phase 43's open candidate, closed

The knn screen left one open item: logbag underweights `tau_projected` in the
descent band where its misses live (24/36/44 of 132 panel misses in tau's
top-3/5/10); EV-negative as extra swaps, never tested as a pure REORDER at
fixed N. Tested three transforms (band rank-blend, global rank-blend,
promotion-only): native **-45 of 454 at N=12 (7W/29L)**, -53 at N=8. The gate
is mildly positive (+3..+11) - the same protocol-specificity signature as
`v_last` in phase 41: a single static foreign fit underuses the timer, the
weekly refit already extracts it. The gate's sign must never override a
native loss. Candidate closed for the native path.

### (D) Temporal score ensembling - the variance question, settled directly

Rank-average the current origin's fit with the previous 1-2 origins' fits
applied to the same rows (adjacent origins are near-identical draws of the
~80-death training set). Dead flat: tavg2 -3 at N=12 (0W/3L), tavg3 -4
(1W/5L) - refit-to-refit orderings barely differ. With phase 44's flat C
sweep (regularisation not binding) and logbag never separating from plain
logistic (bagging variance not binding), this is the third independent leg:

> **The marginal-rank defect is missing information, not estimation noise.
> Any future ordering candidate must bring a NEW signal, not a better
> estimate of the current ones.**

(It also moots the deployment-gate objection - there is no fit noise to
smooth, in any branch.)

### Standing

Four families opened, four closed, all with mechanisms. The information
ceiling of phase 45 now covers: re-weightings (45), replacement sets (47),
cross-origin dynamics, interactions, timer blends, and temporal ensembles
(49). What remains is what phase 44 said: a signal outside this feature
space, or the declined forward-read. Local champion unchanged (cert-first
1623.7 / base 1661.7); public champion **3c7b883 at 1661.45**. Deadline
2026-08-23.

### Phase 46 addendum: the rule is one point wide in BOTH dimensions

Threshold micro-sweep at k=3 (cost harness): 2.40 -> **-37.9** (3W/0L);
2.41 -> +93.6 (8W/32L); 2.42 -> +383.9; 2.43 -> +314.1. With the earlier
k-sweep (k=1 +291, k=2 +200), cert-first works ONLY at the label process's
exact parameters (2.40 V, 3 consecutive gated readings). The mechanism is
label-rule replay on past data, not prediction; any deviation reverts to
guessing at sub-break-even precision. Direction closed.

## Phase 48 - PUBLIC REFUTES cert-first (1704.64); the third and sharpest CV failure

Submission 9438aac (cert-first isolated, pooling default off): **1704.64 vs
champion 1661.45, +43.19.** Inversion (all integers - settings unchanged):

| | swaps | late-days | early-days | total |
|---|---|---|---|---|
| champion 3c7b883 | 580 | 5819 | 13197 | 1661.45 |
| cert-first 9438aac | 598 | 5894 | 15203 | 1704.64 |
| delta | **+18** | +75 | **+2006** | +43.19 |

**+18 swaps at ~111 early-days each.** The diagnosis writes itself: on train,
every device that sustains <2.40 V dies within 90 days (54/54, phase 46), so
the boost was loss-free locally. The public fleet contains devices that
sustain-cross and NEVER receive an EOL label - the ghost population phase 15
found 26 of in train (at 2.45-2.48; train has none at 2.40, public evidently
does). A ghost is force-swapped in every scenario it survives, and with no
EOL on file the evaluator prices each swap against end_time+30: ~111
early-days apiece. The count rule could not protect us - a boosted device
displaces a marginal pick, and when the displaced pick sits in the break-even
top-up set it re-enters, so the union grows.

The premise that failed is not the label rule (81/82 exact) but its
CONVERSE on an unseen fleet: "crossed implies labeled-dead-soon" is a
train-fleet fact, not a label-process fact.

### What this makes three of

Locally-validated interventions refuted by public: ALPHA_STATIC=1.5 (holdout
-240 -> public +527), cliff boost (adjudicated -55 -> refuted stacked), and
now cert-first (**-37.9 at 3W/0L/45T -> public +43.2**). Cert-first is the
sharpest of the three: mechanistically derived, past-only, loss-free on every
local instrument, refuted anyway - by a fleet-composition fact no local
protocol can exhibit because train contains zero counterexamples. When the
local evidence for a class of intervention is this good and it still fails,
the class is uninsurable, not under-validated.

Action: CERT_FIRST default off (code retained behind the env var); champion
remains 3c7b883 at 1661.45 on the board (best-per-account row unaffected).
A recency-guarded variant (trust the crossing only while fresh) is measured
locally in this phase's sweep, but shipping it would repeat the same bet with
a smaller stake and no way to price it - the ghost rate at 2.40 on the scored
fleets is unobservable from here.

### Phase 48 addendum: the guard is measured, and the late component kills it

Recency-guarded sweep (flag only crossings confirmed within the last X days):
g14 -18.7 (2W/0L), g28/g42/gInf all **-37.9 identical** - locally every catch
happens within 28d of confirmation, so a 28d guard is free AND caps a public
ghost at ~4 scenarios. But the public inversion settles whether to ship it:
**late-days went UP (+75)**. If cert-first had caught even one real wobbler
death per few scenarios on public, late would have dropped by ~240 days per
catch. It caught ZERO. The local -37.9 was wobbler catches that the public
fleet does not offer below the cut; a guard cannot create catches that are
not there. Cert-first family closed entirely - the label-lag population
either does not exist on the scored fleets or is already inside the head.

## Phase 52 - building-grouped CV adopted; the contamination gradient quantified

Trigger: a sweep of every public competitor artifact (HF repos, hidden HF
branches, GitHub repos, and deleted-HF-repo cards recovered via the
686f6c61/radar-huggingface-dataset archive) established that the scored
public/private fleets hold FOREIGN BUILDINGS: the Attention-Heads card states
it outright, and the FAQ transcription in ziadnasif77-debug's repo puts the
full pool at ~200 buildings vs train's 24. Both serious hidden teams
(YassY-The-AlchemYst's RobustHazardPlanner lineage, ziad) validate and
calibrate building-grouped. Organizer-shaped conclusion, user directive:
the trusted offline fold must be leave-BUILDING-out.

Change (cv.py): `screen` gains a third grouping column, whole buildings
assigned to 5 folds greedily balanced by unique observed deaths (deaths are
lumpy - the top building holds 15/82, nine hold exactly one; random building
assignment starves folds). `static`/`ablate` already split by building
(fleet_halves), so this closes the last battery-grouped selection surface.
Selection guidance in the module now reads: building > battery > scenario.

Result, 3 fold-assignment seeds - rec12 margin over logistic (AUC margins
agree in sign; levels are NOT comparable across columns, margins are the
decision quantity):

| model | scenario | battery (s0/s1/s2) | building (s0/s1/s2) |
|---|---|---|---|
| logbag | +.003 | -.006 / -.004 / +.001 | -.002 / +.000 / +.000 |
| rf | **+.194** | +.023 / +.031 / -.008 | +.005 / -.005 / -.014 |
| gbm | **+.148** | -.000 / -.016 / -.026 | -.022 / -.039 / -.030 |

The contamination gradient is monotone: rf's +.194 phantom margin on
scenario folds collapses to ~+.02 on battery folds and to zero-or-negative
on building folds; gbm goes outright negative. The residual rf margin in the
battery column (sign-unstable across seeds) is sibling leakage - a held-out
device's building/batch mates stay in train. logbag == logistic (margin ~0)
in every column and every seed: the champion's model choice never rested on
fold luck, and the deployment-shaped fold CONFIRMS it rather than reversing
anything. No selection changes; the protocol does.

Standing rule upgrade (supersedes the blind-loop "group by battery" rule):
**group by BUILDING when the deployment is cross-building.** Battery
grouping is necessary but not sufficient; it still leaks the environment/
install-batch channel that phase 10/13 closed on the feature side.

### Phase 52 addendum - the building split extended to the COST harness (`all48oof`)

Directive (user, 2026-08-22): "building split not only for the AUC but for
the scenario split as well." New protocol `cv all48oof`: the walk-forward
cost harness with BUILDING-CLEAN predictions - each device's p42 at every
origin comes from a champion-config logbag fitted on pairs from every
building except its own (5 greedy death-balanced folds, OOF-stitched), then
the FULL fleet is planned as usual (planning must stay full-fleet: the count
rule scales with fleet size - the phase-26 static-gate lesson). Paired
`self` arm through identical machinery, cold-start floor OFF in both, so
the per-origin delta isolates the self-building fit effect. Read the DELTA,
not the level. Validity check: the self arm reproduces the canonical panel
1679.2 and near-end 604.8 exactly (floor only fires in warm-up).

| block | self | oof | delta/origin | oof-better W / self-better L |
|---|---|---|---|---|
| warmup s_0-7 | 4256.1 | 4180.0 | -76.1 | 6W / 2L |
| panel s_8-41 | **1679.2** | **1813.6** | **+134.4** | 8W / 26L |
| nearend s_42-47 | 604.8 | 757.3 | +152.5 | 1W / 5L |
| ALL-48 | 1974.4 | 2075.9 | +101.6 | 15W / 33L |

Ranking moves with the cost: panel rec12 0.572 -> 0.538, recall 0.571 ->
0.542, ALL-48 rec12 0.597 -> 0.560. Warm-up's negative delta is noise
(floor off, 3-20 train deaths). Reading: **self-building fitting flatters
the walk-forward by ~+134/origin on the panel**; the transfer-shaped cost
estimate for the champion on foreign buildings is the oof column. This is
the cost-denominated size of the contamination the phase-52 screen showed
as AUC margins - it prices the OPTIMISM of the harness, not a defect of the
champion (both arms use the same model family; there is no building-free
challenger that closes the gap, per the phase-52 screen). No selection
change. Results /tmp/cv_all48oof.csv, seed 0.

## Phase 50 - the forecast axis: fleet-learned conditional dynamics (construction and screens)

Directive (user, 2026-08-22): innovate on the FORECAST part; reinforced with
"benefit from more training data" and "a forecast as a model ensemble". The
phase-49 wall requires a NEW signal; this candidate brings one by
construction - auxiliary supervision on ~70k UNLABELED device-week
transitions from the 168-origin grid, so the effective-n~80 wall does not
apply. Machinery: `exp_x30_dynamics_forecast.py`; session-55 built an
independent implementation in parallel (HGBR rate model, refit cadence 8,
MC 120x6, generation-time ghost guard; artifacts /tmp/dyn/).

**Construction.** One-step (7d) voltage forecaster - HGBR conditional drift
on state + HGBR sigma + standardized empirical residual pool (plunge tails
survive sampling) - rolled 6 weekly steps, 200 paths; p_dyn = P(cross 2.40 V
within 42d). Dynamics AND residuals refit per origin on transitions ending
<= T (corpus 22k -> 64k across the walk). Differs from rejected WienerFHT
(phase 9): fleet-pooled nonlinear conditional drift, not per-device linear
drift; fixed-N delivery, so calibration never enters. GHOST GUARD from the
phase-48 lesson: below-2.40 devices keep base rank/probability - NOT a local
no-op (342 below-threshold rows at scenario origins, 236 never-labeled).

**Screens - the strongest fixed-N profile of the campaign** (paired,
bootstrap 95% CI, ghost-guarded): native +11 at N=16 (13W/6L), +13 [+5,+22]
at N=20 (12W/1L); gate +24 [+11,+38] at N=8, +23 [+11,+36] at N=12 (28W/7L).
Weight sweep w=0.1..0.5 positive in 39/40 cells - plateau, not knife edge.
Tail diagnostic: 30 of 104 champion misses at ranks 13-30 promoted into
p_dyn's top-12. Fuel: descent-band AUC 0.8005 vs v_last 0.8024 (891
positives), Spearman(p_dyn, v_last) -0.683. Runtime: 4.0s per split at 2x
fleet vs the 1800s budget. Checks passed: no leakage (per-origin refits),
weight robustness, runtime. What follows is why none of it survived.

## Phase 51 - the dynamics family: CLOSED (eight deliveries, two implementations, and the building-split autopsy)

**Cost harness, all arms, 1661.7 scale** (count pinned where stated):

| delivery | total | caught | mechanism of failure |
|---|---|---|---|
| rank_score blend37 | 1744.5 (+83) | - | inclusion reordered; placement/pricing believe base p42 |
| global p42 quantile-blend, pinned | 1717.1 (+55) | 287 | every device's day placement perturbed |
| band-limited (ranks 9-30), pinned | 1690.8 (+29) | 290 | catch parity; +13 late of timing noise |
| B: p_dyn as 14th feature, retrain (55) | 1710.1 (+48) | 295 | sched 13.4->13.9 - appetite in disguise |
| B pinned, 55's table | 1707.4 (+46) | 288 | count pinned -> catches DROP below base |
| B on c6 table | 1702.5 (+41) | 288 | same |
| B on c6 table, pinned | 1706.8 (+45) | 286 | same |
| rank-mean ensemble | moot | - | both parents dead on both tables |

Post-hoc blends fail as a class (beliefs inconsistent with count/timing
machinery); retrains fail as a class (the only "conversion" was calibration
inflation that pinning exposed as appetite).

**Cross-implementation check.** Two independent implementations agree at
Spearman only 0.369 on above-threshold nonzero rows; on max-disagreement
rows the ground-truth referee splits (0.680 vs 0.628 - both mediocre). The
MC tail probability is implementation-fragile; only the coarse ordering is
robust.

**The building-split autopsy (user question: "are you using the new
building-split CV here?").** The gate's logbag was always building-split,
but the DYNAMICS corpus pooled both fleets' transitions - deployment-legal
(label-free; the scored split ships its own telemetry), yet untested under
phase 52's trusted fold. Refit on FOREIGN-building transitions only:

| gate blend37 | N=8 | N=12 | N=16 | N=20 |
|---|---|---|---|---|
| pooled dynamics | +24 [+11,+38] | +23 [+11,+36] | +7 | +5 |
| foreign-only dynamics | -14 [-30,+2] | +1 [-13,+15] | -12 [-25,+1] | -10 [-22,+1] |

The entire screen gain was own-fleet telemetry memorization: each device
contributes ~160 near-duplicate transitions, HGBR memorizes device-specific
drift signatures, and p_dyn partially encodes "this device has been
declining" - which the level features already price. This is the phase-40
CV-contamination lesson recurring one level down, in a LABEL-FREE model:
grouping discipline applies to self-supervised corpora too, not just
label fits. It also explains the implementation fragility (different
configurations memorize different signatures - fine values diverge, real
descent agrees) and why the harness never converted what the screens
promised.

**Verdict: family closed for this competition. No submission.** The signal
looked real (band AUC 0.80, -0.68 to v_last) but the transferable component
is ~zero under the building fold; the apparent independence was memorized
device identity. Corollaries, binding on the next candidate: (a) the
phase-52 building fold applies to auxiliary/self-supervised training
corpora, not only label models; (b) a screen gain that the cost harness
cannot convert is now a two-time pattern (47, 51) - suspect the screen's
population before suspecting the delivery.

Standing: local champion base 1661.7 (cert-first off), public champion
**3c7b883 at 1661.45**. Deadline 2026-08-23.

## Phase 53 - the user's re-adjudication directive: promising ideas vs the building-split CV

Directive: retry the most promising rejected ideas against the new
building-split instruments. Inventory first: everything from phases 41-51 had
ALREADY faced a building-split instrument (the gate splits by building since
phase 40), so the genuinely untested cells were the phase-15 ghost mechanisms
(rejected pre-gate, on the native panel only) and the feature variants through
the Phase-52 building screen column. Four parallel measurements, base
reproduced at 1661.7 in every arm.

| candidate | cost harness (ALL-48) | building gate | verdict |
|---|---|---|---|
| GHOST_ZERO | **+472.7** (10W/37L; late +573, early -109) | rec@20 0.866 -> **0.681**, -180 caught (4W/136L) | REJECT |
| QUARANTINE | **+395.0 +/- 68.2** (13W/35L; late -189, early +539) | flat: -10/-6/-10/+4/-4, all noise | REJECT |
| both | **+682.9** (9W/39L) | rec@20 -> 0.674, -187 caught | REJECT |
| vcorr / zone / vrel | (native refs +32.7/+104.9/+138.7) | screen margins **negative at rec@12 in nearly every fold draw** | CONFIRMED REJECTED |

Two mechanisms worth the record:

- **GHOST_ZERO's mask is not ghost-specific.** days_below_245 is sticky, so
  the zeroed pool GROWS across the walk (2-6 devices early, 33-42 by s_24+,
  mean 22.4/scenario) and ~12% of it (128 devices over 48 scenarios) are real
  in-window deaths - each becomes a guaranteed miss. The foreign-fleet hope is
  quantified away: a target fleet would need a ghost-to-death ratio in the
  below-2.45 pool far beyond anything the building split simulates before the
  ~111-early-days-per-avoided-force-swap saving covers the misses.
- **QUARANTINE's "label noise" is calibration ballast.** Dropping the
  looks-dead-labeled-alive negatives barely changes ordering (p42 Spearman
  0.9905 at s_20) but nearly DOUBLES the p42 level (0.0187 -> 0.0345): those
  mislabeled rows are the only counter-evidence that plunge signatures can
  survive, and removing them inflates every probability the count rule and
  the ec-margin logic consume. Late improves (-189), early explodes (+539).

The building screen column itself AGREED with the native cost harness on all
three feature variants - tiny uniformly-positive AUC margins with negative
operating-point recall, the familiar mid-list-reshuffle signature. The
transfer-shaped fold offers no grounds to revisit anything.

**The re-adjudication is complete and the record is now closed on every axis
under the deployment-shaped instruments.** Champion 3c7b883 / current head
(static @ 0.8, cert and pooling off) stands. Endgame per the user's mechanics
(private = user-selected past versions): score the current head publicly; if
~1661, select the head for private (robustness-hardened); else select 3c7b883.

## Phase 54 - full re-adjudication complete + the CV settles (user-driven)

### (a) The exhaustive re-try of every rejected idea (user directive)

10-agent sweep over the entire EXPERIMENTS.md candidate history on the
then-current instrument pair, base reproduced at 1661.65 in every arm.
All planners (14 arms, +343..+954, all REJECT), all model families (4 slices,
~50 arms, zero ALIVE - logbag==logistic now confirmed on four instruments),
all feature re-adds (calendar/vproj/ranks/fht_days/temp30/dbz/stale2 -
REJECT; temp_mean upgraded from 'absorbed' to actively harmful +54.5),
timing target days-to-crossing (+35.2 REJECT, with the label-process
refinement that the administrative EOL is stamped ~AT the confirmation day,
not +3d after), and the 87-config timing-knob grid whose single nominal
survivor cfg59 (ec_margin 0.6 / emergency_day 48, -6.61 +/- 3.10, 6W/0L/42T)
was killed on the building-OOF surface (+14.97 +/- 22.05) - textbook
best-of-87 selection noise with the cert-first W/T profile. The peer session's
parallel building-OOF candidate sweep confirmed 23 of 24 rejections and
parked its one coin-flip survivor (rankavg25fht: wf-OOF panel -48.6 at
17W/16L, self-fit +17.8 with catches -2, static multi-seed never run).

### (b) THE SCORE - the CV settles (user decisions, in order)

1. Building split is the score, always (not the self-fit 1661.7).
2. Foreign buildings' FULL history (before and after the origin) is legal
   training data - deployment itself hands the model future-of-origin
   foreign-building knowledge, and it removes the cold-start distortion.
3. Per-building planning (cv lobo) was specified, built, and superseded the
   same day: it breaks the count rule by construction (129 zero-swap-death
   building-scenarios, recall 0.367 vs 0.542; per-device thresholds fix the
   recall - 0.766 at p*=0.10 - confirming the break was count granularity,
   not prediction). Kept as a diagnostic.
4. Final protocol: EXACT leave-one-building-out predictions (24 models, each
   trained on the other 23 buildings' full closed history), ONE full-fleet
   plan per scenario, single value = ALL-48 mean.

**Champion on the final CV: `cv all48oof` SCORE = 1877.3** (72 s per run;
5-fold approximation was 1913.3; panel 1857.7). Reference chain for level
sanity: self-fit 1661.7 < exact-LOBO 1877.3 < 5-fold-OOF 1913.3 - more
foreign training data helps, self-building identity flatters by ~200.

Everything is judged against 1877.3 paired per scenario from here, sched-flat
rule in force. Public best remains 3c7b883 at 1661.45; private selection
recommendation unchanged (score the hardened head publicly, then select).

## Phase 55 - THE SCORE final: temporal-purge CV, sole validator (user directive)

The CV settles for good, three user decisions in one afternoon session arc:

1. **Protocol** (implemented by session 59): for each scenario, ONE model
   fitted on ALL buildings' pairs whose 42d label windows lie fully outside
   the scenario window (`origin+42 <= T or origin >= T+42` - label-overlap
   purge), whole-fleet prediction, ONE full-fleet plan, cost per scenario.
   SCORE = ALL-48 mean, floor off. Rationale (user): admits every forecasting
   method (no fold plumbing), one-sentence protocol, no leak within the
   scenario, and the temporal shape matches deployment (training data spans
   before and after most scored origins - phase 43a measured 93.9% window
   coverage). The building axis is deliberately not validated (user judgment:
   same battery type across buildings).
2. **Sole validator** (user, verbatim intent): "we only use purge score going
   forward, nothing else to validate a new model or optimization method."
   Documented as standing rule. LOBO's chimera-plan critique (24 stitched
   calibrations, no per-building cost attribution, seams inflate the transfer
   penalty) was the user's decisive argument against building-holdout cost.
3. **Consolidation**: cv.py now contains ONLY the purge harness +
   oofcand/oofreport. all48/static/screen/lobo/ablate/wf/self removed;
   recover from git 2000281. exp_x29/exp_x30 no longer run as-is.

**Champion on THE SCORE: 1972.0** (warmup 3560.3 / panel 1839.6 / nearend
604.8). Level chain, never cross-compare: self-fit 1661.7 (floor on) <
exact-LOBO 1877.3 < 5-fold-OOF 1913.3 < purge 1972.0.

Paired purge-vs-LOBO diagnosis (59's run; LOBO reproduced 1877.3 exactly
before removal): the purge is HARSHER overall (+94.7) - entirely warm-up
(3560.3 vs 2875.3: purging the calendar-local +/-42d window starves early
scenarios more than building-holdout does) - and modestly softer on the panel
(-18.1/origin; sched 8.9 vs 9.2 flat, recall 0.468 vs 0.461, rec12 0.576 vs
0.509). Reading: the same-device-fate channel exists but is ~-18/origin for
the LINEAR champion - an order of magnitude below the +134/+216 self-fit
flattery - because the label-overlap purge removes the direct channel and
logbag cannot memorize identity. The known, accepted residual risk: flexible
challengers (rf/gbm/dynamics) are flattered by same-battery training; the
receipts are phases 51-54 and they are not to be re-argued unprompted.

The leaderboard closures (appetite, cert-first, pooling) rest on public
measurements and survive any CV change. Public best 3c7b883 at 1661.45;
private selection recommendation unchanged.

**Phase 55 addendum (2026-08-22, user): harness de-tuned from the champion's
output shape.** "cv.py is tuned towards our current model (rec12 rec20 etc),
remove those to make sure we can use the cv on any method we try." Removed
the `rank_stats` call and every column built on it (rec12/rec20/recall/prec/
miss_rank/n_sched/caught/n_deaths) - all assumed the method emits a
per-device p42 ranking. The harness now requires only that a method produce
a PLAN; the one diagnostic kept beside the cost blocks is `swaps` (in-window
unique batteries read from the plan itself), preserving the phase-39/51
appetite-in-disguise guard method-agnostically. Cost path untouched: SCORE
reproduced 1972.0 exactly post-change (106s). `models_cv.rank_stats` remains
for ad-hoc ordering diagnostics on methods that do rank. CSV SCHEMA CHANGE:
/tmp/cv_all48oof.csv and cv_oofcand_* now carry n_swaps instead of the rank
columns; the pre-change stale candidate CSVs were deleted (they were
denominated in dead instruments regardless - any candidate must re-run fresh
through `cv oofcand <label>`).

## Phase 56 - full re-adjudication under the purge + radical-pipeline campaign; NEW CHAMPION logbag_rank+gbm30 (1630.3)

User directive: re-run ALL improvement ideas on the purge instrument, including
previously public-refuted axes ("remove the closed line... we can re-try all of
that"), spin off agents, be radical ("change the whole pipeline method").
Execution: 11 parallel lanes, ~250 candidates, every full-48 run paired per
scenario against the champion baseline. Harness verified DETERMINISTIC
(champion repeat = bit-identical on all 48), so paired SE is scenario-sampling
noise only; survivor bar = delta < 0 beyond ~2*SE at ~flat swaps.
Live per-lane records: agent_reports/*.md (kept in-repo).

### NEW CHAMPION (adopted): logbag_rank + gbm value-preserving rank blend, w=0.30

    cv.run_all48_oof(kind='logbag_rank', blend=('gbm', 0.30))
    THE SCORE 1630.3 vs 1972.0  (-341.7 +/- 103.8, t=-3.3, 37W/11L,
    swaps 9.23 vs 9.21 flat; wins all three blocks: wu 2276/panel 1677/ne 504;
    gain entirely late_swap: -305 of -342)

Components, independently discovered and individually significant:
- logbag_rank (champion + within-origin fleet-rank features r_vlast/r_tau):
  -225.6 +/- 74.0, 34W/11L. Linear, rank-based, no same-device channel. This
  kind was REJECTED on the old self-fit instrument (phase 8); purge reverses.
- gbm order increment on that base: -116.1 +/- 53.6, 31W/13L. Broad weight
  plateau (.25/.30/.35 all <= -335). CAVEAT (md lane): a monotonic-constrained
  HGB partner DESTROYS the increment (+142..+269) - the gbm contribution is
  specifically non-monotone response, i.e. real interactions or residual
  same-battery flattery. Accepted risk per standing directive; public arbiter.
Local optimum confirmed by 5 lanes: hyperparams (C=3 coin-flip -15.0+/-13.2,
W/L against - kept C=1), features (12 full runs, all subsumed by r_vlast/r_tau;
r_tau load-bearing), training weights (proximity/dedup/hard-example all
neutral-to-worse on the frontier), neural rankers (RankNet/ListNet lose
head-to-head +99..+120), physics blends (sim-rank 1.9sigma on old champ, ghost-
promoting). vrel subsumed by ranks (worse in both combos).

DEPLOYMENT: submit.py FrontierRUL (BATTERYSWAP_FRONTIER=0 reverts to logbag).
Fidelity test: bit-exact vs the CV candidate on s_10/s_30 (max p42 diff 0.0,
ordering identical). Fit ~3.3s incl. gbm; budgets and degradation paths
unchanged. cv.py CHAMPION now carries the blend (candidates with explicit
kind/blend do NOT inherit it).

### INSTRUMENT CALIBRATION - the campaign's most important negative result

The purge CANNOT adjudicate two classes, proven by public anti-correlation:
1. COUNT-COUPLED changes: purge alpha curve is monotone DOWN to 1.5 (-202)
   - the exact config the public refuted at +527 (phase 28). Same shape via
   p_be top-ups, EC-inclusion counts, dedup class-rebalance (tr: the -117
   dedup win is 80% a smuggled +1.7-swap appetite shift; its count-matched
   twin is -24 n.s.), gamma flattening, cohort gates.
2. LABEL-PROCESS exploits: wd re-derived cert-first on the frontier at
   -26.2 (3W/0L/45T) - the EXACT local signature (-37.9, 3W/0L/45T) that
   preceded the public +43.2 (phase 48, tested ISOLATED on the clean stack;
   the lane's exculpation claim was checked against the record and is FALSE).
   Ghosts (crossed-never-labeled devices) exist publicly, are zero in train,
   and are invisible to ANY local instrument.
SHIPPING BAR going forward: ordering-only, label-process-free, swaps flat.

### Report-only results (real on the purge; fail the shipping bar)

- pl_stack_hgatez (frontier + arrival-triggered p_be=0.2 top-up): 1559.4
  overall best raw number, but the gate's marginal on the frontier is
  -70.8 +/- 42.4 at +3.2 swaps with panel n.s. - count-coupled. The frontier
  self-repairs warmup (its wu swaps 9.9 vs 5.0), removing the gate's niche.
- pl_stack_shiftp4 (visit day 4*p42 days earlier): 1614.0; swap-neutral and
  reproducibly negative on two bases (champ -13.2+/-9.4, frontier marginal
  -16.3+/-10.9) but sub-2sigma each. Optional public A/B candidate.
- tr_hard_prox60 (hard-band x3 + proximity hl60 weights): -107.5 +/- 41.2 on
  the PLAIN base only (2.6sigma, swaps flat) - subsumed by the frontier.
- sv_dhgate (censored-pool discrete-time hazard when train deaths < 20):
  -51.4 +/- 22.1 - real, but the gate NEVER fires in deployment (full-history
  fit; cf. phase 36's inert warm-up mechanism, same effect size).
- tj_blend25e3 (MC voltage-trajectory sim rank blend 25%): -86.1 +/- 45.5
  (1.9sigma) on the old champion base; promotes crossed-unlabeled devices
  (cert class) - report-only. Standalone physics pipeline: honest negative
  (labels carry unrecoverable info; count-matched it catches fewer deaths).

### Closed by this campaign (with numbers, on the purge)

Planner: day placement CONVERGED (e2 surrogate local search -1.7+/-1.6 for 4x
effort; ed/sd/blend day variants reject); piggyback/second-chance swaps dead
(+8.8/+52); EC-economics count dead (inferior appetite); CVaR/portfolio dead
(deaths do not cluster by building). Models: survival family dead (aft +337,
cox +546, wiener +1100); conformal = byte-identical to logbag; building fixed
effects dead (+423/+48); MoE/staleness gates inert; calibration null-to-
harmful (Platt +21, isotonic -16.8 n.s.); MLP noise. Features: raw levels
fail where ranks transfer (whit +43 raw vs -49 ranked); aux families dead
(+95..+124); v_last_only +453 (blind-repo phase-39 claim dead on this
instrument); top-12 slot squatters are label-process ghosts that still die at
19% - no flag can demote them profitably. Training: recency dead, proximity
real-but-subsumed; label windows d35/d21 count-starve (+72/+105); building-
balanced +40; thinning +19..+32; past-only pool +19 (future-side purge pairs
stabilize fits). Candidate CSVs: /tmp/cv_oofcand_*.csv (~180 full-48 files).

### Phase 56 addendum - PUBLIC REFUTES the unanchored frontier (698401a: 1877.08); mechanism found and fixed same-day

| | swaps | late-days | early-days | total |
|---|---|---|---|---|
| champion 3c7b883 | 580 | 5819 | 13197 | 1661.45 |
| frontier 698401a | 517 | 7076 | 8011 | 1877.08 |
| delta | **-63** | **+1257** | -5186 | +215.63 |

The failure is a COUNT collapse, not (necessarily) an ordering failure: the
value-preserving blend preserves the PRIMARY's (logbag_rank's) p42 values,
and under deployment's PAST-ONLY fits that model's calibration collapses as
the pool grows - measured sum(p42) ratio vs plain logbag: 1.02 (s_5), 1.01
(s_15), 0.95 (s_25), 0.80 (s_35), 0.78 (s_45). Public scenarios live in the
late-origin regime -> -11% swaps -> ~+5 extra misses/48. The purge CV could
not see it: its fits train on BOTH sides of the window, where the two models
calibrate identically (swaps 9.23 vs 9.21). Fourth public refutation of a
locally-validated intervention (alpha, cliff, cert, unanchored frontier) -
but the first with the failing channel measured and separable.

FIX (same commit): FrontierRUL now VALUE-ANCHORS to plain logbag
(BATTERYSWAP_FRONTIER_ANCHOR=1 default): the donor logbag supplies p42
values - count/pricing/timing byte-equivalent to the old champion's measured
580-swap calibration - and the rank+gbm frontier supplies ONLY the order.
Ordering-only in deployment by construction, not just in CV. Verified at
s_35/s_45 (worst collapse origins): anchored sum(p42) == plain logbag
exactly; order == frontier blend exactly (top-13/top-25 sets identical;
tie-aware rank comparison zero mismatches). What the anchored head tests
publicly, cleanly for the first time: is the frontier ORDER better on the
scored fleet? Downside is bounded to ordering (count machinery is the
measured champion's).

### Phase 56 addendum 2 - full decomposition: the frontier's purge gain was a hidden per-scenario appetite dial; head reverted to legacy default

Anchor decomposition on the purge (all paired, 48 scenarios):
| arm | values (count source) | order | SCORE | vs old champ |
|---|---|---|---|---|
| unanchored frontier | logbag_rank | frontier | 1630.3 | -341.7 (publicly +215.6) |
| scale-anchored | lbr shape, donor sums | frontier | 1925.1 | -46.9 +/- 42.6 (33W/14L, n.s.) |
| value-anchored | plain logbag | frontier | 1934.8 | -37.2 +/- 44.1 (n.s.) |

The smoking gun: mean swaps are FLAT (9.21 vs 9.23) but per-scenario counts
swing |d| = 2.56 on average (23/48 scenarios differ by >= 2), and
corr(count delta, cost gain) = 0.759. The 15 scenarios where logbag_rank's
sum(p42) swelled the budget carry +956 gain each (~= the entire -342); the
25 where it shrank carry -2. MECHANISM: in both-sides purge fits, future-side
pairs from a deadly era raise the fitted base rate exactly in deadly
scenarios - era-level hazard leaking through CALIBRATION. The label-window
purge cannot block it; deployment's past-only fits cannot replicate it
(measured collapse 0.78-0.80x at late origins); the public board refuted it
(-63 swaps, +215.6). PURGE LIMITATION #3, and it retroactively weakens every
"swaps flat at the mean" clearance in this campaign: the shipping bar is now
COUNT-MATCHED (value-anchored) evaluation, where the frontier's true
ordering value is -37..-47 +/- 43 - real-looking W/L (33/14) but sub-bar.

ACTIONS: BATTERYSWAP_FRONTIER default OFF (head = legacy logbag champion,
the measured-1661.45 behavior, plus all hardening); frontier dials retained
for explicit A/B (ANCHOR=scale|value|off, W2). No model-side campaign
candidate survives count-matched adjudication. Instruments going forward:
deployment-mirror walk-forward (past-only fits) as the public predictor;
building-GroupKFold with test-group-planned-as-fleet (user proposal,
2026-08-22) as the held-out/private-fleet predictor.

## Phase 57 - CV replaced (user directive v3): building-GroupKFold, test group planned as a standalone fleet

The temporal purge is RETIRED as THE SCORE (its three deployment blind spots
are the phase-56 record). New sole harness in cv.py: buildings -> 5 folds,
stratified deterministically on failure count (snake assignment; fold deaths
22/18/14/15/13 over 5/5/5/5/4 buildings) and travel centrality as the
location proxy. Per fold: ONE fit on the TRAIN buildings' closed pairs (full
history - deployment-legal for foreign fleets), then for each of the 48
scenario times the TEST buildings are planned as a COMPLETE standalone fleet
and costed. SCORE = mean over folds of fold-mean cost. This is a measured
simulation of submit.py's held-out (static foreign fit) path - the path the
private split's unseen fleets will take - with no per-building attribution
problem (the fleet IS the test group) and no partial-fleet count bias
(phase 26). Fits never see the test buildings; nothing sees the future of a
label it trains on beyond what deployment itself would know.
CLI: `cv bgkf` / `cv cand <label>` / `cv report`. Purge harness recoverable
at f5f3fda; walk-forward family at 2000281. Candidate rule strengthened by
phase 56: wins must hold at ~flat swaps PER CELL, not just at the mean.

Phase 57 baseline (champion = deployed plain logbag): **SCORE 352.0**
(folds 489.0/322.6/365.9/289.1/293.7; blocks wu 523.2 / panel 354.7 /
nearend 108.8; swaps 1.9/scenario on ~90-device test fleets - the count rule
scales with fleet size as designed). NEW DENOMINATION: per-test-fleet cost,
never cross-compare with the full-fleet instruments (1972.0 purge / 1661.7
self-fit). Harness runtime 22s - cheap enough to run per candidate without
triage subsets.

Phase 57 alignment check vs recorded public scores (user request; pooling
arm killed mid-run): champion 352.0 reference; cert-first bgkf -7.3+/-4.3 vs
public +43 (flip); frontier -5.3+/-7.4 vs public +216 (flip, but far less
fooled than the purge's -342, and it reproduces the public swap-count-drop
direction); alpha 1.5 -28.8+/-13.6 at swaps 3.15 vs public +527 (flip -
still rewards appetite; note 65W/118L, the count-asymmetry signature).
Verdict: better than the purge, still sign-flips all three public killers -
fleet-composition facts (uncatchable public tail, train-absent ghosts) are
invisible to ANY local split. The structural shipping bar (flat swaps per
cell, no label-process exploits) remains the only local defense. One
coherent cross-fleet signal: vrel -13.4+/-7.9, 104W/61L, swaps flat.

## Phase 58 - definitive local-vs-public coherence check on the v5 harness (deployment-faithful GroupKFold)

All five publicly-measured configs reproduced AS SHIPPED (the alpha point as
the true ALPHA_STATIC=1.5 + CLIFF_SCALE=2.2 stack driving the count through
p42_sum; cert stacked on rank_score; pooling with time-masked own pairs;
deployment-exact planner state incl. the gated floor; v5 baseline = 352.0,
byte-identical to v3, floor confirmed inert):

| config | local delta +/- SE | swaps | public delta | decision at the 2-sigma bar |
|---|---|---|---|---|
| alpha15+cliff22 | -15.4 +/- 16.8 | 4.18 | +527.3 | NOT adopted (0.9 sigma) - correct |
| cert-first | -7.3 +/- 4.3 | 1.90 | +43.2 | NOT adopted (1.7 sigma) - correct |
| pooling | +10.2 +/- 3.6 | 1.92 | +4.4 | rejected - SIGN AGREES |
| frontier | -5.3 +/- 7.4 | 1.79 | +215.6 | NOT adopted (0.7 sigma) - correct |
| (alpha15 solo, no public point) | -28.8 +/- 13.6 | 3.15 | - | 2.1 sigma BUT count-coupled (swaps +1.25) -> quarantine rule catches it |

VERDICT: the v5 CV cannot reproduce public MAGNITUDES (ghosts and the
uncatchable tail are absent from every local fleet - unfixable), but as a
DECISION INSTRUMENT the full protocol - v5 harness + 2-sigma adoption bar +
count-flat rule + no-label-process rule - makes the correct call on all five
public measurements: zero false adoptions, one correct rejection with sign
agreement. Notably the faithful reproduction itself mattered: alpha-solo
reads a confident-looking -28.8 (2.1 sigma) while the actually-shipped
alpha+cliff stack reads a statistical zero - earlier alignment checks that
approximated configs overstated the misalignment. Residual sharpest risk:
cert-class (1.7 sigma local win, public +43) - the label-process quarantine
is what protects against it, not the harness.

THE CV going forward: v5 building-GroupKFold (deployment-faithful held-out
simulation, one instrument for public AND private - both are ~2x held-out
fleets), used for ordering/model questions under the quarantine rules.

Phase 58 addendum (user): SCORE aggregation switched to the familiar
full-fleet magnitude - per scenario the 5 fold costs are SUMMED (every
building is out-of-fold exactly once per scenario -> the sum is the
all-24-building out-of-fold cost), SCORE = mean of the 48 totals.
**Champion baseline: SCORE = 1760.2** (warmup 2616.1 / panel 1773.4 /
nearend 544.0; swaps 9.5/scenario). Identical information to the fold-mean
form (352.0 x 5), same paired decisions; stale pre-v5 candidate CSVs purged
from /tmp (only the phase-58 faithful runs remain valid).

## Phase 59 - campaign 2 (bgkf instrument, 7 lanes) closes; frontier ft_vmin7r_wnr20 ADOPTED and deployed (3f9bf12)

Deadline-day morning. Campaign 2 re-tested every prior method plus radical
non-p42 pipelines on THE SCORE (bgkf v5 summed, baseline 1760.2), with a
coordinator-maintained FRONTIER board for cross-lane composition
(agent_reports_bgkf/). Overnight outage (repo re-cloned, /tmp+venv+dataset
lost) fully recovered: dataset copied from rul_mgt_zero, venv symlinked to
the blind repo (versions identical), baseline and every headline number
reproduced BIT-EXACT (the harness is deterministic end to end).

**ADOPTED - ft_vmin7r_wnr20 (commit 3f9bf12, BATTERYSWAP_FT2 default ON):**
logbag on FEATURES+vmin7_rank, wiener .20 value-preserving order blend.
1688.4 vs 1760.2 = -71.8 +/- 23.5 (3.05 sigma, Wilcoxon .037, swaps 9.58
flat, count-clean by every control, components additive -50.3 wiener /
-23.2 vmin7r, reproduced exactly by ft, md and rk lanes independently).
Deployment review that preceded adoption:
- Reference-shift worst case (the vrel killer): vmin7_rank recomputed
  WITHIN each ~5-building test fleet -> still -60.8 +/- 26.3 (2.31 sigma);
  consistent small degradation vs table-native (+11.0 +/- 17.9, 9W/35L).
  Deployment ranks over a full ~922-device fleet (features_at_origin
  own-fleet semantics), closer to the shared-reference case.
- Ft2RUL parity: submit.py implementation run through the CV harness
  reproduces the frontier CELL-EXACT (max diff 0.0, swaps identical).
- Deployment data path: wnr_m/s2/n merged into the shipped train table
  (97% coverage; WienerFHT shrinks through NaNs); split-path wiener params
  computed past-only from the scored split's own telemetry (1.3s once +
  0.1s/scenario). Soft degradation: missing wnr -> pure vm7 ordering
  (values identical by construction); any fit error -> legacy champion.
  BATTERYSWAP_FT2=0 = the measured-1661.45 config.

**NOT adopted (the two bigger nominal numbers):**
- rk_4w (vm7 values; order .35 logbag + .20 wiener + .20 RankNet + .25
  aux_ho) = -111.5 +/- 27.7, 4.02 sigma, Wilcoxon .001 - the campaign's
  strongest fully-anchored number, seed-block replicated. Head-to-head vs
  the frontier: -39.7 +/- 20.3 but 15W/15L/18T, Wilcoxon .131 - mean-only
  support; plus a torch dependency (MLP 32-16 x 7 seeds) the Docker is not
  known to carry. SHELVED (agent_reports_bgkf/artifacts/).
- wd raw vm7+aux_ho+wiener.20 = -126.4 +/- 43.8: rk's 4-way control run
  settled the adoption form - aux_ho as an ORDER source adds +6.1 n.s. on
  the frontier, so the raw excess is VALUE-CHANNEL (the calibration channel
  publicly refuted in phase 56). Report-only. aux_ho's anchored ordering
  core (-59.7 on champion base) is real but subsumed.

Lane verdicts (all closed, findings files final): pl - ranking is the wall
(~99% of late cost = exclusion misses; routing axis +/-1). tr - keep the
training pool exactly as-is; value-anchored twin flipped every count-smuggle.
bl - wiener .20 the one piece; bagging/local-blend/calibration refuted.
md - logbag(C=1,b=15) locally optimal; monotone HGB real (-44.7 anchored)
but subsumed (+1.0 as third source); MORE BAGS HURT. ft - vmin7_rank the
piece; entire vrel family quarantined (anchored twin +21.4, within-fleet
recompute +89). rk - see above. wd/radical - physics loses to the 82
labels at matched count (+604); EC planner = count knob; direct death-day
rejected both ways.

Private-selection matrix as of this phase: candidate head = 3f9bf12 (FT2
frontier); fallback = 3c7b883 (measured 1661.45); never 698401a (1877.08).
The user manually triggers public scoring; a public look at 3f9bf12 prices
the residual ghost/composition risk the CV cannot see (phase 58).

## Phase 60 - campaign 3: exhaustive post-frontier exploration; frontier confirmed as the pipeline ceiling

User directive: improve the champion CV further, radical options included,
review all assumptions (podium context: team-repo scale ~1400). ~45
candidates over 7 waves + 2 device-level autopsies + full mining of the
team repo (rul-mgt-zero, 1493.65 public vs our 1661.45). Full detail:
agent_reports_bgkf/c3_findings.md.

KEY FINDINGS:
1. AUTOPSY overturns the silent-death assumption: frontier recall is 48%;
   237 missed deaths at median rank 5 (gap quartiles 2/3/8 below a ~rank-2
   cutoff) carry 70% of remaining cost; only 45/237 are voltage-silent.
   False includes are plateau devices at 2.41-2.44V for 40+ days (36% die,
   median 83d — just outside the window). The prize is top-band ordering.
2. No candidate reaches it: every feature/order/model/count axis measured;
   best survivor is a -6-point crossing-label micro-piece (xlb, Wilcoxon
   .0475, shelved). ft2 (1688.4, 3f9bf12) is the ceiling of this pipeline
   under the count-clean bar.
3. Appetite re-audited and re-closed: alpha 1.0 reads -64.5 mean but
   17W/24L, Wilcoxon .375 — warmup-carried count redistribution; gap-band
   precision ~11% < ~16% break-even.
4. Team repo decoded: their edge = multi-level self-supervised targets +
   poskeep_target sampling (-155.6, not portable — we already train on all
   rows) + CP-SAT planner over all nine cost components. Their CV is
   in-fleet (1412.6 not comparable to our held-out 1688.4). Direct feature
   transplant fails in our model form (+15..+167). Cross-pollination
   candidates TO them: WienerFHT order blend, vmin7_rank, building-held-out
   transfer check; their gen-10 state-dependent dV/dT (resistance channel)
   is the strongest open lead anywhere.

STANDING RECOMMENDATION unchanged: public-trigger 3f9bf12/head; private =
3f9bf12 unless publicly refuted, else 3c7b883; never 698401a.

## Phase 61 - team solution evaluated ON our bgkf; operating-point finding; alpha-1.0 A/B prepared

User directive: run the team repo's stack under our CV and adopt structural
changes if they improve it. Full port (panel rebuilt on our dataset with
81/81 exact EOL reproduction; model retrained building-OOF, h42 AUC 0.961;
CP-SAT planner) plus four mix-and-match decompositions. NO ADOPTION:
their full stack +228 vs ft2 (p .017, over-buys on ~90-device fold
fleets); their ordering loses decisively anchored (+412, monotone
dose-response at every weight); our ft2 model driving their CP-SAT lands
at -96.3 mean but 16.4 swaps/scen, 25W/23L, Wilcoxon .72 = count-carried,
mean-only. Instrument caveat recorded: their machinery targets 460-920
device fleets; our folds are ~90 - public is the only cross-pipeline
arbiter (them 1493.65 vs us 1661.45).

OPERATING-POINT FINDING (leaderboard decomposition): the entire podium
swaps 15-17.6/scenario with ~60-70 late-days/scen vs our 12.1 swaps and
121 late-days; the CP-SAT mix independently lands at the podium's
operating point on our predictions. The alpha-1.5 public failure (6ea03da,
zero catches) was on the OLD ordering; whether ft2's ordering converts
extra appetite publicly is the one open question a public trigger can
answer. PREPARED: commit 296f8f2 = alpha 1.0 on ft2 (single variable,
selectable for public scoring); head 7d7632c keeps the safe 0.8.

## Phase 62 - synthetic scaling study (user directive): CV tested on fleet-size scaling; fixed-reference vmin7 dial shipped

Synthetic fleets at 1x/2x/4x (461/922/1844 devices) from time-shifted
building clones with OFFICIAL-mechanism-derived EOLs (0 mismatches on the
checkable set at every scale); deployment-faithful static-path runs;
anchor k=1 champ = 1762.5 ~= bgkf 1760.2 (same recall .471). Verdicts:
count rule scales cleanly (swaps/death 0.98-1.07); live-rank vmin7_rank
decays and inverts at 4x while a train-ECDF fixed-reference form is
scale-neutral (shipped as BATTERYSWAP_FT2_FIXEDREF, default 0 - the Docker
rehearsal measured 922-device splits = the safe 2x regime); alpha 1.0 best
at EVERY scale with recall +7pts held (third independent support for the
296f8f2 public A/B); runtime 3.4s/scenario at 4x - no budget risk. Full
tables: agent_reports_bgkf/c3_findings.md.

## Phase 63 - PUBLIC CONVERSION: head 4c93883 measured 1575.31 (deadline day); wave T all dead

The user triggered public scoring on head 4c93883 (CV 1545.4; values
lb(vm7)@alpha1.0, order .50 logbag + .30 wiener + .20 gapHGB,
value-preserving): **public 1575.31**, -86.1 vs the 3c7b883 champion's
1661.45. Components invert to exact integers (clean run, default
settings, 48 scenarios): 644 swaps (13.4/scen, was 580 at alpha .8),
5009 late-days (104.4/scen, was ~121), 19716 early-days. CV->public
transfer +29.9 (~2%): bgkf v5 priced the whole stack (ft2 ordering +
alpha 1.0 + gap-HGB + weight tweaks) correctly - the first
locally-validated intervention stack to survive public after three
pre-bgkf refutations. PRIVATE SELECTION: 4c93883 (hedge slot, if any:
3c7b883).

Wave T (post-ship, 13 arms, paired vs 1545.4): ALL DEAD - the champion
is a local optimum on every axis touched. Wiener THRESH 2.40 beats
2.38/2.42 (+39/+45 - the labeled barrier is also the ordering-optimal
barrier); K_SHRINK 6 vs 3/12 flat/+9; gap-weight .15 shelf +30/+29;
gapHGB seed-bag +34 at 2.0sig (seed-0 is favorable; do NOT "stabilize"
it away) and lr .03 +12; rank-shape transforms pow2/sqrt/logit
+4/+42/+58 (linear pct-rank blending confirmed); GAP4 inside the logbag
order-primary +123 at 2.3sig (gap features only work as a separate
voice); RankNet 4th source at .10 +22. Driver /tmp/c9/run.py (volatile).

## Phase 64 - T2 five-lane subagent campaign on the 1545.4 champion: one adoption (lam2sp3 planner objective), four axes closed with structure

Five parallel lanes, each paired vs the champion on bgkf (reports:
agent_reports_bgkf/t2_{timing,planner,order,counts,hazard}.md):

- TIMING: closed. Early cost decomposed - 74% imputed-EOL false positives
  (never die in-window), 19% real deaths beyond the window, 7% genuine
  early timing; planner packing is 0.6%. Every date shift trades early
  for late at slope >=0.86; best arms 1.0sig AND count-coupled. EARLY is
  a selection problem, not a dates problem.
- PLANNER: **ADOPTED lam2sp3** - timing curves x2 inside optimize_days'
  objective (new TIMING_WEIGHT dial) + SPLIT_DAYS 7->3. -4.11 +/- 1.41
  (2.9sig), 25W/4L, Wilcoxon 8.8e-6, count-flat with battery sets
  cell-identical; dose-response plateau on both dials; additivity checks;
  survives ~35-arm multiplicity (sign p 1e-4). Mechanism: refuses cheap
  trip-merges that drag swaps off timing-optimal days (late -3.5, early
  -1.2, mobility +0.8). Also: plan-phase scheduling is SATURATED past its
  own surrogate optimum (exact enumeration is +5.1 WORSE - shallow search
  is an accidental regularizer; closes the CP-SAT question for good);
  of 232/scen "ops" cost only 78 is schedulable, 154 rides on missed
  swaps (recall in disguise).
- ORDER: closed. Boundary cascade fails structurally (cutoffs are n~2-3,
  the band IS the confident top; +147 at 2.6sig); per-building rank
  normalization catastrophic (+549/+939, 7-8sig) - global pooled ranking
  is load-bearing; prob-space blending loses to rank-space (+76). The
  rank-gap-1-10 frontier is unreachable by aggregation on this table.
- COUNTS (all report-only): flat alpha 1.1-1.5 dead (podium-posture 1.4
  is a 1.0sig coin-flip, median-worse); calibrated counts REFUTED with a
  count-matched control (+67.5 at 3.4sig - allocation failure); risk-N
  refuted. Headline: warmup-gated alpha 1.4 (s_0-7 only) -> 1488.0,
  -57.4 +/- 22.0 (2.6sig nominal, post-hoc block, 8-scenario support,
  count-coupled) - candidate for a public trigger, user's call.
- HAZARD: closed for the deadline. dth3 crash fixed; discrete-time
  hazard HGB is a standalone statistical peer of the 3-way blend
  (h_alone 1537.0, 25W/22L) with its edge at COLD-START origins
  (censored-pool training; warmup -178/cell) - converges with the counts
  lane on warmup as the only exploitable block; unresolvable at 2sig on
  8 cells of +/-800 scatter. AFT-lite dead on arrival.

SHIP (lam2sp3): submit.py TIMING_WEIGHT (default 2.0, env
BATTERYSWAP_TIMING_WEIGHT) + SPLIT_DAYS default 7->3; models_cv.py
plan_tsroute.timing_weight attr (default 1.0 = old path bit-exact,
verified: ft2a10_sp7 control cell-diff 0.0 vs pre-T2 reference);
cv.py run_bgkf split_days/timing_weight hooks, ft2a10/head track the
deployed dials. Verified: cand ft2a10 = 1541.3, cell-exact (0.0) vs the
lane's lam2sp3 measurement; paired -4.11 +/- 1.41 (2.9sig) 25W/4L
p8.8e-6, swaps flat 2.27. New champion CV 1541.3.

## Phase 65 - CV frontier 1398.0 (user CV-first directive): warmup-gated alpha 1.4 x gated hazard order, both at deaths_seen<35

User directive: CV is the reported/optimized metric; count-coupled
candidates are KEPT (not auto-shipped) as champions-in-waiting. Frontier
config st_hz100t35_g16: at origins where the planned fleet's recorded
deaths <= T number fewer than 35 (~s_0-15 on bgkf), ORDER = discrete-time
hazard HGB (censored-pool trained, c14/c17 machinery) replacing the 3-way
blend, and planner alpha = 1.4; everywhere else byte-identical to the
1541.3 head. CV 1398.0, -143.3 +/- 37.4 (3.8sig), 16W/0L, Wilcoxon <.001,
swaps 2.53/cell (vs 2.27; count-coupled by design).

Decomposition of the -143.3: gated alpha 1.4 width-16 alone -125.4
(4.0sig, clean bowl: width 6/8/10/12/14/16/20/24/32/48 ->
1501/1483/1462/1436/1429/1416/1414/1438/1475/1502; level bowl 1.3/1.4/
1.45/1.5/1.6 -> 1476/1436-1403/1416/1427-1449/1490 with 1.4 optimal at
every width); hazard order adds -13 at thr20 and -18 at thr35 (16W/0L
final). EC break-even expansion (teammate mechanism through our pricing)
REFUTED: margin 1.0/1.2/1.5 monotone worse (+17/+29/+46), so the count
posture belongs to gated alpha, not EC top-ups. Teammate public analysis
(1486.57 vs our 1575.31): +191 swaps -> late -353, early +316, ops -53;
pure operating-point difference, no luck involved either way.

Caveats attached to 1398.0: gate widths selected on the shared 48
scenarios (multiplicity); deployment rule re-expressed as deaths_seen<35
(plan-time observable, FLOOR_GATE family); the composite harness carries
exact-rank-tie noise vs a deployed-class implementation (16/240 cells,
documented in t3_coldstart.md) - a real ship needs the gate inside the
deployed class with non-gated origins byte-identical. Pending: t3_gm
label-statistic lane; synthetic-scale validation of the count-coupled
family (user-commissioned; key question = does the gate close early on
large fleets, bounding the downside). Drivers /tmp/c19, /tmp/c20
(volatile); arm CSVs /tmp/cv_bgkfcand_c19_*, c20_*.

## Phase 66 - SHIPPED the warmup gate (user call): head CV 1418.3

Deployed form of the phase-65 frontier inside Ft2RUL (user approved the
ship for a public trigger): rate-form gate WARMUP_RATE=0.0759 deaths per
training-fleet device (= 35/461; a fixed count fires wider on the CV's
4/5-size fold ledgers than on deployment's full ledger - measured 1429.7
fixed vs 1418.3 rate), TRAIN-ledger observable seen = deaths recorded <=
plan origin; while gated: ORDER = censored-pool discrete-time hazard HGB
(_DiscHaz, person-period buckets, depth3/lr.06/250it), appetite x1.4 via
a consume-once plan_tsroute.alpha_boost. eol column derived from
origin+days_to_eol when absent (the cached parquet ships no eol; exact,
0 diff on 8206 dying rows - this bug made the first rehearsal silently
inert). VERIFIED: cand ft2a10 = 1418.3, -123.0 +/- 43.1 (2.9sig, 14W/5L,
Wilcoxon .0017, 19 changed origins, swaps 2.54); WARMUP_RATE=0 control
bit-exact vs the 1541.3 head (0.0 max cell diff); rehearsal: gate fired
on exactly s_0-14 (+2..+5 swaps each), s_15+ byte-identical, 0 warnings,
41s. Delta vs the phase-65 composite 1398.0 (~+20) = the composite's
harness-only advantages (full-table hazard pool, literal-16 gate, tie
noise); the deployed number is the honest one. COUNT-COUPLED - public
trigger arbitrates; previous head remains 60d65da (1541.3/public
lineage 1575.31) via WARMUP_RATE=0.

**Phase 66 postscript — PUBLIC REFUTATION.** e4745d2 publicly scored
**1594.89** (+19.6 vs the 1575.31 head). Mechanism executed exactly as
designed: +38 swaps in the cold scenarios, late-days -263 (-54.8) — but
early +59.8 and ops +14.4 made the trade ~1.4:1 against, vs ~6:1
favorable on bgkf warmup. Fourth count-coupled public refutation
(alpha_static, cliff, cert-first, warmup-gate); alpha 1.0 remains the
lone converter. bgkf's warmup block over-prices cold-scenario catches
relative to the public fleet. PRIVATE SELECTION: 60d65da (count-flat
lam2sp3, expected ~1571) or measured 4c93883 (1575.31); not e4745d2.

## Phase 67 - T4 count-flat campaign (6 lanes, ~50 arms): ZERO adoptions - 60d65da confirmed as the count-flat ceiling of this feature space

User-directed sub-1400 count-flat push. Every lane paired vs 60d65da
(1541.3) at 2sigma, parity-verified, swaps flat. All six REJECTED with
mechanisms (reports agent_reports_bgkf/t4_*.md):
- STACKING: learned metas over-weight the best-AUC source (gapHGB); plan
  cost is decided at the cutoff, which the cost-tuned .50/.30/.20 already
  encodes. Loss monotone in meta dose (+16.5 at 25% ... +139 HGB-meta).
- EXTERNAL data/models: NASA transfer collapses to a monotone transform
  of the current voltage gap (Spearman .999) - lab aging corpora have
  near-uniform fade slopes; foundation models unloadable in the runtime
  stack (no transformers/safetensors). Measured +32.5 / wash.
- SURVIVAL/LTR: Cox, cost-weighted listwise, martingale-GBM all lose the
  gap slot by >=2.6sig WITH identical features - the dies42 classification
  objective itself is the value. Cost-aligned listwise is the worst
  (gradient too diffuse at ~1.2k positives/157 groups).
- LITERATURE features (knee/Bacon-Watts, sample entropy, monotonicity,
  relaxation, variance): all lose or wash inside the gapHGB; best
  standalone-AUC features lose MOST (dilute the depth-2 splits on the
  validated quartet). Anchored logbag control failed on cue (+61.6).
- TRANSPLANT (rank-4 MnesisLab, full source read): geo-aware ordering
  tilt +135..+452 (their compactness gate passes on all our fold-fleets,
  so gating does not rescue it); seasonal temp layer = plan no-op (gated
  devices already top-ranked); left-truncated FP-AFT faithful (params
  match theirs) but moves ~1 unit; their EB wiener +128. THEIR 1407.63 IS
  OPERATING POINT + their untransplantable base pipeline, not a readable
  layer: 743 swaps converting at ~16.8 late-days/swap vs our 6.0 marginal.
- SEQUENCE (GRU-D on 60d daily telemetry, 5-seed, fold-safe): encoder
  genuine (OOF AUC 0.94-0.96) but fully redundant with the snapshot
  stack; monotone-against dose response (+21.6 at w=.05).

CONCLUSION: 60d65da (CV 1541.3) is the measured count-flat ceiling of
this feature space across our own features, the literature's, and the
readable competitors' - the ordering axis is closed from every direction
tried. PRIVATE SELECTION stands: 60d65da first, 4c93883 (measured
1575.31) as the no-inference alternative.

## Phase 68 - T5 global-optimum probe (6 structural lanes): ZERO adoptions - 60d65da is the honest optimum of this framing, search closed

User-directed final campaign ("it's a local optimum but probably not the
global one") - four commissioned angles plus the two rank-3-derived
prototypes, every arm paired vs 60d65da (1541.3), parity-verified,
count-flat unless noted (reports agent_reports_bgkf/t5_*.md):
- BASE REBUILD: competitor-style wide-space stacked base (78 leak-verified
  cols, 4-learner stack) IS a better dies42 classifier than logbag
  (per-fold OOF AUC 0.965 vs 0.938, 4/5 folds, biggest where labels are
  scarce) and it does NOT price: |delta| <= 9.2 (<=0.3sig) at every mixing
  weight. AUC gains live in separating obvious cases; cost lives in the
  fine ordering near the inclusion cutoff, which logbag already has.
  Base-model capacity is not the binding constraint.
- JOINT SEARCH: 8-dim differential evolution, 90 evals, tune/validate
  origin split. Best tune delta -104; 100% of it sign-reverses on the
  held-out origins (top-3 all flip). The CV's resolution is exhausted at
  this scale - any future multi-dial "win" of this size is presumed noise
  unless it passes the same split.
- SELECTION ARCHITECTURE: expected-gain (cost-based) selection at pinned
  count: best arm -5.0+/-28.8 (0.2sig); the geography term is a measured
  LOSS +27..+31/scen (2sig, robust across three geo-on/off contrasts).
  The rank-4 team's -14.6 selection edge exists only count-floating.
- DATA WALL: learning curve 40->100% is shelf-not-slope (local slope ~0,
  p=.68); a hypothetical DOUBLED corpus prices at ~-44 [-100..0]; label
  audit recovers zero positives. The surface rewards building/failure-mode
  COVERAGE, not volume - the optimum is not gated on labels nobody has.
- SEASONAL MARGIN (rank-3 recipe): the fleet seasonal factor is REAL here
  (p2p 0.0585 V in demeaned fleet-median voltage, matches their 0.048)
  but injecting it into the wiener barrier distance loses at every
  strength on both climatology maps (best arm +1.0, and the mild setting
  is significantly harmful, wilcoxon p=.031; one Dec origin +546 from a
  2 mV shift). Their -104 lived in calibrated-probability expected-cost
  selection; in a rank-only frozen-count slot the factor only reorders,
  and it reorders worst where deaths cluster. Wrong lever, axis closed.
- DRAWDOWN REFRAME (rank-3 core method, faithful rebuild): 1.72M
  (h,m)-conditioned censored drawdown rows from 71,878 battery-days, their
  exact HGB (450/.07/63/200), 107 causal features, fold-safe. Monotone-
  against dose response: alone +255.6 (3.9sig), as 4th source @.10 +14.1
  (0.7sig loss, best arm); survival-curve read strictly worse. OOF AUC
  0.958 vs raw v_min_7's 0.961 - it learns first-passage of the LAGGING
  smoothed statistic while the champion sits on leading raw-voltage
  indicators. Their 1350.7 is their whole stack (expected-cost scheduler,
  seasonality, timing), not an order signal that transplants.

CONCLUSION: with T2-T5 plus peer transplants (~150 arms) the ordering,
base-capacity, selection, data, seasonality and reframing axes are ALL
closed with mechanisms. 60d65da (CV 1541.3, count-flat) stands as the
genuine optimum of this framing at this instrument's resolution.

FINAL SELECTION (deadline 2026-08-23 23:59): private pick 60d65da first;
4c93883 (publicly measured 1575.31) as the no-inference alternative.
e4745d2 publicly refuted (1594.89). Never 698401a. Count-coupled CV
frontier (gated hazard+alpha 1398.0) remains report-only: the family is
0-for-4 on public conversion.

## Phase 69 - PUBLIC read on the restored head (71bfff2 = 60d65da config): 1583.11, lam2sp3 does NOT transfer - private pick flips to 4c93883

User-triggered public scoring of the gate-off head: total 1583.109 vs
4c93883's measured 1575.307 (+7.80). Component inversion (all integers,
clean run): swaps 644 = IDENTICAL to 4c93883 (count-flat exactly as
designed); late-days 5005 (-4); early-days 19638 (-78) -> timing
components -1.64; ops/packing residual +9.45 (daily_limit 112.5,
overtime 89.2, weekly_limit 64.6, travel 49.1, bldg/room 17.2).
MECHANISM: timing_weight=2.0 + split_days=3 re-packs swap days - it
bought the intended timing gain but pays +9.4 in schedule/ops constraints
on the public fleets. The bgkf priced the same trade at -4.1+/-1.4
(2.9sig, 25W/4L) on train buildings: the ops cost of tighter packing is
fleet-composition-sensitive (building sizes/geography), which
building-OOF CV on train buildings cannot see. First COUNT-FLAT
CV->public inversion (prior four were count-coupled); the CV remains
accurate on ordering/inclusion but does not price planner-packing
trades across fleets.
FINAL SELECTION (updated): private pick 4c93883 (measured 1575.31,
best public we own) FIRST; 60d65da/71bfff2 (measured 1583.11, CV
favorite at 1541.3) as the second slot / CV-side hedge if two picks
exist. Never e4745d2 (1594.89) or 698401a (1877.08).

## Phase 70 - Fleet-composition probe: the CV's lam2sp3 win is a LOW-PRESSURE artifact - pick locks to 4c93883

Post-refutation diagnostic (report agent_reports_bgkf/t5_fleetcomp.md,
raw /tmp/c35): A = tw2.0/sd3 (60d65da) vs B = tw1.0/sd7 (4c93883),
identical model, paired, count-flat in all 1536 stage-2 cells.
- Fold fleets: A wins 5/5 but pays an ops tax in 4/5 - the CV win is
  entirely late/early timing on small sub-fleets.
- 32 random subset fleets (3-12 bldgs): 20W/8L/4T, median -0.14; the
  dials only ACTIVATE under pressure - P(cell differs) 5.5%->85% from
  <50 to 300-400 devices, corr(delta, n_dev) -0.71.
- PRESSURE fleets (18 bldgs, 250-384 devices): 3/6 flip to A-loses; the
  two big losses replicate the public signature almost exactly (+7.90
  with dOps +10.82; +9.31 with dOps +9.35; public +7.8 with ops +9.45,
  timing slightly better in all three).
- CAPSTONE: the full 24-building universe planned as ONE fleet flips A
  to +0.97 (24W/20L, dLate -4.4, dOps +6.47). The CV's 2.9sig win exists
  only because bgkf test fleets are five small sub-fleets where
  daily/weekly limits never bind.
VERDICT: the -4.1 CV delta is not transferable to large fleets; at
public-like pressure A-vs-B is a coin flip locally and A measured worse
publicly. INSTRUMENT FIX (for future work): adjudicate planner/packing
dials on pressure-matched fleets (whole-universe-as-one-fleet + stress
fleets at 250-400 devices), not the pooled small-sub-fleet mean.
FINAL SELECTION locked: 4c93883 (measured 1575.31). 60d65da/71bfff2
only as a second slot. Never e4745d2 / 698401a.

## Phase 71 - Pressure-matched CV instrument: CALIBRATION FAILED - no instrument change, no final round; selection stays 4c93883

User-approved attempt to upgrade the CV to pressure-matched evaluation
(whole-24-building-universe as one fleet, OOF-stitched per-device
predictions from the 5 fold fits) and re-run a packing-dial grid on it.
Calibration gate: retrodict the public pair (B=tw1/sd7 1575.31 <
A=tw2/sd3 1583.11, dOps +9.45). Result: PRESSURE(B)=1619.8,
PRESSURE(A)=1615.9, A-B = -3.88+/-5.17 (22W/19L/7T), dOps -1.71 -
WRONG SIGN on both total and ops; grid auto-stopped per protocol.
Diagnosis (t6_pressure.md): at binding pressure the A-B delta is a
daily/weekly-limit COLLISION LOTTERY - +/-100/200 quanta ~13x the +7.8
target signal, landing on different origins under OOF-stitched vs
leaky-fit predictions (per-origin deltas uncorrelated, r=-0.08) - with
only 48 origins the one-fleet mean cannot be calibrated; any grid
ranking would fit the lottery. Corollary: the public +7.8 itself is
likely 1-2 collision events, i.e. the packing channel may be
UNRESOLVABLE by any instrument at this scale; the measured public
number is then the only defensible ranking, and it favors B.
Redesign direction for future work (not attempted tonight):
sign-frequency over a many-fleet stress ensemble rather than a
one-fleet mean; stress validator ready at /tmp/c36/stress_winner.py.
FINAL: cv.py UNCHANGED (an uncalibrated instrument would mislead);
selection stays 4c93883 first, 60d65da/71bfff2 second slot only.

## Phase 72 - Final count-flat closure (c28/c37/c38) + alpha 1.4 public A/B ship (user call)

Deadline corrected to 02:00 CEST (midnight UTC) - time for one more
public A/B. Count-flat space closed with three sweeps (all paired vs
1541.3, parity exact in each driver):
- c28 hyperparams (logbag C/bags, gapHGB l2/leaf): 8 arms, ALL lose or
  wash (+5.6..+34.2). Champion hyperparameters locally optimal.
- c37 blend-weight jitter (+/-.05 around .50/.30/.20, 6 directions):
  ALL lose +23..+50 (several ~2sig AGAINST). Sharp optimum.
- c38 averaging ensembles (leaders' style, order-only: device-bootstrap
  x3, drop-fifth x5, time-snapshot x3, feature-set x2): best is a 0.3sig
  wash (devboot -6.2+/-24.9), timebag a 2.2sig LOSS. Averaging destroys
  the favorable seed-0 configuration (same lesson as wave T seed-bag).
ALPHA 1.4 SHIP (62e9d91, count-coupled, explicit user call): fresh
confirm on head config bgkf 1498.3 (-43.0+/-43.0, 1.0sig, 19W/24L,
swaps 2.27->2.97/fleet = podium operating point 15-18/scen; mean carried
by death-heavy origins - the public read arbitrates). Static path
governs held-out fleets (submit.py:836 ALPHA_STATIC), both knobs set.
Rehearsal: 520->688 swaps (+32.3%), 43/48 scenarios; ship-code counts
byte-identical to env-override run. Old-ordering alpha 1.5 failure
(2189) predates ft2 - this is the operating-point hypothesis' first
test on the current ordering. DECISION RULE: public < 1575.31 -> select
62e9d91; else select 4c93883. Revert = both alpha defaults 1.0.

## Phase 73 - PUBLIC CONVERTS alpha 1.4: 1480.85 (-94.5) - both pre-registered gates pass; SELECTION = 62e9d91

User-triggered public read of 62e9d91: total 1480.85 vs 1575.31
(4c93883). Pre-registered decision rule (phase 72): margin >= 15 AND
late-swap fingerprint (late down >= 100). Both pass decisively:
- margin -94.46 (6x threshold); components invert to integers (clean).
- swaps 747 (+103, 15.6/scen - INTO the podium band 15-17.6);
- late-days 4006 (-1003; component -208.96 = 2x the required
  fingerprint) - the marginal-rank batteries DO contain real deaths on
  held-out fleets: ~0.8 extra catches/scenario at a strongly
  profitable exchange (early +115.35, ops -1.40 flat).
FIRST large count-coupled public conversion (family was 0-for-4; the
old "ranks 13-20 convert at ~0%" verdict was an OLD-ordering fact -
the ft2 ordering's marginal band converts). The public-overfit
objection was pre-answered: single pre-registered hypothesis from
external evidence (podium operating points + bgkf -43), component
fingerprint predicted before the read, margin rule against collision
noise. By sibling-split exchangeability the effect transfers to
private. SELECTION: 62e9d91 (public 1480.85) PRIMARY; 4c93883
(1575.31) fallback slot. Dose-response CV (alpha 1.6/1.8/2.0) running
to decide whether ONE more A/B is justified - stopping rule: only if
the CV curve is still falling at 1.6+; iterating alpha values on
public beyond one more point = the probing pattern we reject.

Phase 73 postscript - dose-response complete: alpha 1.4 -> 1498.3
(-43.0), 1.6 -> 1562.1 (+20.8), 1.8 -> 1573.7 (+32.4), 2.0 -> 1589.0
(+47.7). Clear minimum at 1.4; monotone rise beyond. NO second public
A/B per the stopping rule. FINAL: select 62e9d91 (1480.85); fallback
4c93883 (1575.31).

## Phase 74 - Re-tune at alpha 1.4 (user-directed): dials orthogonal EXCEPT the wiener weight - basin floor .20 (CV 1476.0, -22.3, 2.0sig)

22+10 arms paired vs the alpha-1.4 reference (1498.3), parity exact in
all drivers, count-flat (swaps 2.95-2.98):
- Alpha fine grid: 1.4 is a SHARP minimum (1.3 +36; 1.35 +2.7 wash;
  1.45 +22.9 at 1W/21L; 1.5 +47.6 at 3W/29L; 1.6/1.8/2.0 monotone up).
  Public-confirmed operating point = the exact CV bowl bottom.
- Packing (tw x sd) at 1.4: flat (< +4.6) - independent of alpha.
- Hyperparams (logbag C/bags, gapHGB l2/leaf) at 1.4: all within +-4.3.
- ORDER WEIGHTS SHIFT: at alpha 1.0 the .50/.30/.20 mix was a sharp
  optimum (phase 72: all jitters +23..+50); at alpha 1.4 the wiener->gap
  direction is a coherent basin: .25/.25 -13.9 (p.013), .23/.27 -3.7
  (p.042), floor at wiener .20 - .50/.20/.30 = 1476.0 (-22.3, 2.0sig,
  p.013) and .55/.20/.25 = 1475.2 (-23.1, 1.6sig, 26W/8L p.004) - then
  rising (.15/.35 -8.0, .10/.40 +6.2). Mechanism: the wiener barrier
  distance ranks imminent deaths well but discriminates poorly in the
  deeper 15-19/scen band that alpha 1.4 buys; the gapHGB is stronger
  there. The dial's CV optimum is OPERATING-POINT-DEPENDENT.
Winner's-curse haircut (best of ~30 arms at this alpha): true effect
likely -12..-18. NOT shipped as of this entry: the selection stands on
the publicly MEASURED 62e9d91 (1480.85); re-selecting an unmeasured
re-weight is a user-level risk decision (no public triggers remain).

## Phase 75 - PUBLIC REFUTES the order re-weight: 1495.92 (+15.1) - FINAL selection stays 62e9d91 (1480.85); head reverted

User-triggered read of 354fd2d (.50/.20/.30): 1495.92 vs 62e9d91's
1480.85 (+15.08). Counts flat as designed (752 vs 747 swaps); the loss
is spread evenly: late +5.00 (4030 vs 4006 late-days), early +3.67,
ops +6.39. CV said -22.3 (2.0sig, basin-confirmed, p.004/.013 floor
arms); public says +15.1 - a SIGN FLIP in the bgkf's home channel
(ordering). Post-mortem read: best-of-~30 winner's curse plus a real
fleet effect - the wiener barrier-distance source earns MORE weight on
held-out fleets than building-OOF folds suggest (its physics transfers;
the gapHGB's depth-2 splits are more fold-idiosyncratic). Cost of the
experiment: zero (selection rule pre-locked, portal unchanged).
LEDGER OF THE NIGHT'S A/Bs: packing CV-win refuted (+7.8), warmup gate
refuted (+19.6), alpha 1.4 CONVERTED (-94.5, amplified 2.2x), order
re-weight refuted (+15.1). The bgkf prices the count/appetite channel
and long-standing ordering STACKS, but individual 2sig dial moves in
any channel are coin flips publicly - only public A/Bs adjudicate.
FINAL: selection 62e9d91 (public 1480.85); head reverted to its config.