Thibaut Forest Claude Opus 5 (1M context) commited on
Commit
698401a
·
1 Parent(s): 645d27e

Phase 56: NEW CHAMPION logbag_rank + gbm rank-blend w=0.30 (purge 1630.3, was 1972.0)

Browse files

11-lane agent campaign, ~250 candidates, all paired on the deterministic
purge harness. Champion: within-fleet rank features (r_vlast/r_tau) on the
bagged logistic + gbm value-preserving order blend - ordering-only, swaps
flat 9.23, wins all three blocks (-341.7 +/- 103.8, 37W/11L). Deployed as
submit.py FrontierRUL; fidelity vs the CV candidate is bit-exact (s_10/s_30).
Dials: BATTERYSWAP_FRONTIER=0 -> legacy logbag; BATTERYSWAP_FRONTIER_W2=0 ->
plain logbag_rank (purge 1746.4, no gbm flattery exposure).
cv.py CHAMPION carries the blend; regenerated baseline matches the campaign
run bit-for-bit.

Instrument calibration (campaign's key negative): the purge rewards the two
classes the public refuted - count-coupled changes (alpha 1.5: purge -202 vs
public +527) and label-process exploits (cert-first re-derived at its exact
pre-refutation signature 3W/0L/45T). Shipping bar recorded: ordering-only,
label-process-free, swaps flat. Report-only survivors and full per-lane
records in agent_reports/ and EXPERIMENTS.md Phase 56.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

EXPERIMENTS.md CHANGED
@@ -2956,3 +2956,95 @@ for ad-hoc ordering diagnostics on methods that do rank. CSV SCHEMA CHANGE:
2956
  columns; the pre-change stale candidate CSVs were deleted (they were
2957
  denominated in dead instruments regardless - any candidate must re-run fresh
2958
  through `cv oofcand <label>`).
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2956
  columns; the pre-change stale candidate CSVs were deleted (they were
2957
  denominated in dead instruments regardless - any candidate must re-run fresh
2958
  through `cv oofcand <label>`).
2959
+
2960
+ ## Phase 56 - full re-adjudication under the purge + radical-pipeline campaign; NEW CHAMPION logbag_rank+gbm30 (1630.3)
2961
+
2962
+ User directive: re-run ALL improvement ideas on the purge instrument, including
2963
+ previously public-refuted axes ("remove the closed line... we can re-try all of
2964
+ that"), spin off agents, be radical ("change the whole pipeline method").
2965
+ Execution: 11 parallel lanes, ~250 candidates, every full-48 run paired per
2966
+ scenario against the champion baseline. Harness verified DETERMINISTIC
2967
+ (champion repeat = bit-identical on all 48), so paired SE is scenario-sampling
2968
+ noise only; survivor bar = delta < 0 beyond ~2*SE at ~flat swaps.
2969
+ Live per-lane records: agent_reports/*.md (kept in-repo).
2970
+
2971
+ ### NEW CHAMPION (adopted): logbag_rank + gbm value-preserving rank blend, w=0.30
2972
+
2973
+ cv.run_all48_oof(kind='logbag_rank', blend=('gbm', 0.30))
2974
+ THE SCORE 1630.3 vs 1972.0 (-341.7 +/- 103.8, t=-3.3, 37W/11L,
2975
+ swaps 9.23 vs 9.21 flat; wins all three blocks: wu 2276/panel 1677/ne 504;
2976
+ gain entirely late_swap: -305 of -342)
2977
+
2978
+ Components, independently discovered and individually significant:
2979
+ - logbag_rank (champion + within-origin fleet-rank features r_vlast/r_tau):
2980
+ -225.6 +/- 74.0, 34W/11L. Linear, rank-based, no same-device channel. This
2981
+ kind was REJECTED on the old self-fit instrument (phase 8); purge reverses.
2982
+ - gbm order increment on that base: -116.1 +/- 53.6, 31W/13L. Broad weight
2983
+ plateau (.25/.30/.35 all <= -335). CAVEAT (md lane): a monotonic-constrained
2984
+ HGB partner DESTROYS the increment (+142..+269) - the gbm contribution is
2985
+ specifically non-monotone response, i.e. real interactions or residual
2986
+ same-battery flattery. Accepted risk per standing directive; public arbiter.
2987
+ Local optimum confirmed by 5 lanes: hyperparams (C=3 coin-flip -15.0+/-13.2,
2988
+ W/L against - kept C=1), features (12 full runs, all subsumed by r_vlast/r_tau;
2989
+ r_tau load-bearing), training weights (proximity/dedup/hard-example all
2990
+ neutral-to-worse on the frontier), neural rankers (RankNet/ListNet lose
2991
+ head-to-head +99..+120), physics blends (sim-rank 1.9sigma on old champ, ghost-
2992
+ promoting). vrel subsumed by ranks (worse in both combos).
2993
+
2994
+ DEPLOYMENT: submit.py FrontierRUL (BATTERYSWAP_FRONTIER=0 reverts to logbag).
2995
+ Fidelity test: bit-exact vs the CV candidate on s_10/s_30 (max p42 diff 0.0,
2996
+ ordering identical). Fit ~3.3s incl. gbm; budgets and degradation paths
2997
+ unchanged. cv.py CHAMPION now carries the blend (candidates with explicit
2998
+ kind/blend do NOT inherit it).
2999
+
3000
+ ### INSTRUMENT CALIBRATION - the campaign's most important negative result
3001
+
3002
+ The purge CANNOT adjudicate two classes, proven by public anti-correlation:
3003
+ 1. COUNT-COUPLED changes: purge alpha curve is monotone DOWN to 1.5 (-202)
3004
+ - the exact config the public refuted at +527 (phase 28). Same shape via
3005
+ p_be top-ups, EC-inclusion counts, dedup class-rebalance (tr: the -117
3006
+ dedup win is 80% a smuggled +1.7-swap appetite shift; its count-matched
3007
+ twin is -24 n.s.), gamma flattening, cohort gates.
3008
+ 2. LABEL-PROCESS exploits: wd re-derived cert-first on the frontier at
3009
+ -26.2 (3W/0L/45T) - the EXACT local signature (-37.9, 3W/0L/45T) that
3010
+ preceded the public +43.2 (phase 48, tested ISOLATED on the clean stack;
3011
+ the lane's exculpation claim was checked against the record and is FALSE).
3012
+ Ghosts (crossed-never-labeled devices) exist publicly, are zero in train,
3013
+ and are invisible to ANY local instrument.
3014
+ SHIPPING BAR going forward: ordering-only, label-process-free, swaps flat.
3015
+
3016
+ ### Report-only results (real on the purge; fail the shipping bar)
3017
+
3018
+ - pl_stack_hgatez (frontier + arrival-triggered p_be=0.2 top-up): 1559.4
3019
+ overall best raw number, but the gate's marginal on the frontier is
3020
+ -70.8 +/- 42.4 at +3.2 swaps with panel n.s. - count-coupled. The frontier
3021
+ self-repairs warmup (its wu swaps 9.9 vs 5.0), removing the gate's niche.
3022
+ - pl_stack_shiftp4 (visit day 4*p42 days earlier): 1614.0; swap-neutral and
3023
+ reproducibly negative on two bases (champ -13.2+/-9.4, frontier marginal
3024
+ -16.3+/-10.9) but sub-2sigma each. Optional public A/B candidate.
3025
+ - tr_hard_prox60 (hard-band x3 + proximity hl60 weights): -107.5 +/- 41.2 on
3026
+ the PLAIN base only (2.6sigma, swaps flat) - subsumed by the frontier.
3027
+ - sv_dhgate (censored-pool discrete-time hazard when train deaths < 20):
3028
+ -51.4 +/- 22.1 - real, but the gate NEVER fires in deployment (full-history
3029
+ fit; cf. phase 36's inert warm-up mechanism, same effect size).
3030
+ - tj_blend25e3 (MC voltage-trajectory sim rank blend 25%): -86.1 +/- 45.5
3031
+ (1.9sigma) on the old champion base; promotes crossed-unlabeled devices
3032
+ (cert class) - report-only. Standalone physics pipeline: honest negative
3033
+ (labels carry unrecoverable info; count-matched it catches fewer deaths).
3034
+
3035
+ ### Closed by this campaign (with numbers, on the purge)
3036
+
3037
+ Planner: day placement CONVERGED (e2 surrogate local search -1.7+/-1.6 for 4x
3038
+ effort; ed/sd/blend day variants reject); piggyback/second-chance swaps dead
3039
+ (+8.8/+52); EC-economics count dead (inferior appetite); CVaR/portfolio dead
3040
+ (deaths do not cluster by building). Models: survival family dead (aft +337,
3041
+ cox +546, wiener +1100); conformal = byte-identical to logbag; building fixed
3042
+ effects dead (+423/+48); MoE/staleness gates inert; calibration null-to-
3043
+ harmful (Platt +21, isotonic -16.8 n.s.); MLP noise. Features: raw levels
3044
+ fail where ranks transfer (whit +43 raw vs -49 ranked); aux families dead
3045
+ (+95..+124); v_last_only +453 (blind-repo phase-39 claim dead on this
3046
+ instrument); top-12 slot squatters are label-process ghosts that still die at
3047
+ 19% - no flag can demote them profitably. Training: recency dead, proximity
3048
+ real-but-subsumed; label windows d35/d21 count-starve (+72/+105); building-
3049
+ balanced +40; thinning +19..+32; past-only pool +19 (future-side purge pairs
3050
+ stabilize fits). Candidate CSVs: /tmp/cv_oofcand_*.csv (~180 full-48 files).
agent_reports/README.md ADDED
@@ -0,0 +1,29 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Purge-CV re-run — live agent reports (2026-08-22)
2
+
3
+ Full re-adjudication of every improvement idea (old and new, including
4
+ previously public-refuted axes, per user directive) on THE SCORE:
5
+ the temporal-purge CV (`cv all48oof`), champion baseline **1972.0**
6
+ (warmup 3560.3 / panel 1839.6 / nearend 604.8, n_swaps 9.2).
7
+
8
+ Every candidate is evaluated PAIRED per scenario against the champion
9
+ baseline (/tmp/cv_all48oof.csv): delta mean, SE of paired deltas, W/L,
10
+ swap count. Survivor bar: ALL48 delta < 0 beyond ~2*SE with swaps ~flat.
11
+
12
+ One file per worker (updated live by that worker only):
13
+
14
+ | file | theme |
15
+ |---|---|
16
+ | wave1_registry.md | mechanical re-run of all 25 OOF_CANDIDATES registry entries + champion-repeat noise floor |
17
+ | ft_findings.md | new feature engineering |
18
+ | md_findings.md | model families & hyperparameters |
19
+ | pl_findings.md | planner: knobs, day placement, appetite (reopened) |
20
+ | bl_findings.md | blends, ensembles, calibration |
21
+ | tr_findings.md | training-data composition: weights, labels, sampling |
22
+ | rk_findings.md | learning-to-rank objectives |
23
+ | wd_findings.md | untested registry kinds + wild-card methods, cert-first (reopened) |
24
+ | tj_findings.md | RADICAL: voltage-trajectory forecasting, mechanistic death-rule application |
25
+ | sv_findings.md | RADICAL: survival curves + decision-theoretic visit-day planner |
26
+ | e2_findings.md | RADICAL: end-to-end plan optimization, fleet-level death forecasting |
27
+
28
+ Per-candidate CSVs: /tmp/cv_oofcand_<label>.csv. Aggregate view:
29
+ `venv/bin/python -m batteryswap_example.cv oofreport`.
agent_reports/bl_findings.md ADDED
@@ -0,0 +1,171 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # bl (blends / ensembles / calibration) — live findings
2
+
3
+ STATUS: DONE — last updated 2026-08-22 16:05:35
4
+
5
+ Baseline: champion logbag, SCORE 1972.0, swaps 9.21. All candidates paired per-scenario vs /tmp/cv_all48oof.csv (48 rows).
6
+ Value-preserving rank blends keep the p42 value distribution — count machinery unchanged, only WHO holds each rank moves. Calibration candidates change values (count/day placement move) — count-shift axis reopened by user 2026-08-22.
7
+
8
+ | label | ALL48 | delta | SE | W/L | swaps |
9
+ |---|---|---|---|---|---|
10
+ | bl_lbr_gbm30 | 1630.3 | -341.75 | 103.77 | 37W/11L | 9.23 |
11
+ | bl_lbr_gbm35 | 1635.4 | -336.61 | 108.07 | 35W/13L | 9.25 |
12
+ | bl_lbr_gbm25 | 1636.6 | -335.36 | 102.23 | 37W/11L | 9.27 |
13
+ | bl_lbr_grw | 1642.8 | -329.21 | 105.39 | 34W/14L | 9.25 |
14
+ | bl_lbr_locg10 | 1654.8 | -317.25 | 104.34 | 34W/14L | 9.31 |
15
+ | bl_lbr_gr2510 | 1656.8 | -315.16 | 104.70 | 34W/14L | 9.23 |
16
+ | bl_lbr_gr2015 | 1663.6 | -308.45 | 104.71 | 33W/15L | 9.29 |
17
+ | bl_lbr_rfgbm | 1671.7 | -300.31 | 99.12 | 33W/15L | 9.29 |
18
+ | bl_lbr_gbm50 | 1683.5 | -288.48 | 110.14 | 33W/15L | 9.31 |
19
+ | bl_lbr_gbm15 | 1687.9 | -284.12 | 88.43 | 35W/12L | 9.25 |
20
+ | bl_lbr_locv10 | 1688.1 | -283.89 | 88.03 | 34W/13L | 9.35 |
21
+ | bl_lbr_wnr15 | 1697.4 | -274.61 | 82.48 | 36W/11L | 9.44 |
22
+ | bl_lbr_rf25 | 1698.6 | -273.44 | 84.78 | 35W/12L | 9.23 |
23
+ | bl_lbr_lb25 | 1710.9 | -261.07 | 84.04 | 34W/11L | 9.54 |
24
+ | bl_lbr_lb50 | 1711.0 | -261.03 | 84.42 | 34W/10L | 9.48 |
25
+ | bl_lbr_rf15 | 1714.6 | -257.43 | 80.79 | 35W/12L | 9.29 |
26
+ | bl_lbr_rf50 | 1714.9 | -257.06 | 94.15 | 31W/17L | 9.29 |
27
+ | bl_lbr00 | 1746.4 | -225.63 | 74.03 | 34W/11L | 9.54 |
28
+ | bl_combo3 | 1841.0 | -131.02 | 82.37 | 24W/24L | 13.33 |
29
+ | bl_combo2 | 1841.0 | -130.96 | 55.06 | 26W/21L | 10.75 |
30
+ | bl_gam80 | 1852.3 | -119.67 | 75.65 | 21W/27L | 13.46 |
31
+ | bl_combo1 | 1866.2 | -105.85 | 57.19 | 24W/23L | 11.02 |
32
+ | bl_gam85 | 1879.0 | -93.05 | 51.79 | 22W/26L | 12.15 |
33
+ | bl_locv10w60 | 1886.3 | -85.75 | 35.71 | 26W/13L | 9.17 |
34
+ | bl_mw_rfgbmB | 1886.4 | -85.60 | 39.37 | 27W/16L | 9.10 |
35
+ | bl_mw_rgw2 | 1887.1 | -84.90 | 44.94 | 28W/15L | 9.10 |
36
+ | bl_locv10 | 1888.3 | -83.70 | 35.76 | 25W/13L | 9.17 |
37
+ | bl_mw_rfgbm | 1888.8 | -83.18 | 39.67 | 27W/17L | 9.12 |
38
+ | bl_mw_rgw | 1889.5 | -82.49 | 45.46 | 28W/15L | 9.15 |
39
+ | bl_rf35 | 1890.6 | -81.37 | 39.50 | 29W/14L | 9.21 |
40
+ | bl_mw_rfwnr | 1894.7 | -77.35 | 38.66 | 25W/17L | 9.27 |
41
+ | bl_locv15 | 1899.1 | -72.93 | 35.20 | 26W/13L | 9.17 |
42
+ | bl_rf40 | 1901.7 | -70.30 | 41.73 | 29W/14L | 9.23 |
43
+ | bl_mw_rfgbm2 | 1903.1 | -68.88 | 41.96 | 29W/15L | 9.10 |
44
+ | bl_gam90 | 1904.5 | -67.52 | 38.28 | 19W/28L | 10.98 |
45
+ | bl_rf30 | 1908.3 | -63.71 | 34.98 | 30W/11L | 9.06 |
46
+ | bl_locv10w70 | 1909.3 | -62.75 | 38.31 | 28W/14L | 9.15 |
47
+ | bl_locr20 | 1909.6 | -62.36 | 44.48 | 30W/15L | 9.08 |
48
+ | bl_mwloc2 | 1910.5 | -61.49 | 44.84 | 28W/16L | 9.08 |
49
+ | bl_locv20 | 1912.4 | -59.63 | 39.92 | 29W/14L | 9.15 |
50
+ | bl_mw_rfgbmC | 1914.1 | -57.88 | 44.33 | 27W/18L | 9.12 |
51
+ | bl_locv08 | 1917.0 | -55.04 | 37.26 | 24W/14L | 9.19 |
52
+ | bl_rf45 | 1918.5 | -53.53 | 44.86 | 29W/16L | 9.23 |
53
+ | bl_locv05 | 1919.2 | -52.80 | 33.75 | 23W/12L | 9.27 |
54
+ | bl_rf25 | 1919.7 | -52.30 | 31.46 | 28W/11L | 9.10 |
55
+ | bl_wnr15 | 1920.6 | -51.45 | 33.11 | 19W/19L | 9.38 |
56
+ | bl_rf50 | 1921.2 | -50.85 | 45.72 | 30W/16L | 9.17 |
57
+ | bl_locr10 | 1921.5 | -50.46 | 40.54 | 29W/15L | 9.10 |
58
+ | bl_wnr25 | 1924.4 | -47.65 | 34.58 | 20W/25L | 9.54 |
59
+ | bl_gbm35 | 1924.6 | -47.41 | 49.19 | 29W/16L | 9.04 |
60
+ | bl_gam95 | 1925.0 | -46.98 | 28.37 | 12W/27L | 10.08 |
61
+ | bl_wnr35 | 1935.0 | -36.97 | 44.23 | 23W/24L | 9.50 |
62
+ | bl_mwloc1 | 1936.8 | -35.20 | 44.89 | 30W/15L | 9.04 |
63
+ | bl_rf15 | 1938.4 | -33.63 | 25.39 | 21W/8L | 9.15 |
64
+ | bl_gbm25 | 1943.3 | -28.68 | 40.85 | 25W/17L | 9.06 |
65
+ | bl_gbm50 | 1947.2 | -24.77 | 55.30 | 26W/21L | 9.12 |
66
+ | bl_wnr10 | 1950.2 | -21.82 | 22.33 | 17W/14L | 9.29 |
67
+ | bl_gbm15 | 1954.2 | -17.77 | 35.45 | 23W/16L | 9.10 |
68
+ | bl_caliso | 1955.2 | -16.81 | 18.45 | 29W/12L | 8.69 |
69
+ | bl_dh50 | 1957.1 | -14.90 | 19.24 | 10W/9L | 9.31 |
70
+ | bl_rf10 | 1964.6 | -7.38 | 18.45 | 10W/7L | 9.15 |
71
+ | bl_dh35 | 1966.1 | -5.90 | 15.83 | 7W/6L | 9.29 |
72
+ | bl_dh25 | 1967.2 | -4.78 | 5.16 | 6W/4L | 9.25 |
73
+ | bl_gbm10 | 1970.0 | -1.96 | 26.18 | 16W/12L | 9.23 |
74
+ | bl_dh10 | 1972.1 | +0.11 | 0.39 | 1W/2L | 9.21 |
75
+ | bl_dh15 | 1972.5 | +0.47 | 0.53 | 2W/4L | 9.21 |
76
+ | bl_wnr50 | 1974.3 | +2.30 | 63.99 | 21W/27L | 9.38 |
77
+ | bl_tau10 | 1976.7 | +4.69 | 26.10 | 12W/15L | 9.40 |
78
+ | bl_calsig | 1993.0 | +21.01 | 17.72 | 24W/14L | 8.92 |
79
+ | bl_tau15 | 1993.6 | +21.61 | 23.74 | 10W/22L | 9.52 |
80
+ | bl_tau25 | 2017.1 | +45.13 | 38.62 | 15W/24L | 9.65 |
81
+ | bl_gam110 | 2046.8 | +74.81 | 33.02 | 31W/17L | 8.08 |
82
+ | bl_tau35 | 2097.7 | +125.66 | 51.44 | 12W/30L | 9.62 |
83
+ | bl_gam125 | 2140.9 | +168.90 | 50.66 | 20W/28L | 6.69 |
84
+ | bl_tau50 | 2256.9 | +284.87 | 78.59 | 9W/35L | 9.60 |
85
+
86
+ ## Candidate notes
87
+ - **bl_lbr_gbm30**: TOP RECOMMENDATION: logbag_rank base + gbm rank-blend w=.30 (value-preserving) — ALL48 1630.3, -341.8 (SE 103.8, 3.3 SE), 37W/11L, swaps 9.23 (flat). Gain is ALL late-swap (-305.0), warmup 8W/0L, nearend 6W/0L. Increment over lbr base alone: -116.1+/-53.6 (2.2 SE)
88
+ - **bl_lbr_gbm35**: lbr + gbm .35 — -336.6; plateau .25-.35
89
+ - **bl_lbr_gbm25**: lbr base + gbm .25 — TOP: -335.4 total (SE 102.2), 37W/11L, swaps 9.27; increment -109.7+/-50.0
90
+ - **bl_lbr_grw**: lbr + gbm .22 + rf .10 + wiener .08 — -329.2
91
+ - **bl_lbr_locg10**: lbr + local gbm (w .6, scale .10) — -317.3
92
+ - **bl_lbr_gr2510**: lbr + gbm .25 + rf .10 — -315.2
93
+ - **bl_lbr_gr2015**: lbr + gbm .20 + rf .15 — -308.5
94
+ - **bl_lbr_rfgbm**: lbr base + rf .28 + gbm .12 — -300.3, increment -74.7
95
+ - **bl_lbr_gbm50**: lbr + gbm .50 — -288.5; past minimum
96
+ - **bl_lbr_gbm15**: lbr base + gbm .15 — increment -58.5+/-33.1
97
+ - **bl_lbr_locv10**: lbr base + local rf (w .6, scale .10) — -283.9, increment -58.3+/-41.4
98
+ - **bl_lbr_wnr15**: lbr base + wiener .15 — increment -49.0+/-31.6
99
+ - **bl_lbr_rf25**: lbr base + rf .25 — increment -47.8+/-30.5 (25W/11L)
100
+ - **bl_lbr_lb25**: lbr base + plain logbag .25 — increment -35.4+/-17.5 (7W/1L): even the champion itself adds on the lbr base
101
+ - **bl_lbr_lb50**: lbr base + plain logbag .50 — increment -35.4+/-21.7
102
+ - **bl_lbr_rf15**: lbr base + rf .15 — increment -31.8+/-23.6 over lbr
103
+ - **bl_lbr_rf50**: lbr base + rf .50 — increment -31.4+/-48.0
104
+ - **bl_lbr00**: logbag_rank base alone (cached re-run) — replicates wave-1 -225.6 exactly
105
+ - **bl_combo3**: locv10w60 order x gamma-0.80 values — -131.0 SE 82.4, 24W/24L, swaps 13.3: heavy appetite
106
+ - **bl_combo2**: mw_rfgbmB order x gamma-0.90 values — -131.0 SE 55.1 (2.4 SE), 26W/21L, swaps 10.75: best mean overall but count-shifted
107
+ - **bl_gam80**: calibration/appetite: p42**0.80 (flatter values, swaps 13.5 vs 9.2) — mean -119.7 but 21W/27L: warmup insurance (-629) paid in nearend early-swaps (+213). Historical: appetite axis publicly refuted pre-reopening
108
+ - **bl_combo1**: locv10w60 order x gamma-0.90 values — -105.9, 24W/23L, swaps 11.0 (blend + appetite stack, ~additive)
109
+ - **bl_gam85**: p42**0.85 — -93.1, swaps 12.2, 22W/26L (appetite shape)
110
+ - **bl_locv10w60**: local rf blend, scale 0.10, w 0.6 — BEST: -85.8, SE 35.7 (2.4 SE), 27W/13L, swaps 9.17 (flat)
111
+ - **bl_mw_rfgbmB**: 3-way logbag+rf(.28)+gbm(.12) — -85.6, 2.2 SE, swaps 9.10
112
+ - **bl_mw_rgw2**: 4-way logbag+rf(.25)+gbm(.15)+wiener(.05) — -84.9, 1.9 SE
113
+ - **bl_locv10**: local rf blend, scale 0.10, w 0.5 — -83.7, 2.3 SE; the never-tried rank-local axis works
114
+ - **bl_mw_rfgbm**: 3-way global rank blend logbag+rf(.25)+gbm(.15) — -83.2, 2.1 SE, swaps flat
115
+ - **bl_mw_rgw**: 4-way logbag+rf(.22)+gbm(.13)+wiener(.08) — -82.5, 1.8 SE
116
+ - **bl_rf35**: value-preserving rank blend logbag+rf w=0.35 — SURFACE MINIMUM (-81.4, SE 39.5 = 2.1 SE, 30W/14L, swaps 9.21 flat). Flag: rf gets some same-battery flattery under the purge (accepted, user decision)
117
+ - **bl_mw_rfwnr**: 3-way logbag+rf(.30)+wiener(.10) — -77.4, 2.0 SE
118
+ - **bl_locv15**: local rf blend, scale 0.15, w 0.5 — -72.9
119
+ - **bl_rf40**: rf global blend w=0.40 — -70.3
120
+ - **bl_mw_rfgbm2**: 3-way logbag+rf(.20)+gbm(.20) — -68.9
121
+ - **bl_gam90**: p42**0.90 — -67.5, swaps 11.0, 19W/28L: same insurance shape, smaller
122
+ - **bl_rf30**: rf global blend w=0.30 (fine grid) — -63.7; confirms 0.35 minimum
123
+ - **bl_locv10w70**: local rf blend, scale 0.10, w 0.7 — overshoot (-62.8)
124
+ - **bl_locr20**: rank-distance local (width 20, w 0.5) — -62.4
125
+ - **bl_mwloc2**: local rf (0.45) + global gbm .12 + wiener .08 — -61.5
126
+ - **bl_locv20**: local rf blend, scale 0.20, w 0.5 — -59.6
127
+ - **bl_mw_rfgbmC**: 3-way logbag+rf(.30)+gbm(.15) — -57.9
128
+ - **bl_locv08**: local rf blend, scale 0.08, w 0.5 — -55.0
129
+ - **bl_rf45**: rf global blend w=0.45 — -53.5
130
+ - **bl_locv05**: confidence-weighted local blend: rf weight 0.5*exp(-|p42-cutoff|/0.05) — -52.8
131
+ - **bl_rf25**: value-preserving rank blend logbag+rf w=0.25 — replicates wave-1 rankavg25rf exactly (-52.3)
132
+ - **bl_wnr15**: value-preserving rank blend logbag+wiener w=0.15 — wiener minimum (-51.5, 1.6 SE), swaps flat
133
+ - **bl_rf50**: value-preserving rank blend logbag+rf w=0.50 — past minimum (-50.9)
134
+ - **bl_locr10**: rank-distance local rf blend (width 10 ranks, w 0.5) — -50.5; value-distance beats rank-distance
135
+ - **bl_wnr25**: value-preserving rank blend logbag+wiener w=0.25 — (-47.7, 1.4 SE)
136
+ - **bl_gbm35**: value-preserving rank blend logbag+gbm w=0.35 — gbm minimum (-47.4, 1.0 SE), swaps flat
137
+ - **bl_gam95**: p42**0.95 — -47.0, swaps 10.1, 14W/28L
138
+ - **bl_wnr35**: value-preserving rank blend logbag+wiener w=0.35 — fading (-37.0)
139
+ - **bl_mwloc1**: local rf (0.5, scale .10) + global gbm .15 — -35.2; global gbm on top of local rf HURTS
140
+ - **bl_rf15**: value-preserving rank blend logbag+rf w=0.15 — (-33.6, 1.3 SE, 25W/9L)
141
+ - **bl_gbm25**: value-preserving rank blend logbag+gbm w=0.25 — mild (-28.7, 0.7 SE)
142
+ - **bl_gbm50**: value-preserving rank blend logbag+gbm w=0.50 — past minimum (-24.8)
143
+ - **bl_wnr10**: value-preserving rank blend logbag+wiener w=0.10 — mild (-21.8)
144
+ - **bl_gbm15**: value-preserving rank blend logbag+gbm w=0.15 — mild (-17.8, 0.5 SE)
145
+ - **bl_caliso**: cross-fitted isotonic calibration — -16.8 +/- 18.5, swaps 8.69: null
146
+ - **bl_dh50**: value-preserving rank blend logbag+dthaz — small (-14.9, 0.8 SE)
147
+ - **bl_rf10**: value-preserving rank blend logbag+rf w=0.10 — mild (-7.4)
148
+ - **bl_dh35**: value-preserving rank blend logbag+dthaz — null
149
+ - **bl_dh25**: value-preserving rank blend logbag+dthaz — null
150
+ - **bl_gbm10**: value-preserving rank blend logbag+gbm w=0.10 — null (-2.0, 0.1 SE)
151
+ - **bl_dh10**: value-preserving rank blend logbag+dthaz — dthaz is a logbag clone (rho_top 0.96): null as predicted
152
+ - **bl_dh15**: value-preserving rank blend logbag+dthaz — null
153
+ - **bl_wnr50**: value-preserving rank blend logbag+wiener w=0.50 — null (+2.3)
154
+ - **bl_tau10**: value-preserving rank blend logbag+tau (physics timer) w=0.10 — null (+4.7)
155
+ - **bl_calsig**: cross-fitted Platt calibration (GroupKFold-by-device OOF on purged pool) — +21.0 +/- 17.7, swaps 8.92: mild harm, champion values already calibrated enough
156
+ - **bl_tau15**: value-preserving rank blend logbag+tau (physics timer) w=0.15 — harmful (+21.6)
157
+ - **bl_tau25**: value-preserving rank blend logbag+tau (physics timer) w=0.25 — harmful (+45.1); tau anti-correlates with logbag near the top (rho_top -0.20) but that disagreement is noise, not signal
158
+ - **bl_gam110**: p42**1.10 (sharper, fewer swaps 8.1) — +74.8, harmful
159
+ - **bl_tau35**: value-preserving rank blend logbag+tau (physics timer) w=0.35 — very harmful (+125.7)
160
+ - **bl_gam125**: p42**1.25 (swaps 6.7) — +168.9, very harmful
161
+ - **bl_tau50**: value-preserving rank blend logbag+tau (physics timer) w=0.50 — very harmful (+284.9)
162
+
163
+ ## Conclusion
164
+
165
+ TOP RECOMMENDATION: **bl_lbr_gbm30** — kind='logbag_rank' with blend=('gbm', 0.30) (the built-in value-preserving rank blend). ALL48 = 1630.3 vs champion 1972.0: delta -341.8, SE 103.8 (3.3 SE), 37W/11L, swaps 9.23 vs 9.21 (flat -> not appetite). The whole gain is late-swap reduction (-305.0/origin) with early-swap also slightly down; warmup 8W/0L, panel 23W/11L, nearend 6W/0L. It decomposes as: logbag_rank base (wave-1 find, -225.6) + gbm rank-blend increment (-116.1 +/- 53.6, 2.2 SE, 31W/13L). The gbm-weight plateau on this base is broad (.25-.35 all < -335), so it is not a tuned spike. One-line flag: gbm/rf flexible partners receive some same-battery flattery under the purge (accepted by user decision; the lbr base itself carries most of the delta and is logistic).
166
+
167
+ Runner-up if lbr base is rejected: on the plain champion base the blend family maxes at ~-86 (bl_locv10w60 local rf blend -85.8/2.4 SE; bl_mw_rfgbmB -85.6/2.2 SE), panel-block late-swap driven, swaps flat.
168
+
169
+ Axis verdicts: (1) blend-weight surface mapped, rf best single partner on champion base (min w=.35), gbm best on lbr base (min w=.30), dthaz useless (logbag clone), tau harmful; (2) confidence-weighted local blending WORKS (locv10w60 beats all global cells on champion base) but adds nothing on the lbr base; (3) principled calibration (cross-fitted Platt/isotonic) is null-to-harmful — champion values already serve the count rule; (4) gamma flattening = monotone appetite (mean gains up to -120 at gamma .80 but majority-loss W/L and swaps +4.3; historical: publicly refuted axis, reopened by user 2026-08-22); (5) combos (blend order x flattened values) stack ~additively (bl_combo2 -131) but inherit the appetite signature.
170
+
171
+ Scripts: /tmp/bl/*.py (lib_bl.py = cached exact replica of cv.run_all48_oof). CSVs: /tmp/cv_oofcand_bl_*.csv (73). Prediction caches: /tmp/bl/pred_*.pkl.
agent_reports/e2_findings.md ADDED
@@ -0,0 +1,82 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # e2 — end-to-end plan optimization & fleet-level forecasting (radical pipeline)
2
+
3
+ STATUS: DONE — 2026-08-22 ~17:20. Top candidate: e2_hgatez (-245.8 +/- 88.3, clears 2*SE bar).
4
+
5
+ Baseline: champion logbag/tsroute, SCORE 1972.0 (warmup 3560.3 / panel 1839.6 / nearend 604.8), swaps 9.21.
6
+ Champion PREDICTIONS frozen & cached (48 temporal-purge logbag fits reproduce baseline EXACTLY: 1972.01, max|diff|=0.000000).
7
+ Every delta below is a pure PLANNER/BUDGET change on identical predictions. True eol only ever enters evaluate_plan.
8
+ Harness /tmp/e2/harness.py, cache /tmp/e2/preds.pkl, candidate CSVs /tmp/cv_oofcand_e2_*.csv.
9
+
10
+ ## Results table (full-48, paired vs /tmp/cv_all48oof.csv; d/dsw = delta per extra swap)
11
+
12
+ | label | ALL48 | delta | SE | W/L | swaps | d/dsw | blocks (wu/pn/ne) | verdict |
13
+ |---|---|---|---|---|---|---|---|---|
14
+ | e2_hgatez | 1726.3 | -245.8 | 88.3 | 17/8 | 11.96 | -89 | -853 / -146 / 0 | SURVIVOR — top pick |
15
+ | e2_hgate | 1773.8 | -198.3 | 84.0 | 15/8 | 11.77 | -77 | -568 / -146 / 0 | survivor; superseded by hgatez |
16
+ | e2_hgate_b | 1785.2 | -186.8 | 84.9 | 14/9 | 12.04 | -66 | -568 / -130 / 0 | budget floor on top adds nothing |
17
+ | e2_nbud | 1875.5 | -96.5 | 62.2 | 11/10 | 10.67 | -66 | -211 / -87 / 0 | appetite-equivalent, not adopted |
18
+ | e2_a093 | 1908.9 | -63.1 | 33.8 | 16/23 | 10.23 | -62 | -192 / -45 / +3 | control (blanket alpha 0.93) |
19
+ | e2_nbud075 | 1933.2 | -38.9 | 39.2 | 8/7 | 9.75 | -72 | -42 / -45 / 0 | muted beta loses the big wins |
20
+ | e2_lsadd | 1938.6 | -33.4 | 29.1 | 14/19 | 11.21 | -17 | -40 / -46 / +46 | surrogate-EV adds < simple p_be rule |
21
+ | e2_opt | 1970.3 | -1.7 | 1.6 | 21/18 | 9.21 | — | +1 / -3 / +2 | day placement is CONVERGED |
22
+ | triage-only: e2_ls -4.7+/-76.8 (9.71 sw), e2_cvar -4.4+/-67.6 (8.47 sw), e2_ls_pmax +97.6+/-57.9 (7.71 sw) | | | | | | | | washes / harmful |
23
+
24
+ ## Top candidate: e2_hgatez — hazard-gated break-even top-up
25
+
26
+ Rule (all plan-time observable): let r42 = fleet deaths RECORDED in (T-42d, T], zone42 = census of devices
27
+ currently below the 2.45V corrected threshold that crossed within the last 42d (telemetry <= T).
28
+ If max(r42, zone42) > sum(p42): open the break-even top-up p_be=0.2 (include every device with p42 >= 0.2).
29
+ Else: plan EXACTLY as champion. Fires at ~22/48 origins (warmup s_0-2 via zone42 — the ~34d recording lag
30
+ blinds r42 there; high-hazard panel eras s_4-16, s_18-23 via r42; NEVER at s_24-47 calm/near-end).
31
+
32
+ - -245.8 +/- 88.3, 17W/8L, swaps 11.96 (+2.75). Clears the survivor bar (2*SE = 177) despite the swap rise.
33
+ - Head-to-head vs pl_pbe20 (same p_be mechanism, always-on, -254.0 +/- 98.5, swaps 14.69): means statistically
34
+ identical (+8.3 +/- 44.6), hgatez better on 14 of 20 differing origins, lower per-origin std (612 vs 683),
35
+ 2.7 fewer swaps/scenario, nearend swaps unchanged (16.7 = base) vs pbe20's 18.5.
36
+ - Where the gate closes, pbe20 is bimodal: it forfeits 2 big wins the gate misses (s_3 -979, s_17 -1374 — origins
37
+ where the COUNT was adequate but the RANKING was broken; not plan-time detectable) but avoids 14 losses
38
+ averaging +220 (calm origins where extra swaps caught nothing).
39
+ - Deployment asymmetry: at near-end (most deployment-like) origins the gate never fires — adopting it cannot
40
+ change the submission plan unless recorded arrivals demonstrably exceed the model's expected count at runtime.
41
+ It is a safety net, not a recalibration.
42
+
43
+ COORDINATION: e2_hgatez and pl_pbe20 are ONE mechanism family (gated vs always-on p_be) — adjudicate together,
44
+ never stack. If appetite-driven wins are distrusted (static appetite was publicly refuted historically), the
45
+ gated form is the defensible variant: swaps stay at champion level except under an observable hazard signal.
46
+
47
+ MULTIPLICITY: 10 full-48 planner variants were run; the gate signal was widened once (r42 -> max(r42, zone42))
48
+ after seeing full-48 results. p_be=0.2 itself was found independently by the pl agent. Selection bias is real;
49
+ the survivor margin (-245.8 vs bar -177) should be read with that in mind.
50
+
51
+ ## Direction verdicts
52
+
53
+ A) SURROGATE-COST PLAN SEARCH: DEAD, with strong evidence. (i) Day placement/routing: 4x search effort
54
+ (restarts 8, iters 100, constructive start, NN routing) = -1.7 +/- 1.6 — the champion's optimize_days output is
55
+ ~converged; no recoverable slack in WHEN/ORDER. (ii) Membership local search (drop/piggyback-add/new-group vs
56
+ surrogate expected cost with per-device emergency mobility, exact mobility deltas): wash (e2_ls -4.7 +/- 76.8);
57
+ add-only full-48 -33.4 +/- 29.1 with +2.0 swaps — strictly dominated by the simple p_be>=0.2 rule at the same
58
+ appetite; the drop pass is actively harmful (+97.6). EV membership decisions inherit p42-scale noise, exactly
59
+ the historical tspig failure, reconfirmed under the purge instrument. The champion planner is ~optimal given
60
+ its beliefs; ALL remaining planner upside is in the beliefs.
61
+
62
+ B) FLEET-LEVEL DEATH FORECAST: THE WINNER, but only as a GATE, not a budget. As a budget floor
63
+ (n = 0.8*max(sum_p42, r42)): -96.5 +/- 62.2 — real, but per-swap efficiency (-66) matches blanket appetite
64
+ (-58 to -62): targeting the count adds ~nothing because conversion of extra slots is governed by per-origin
65
+ ranking luck (s_8/s_9: late 2620->660, 2310->300; s_13/14/15: late UNCHANGED, pure waste). As a gate on the
66
+ p_be top-up it is the most efficient appetite form measured (-89/extra swap). Diagnostic that motivated it:
67
+ sum(p42) undercounts the arrival process at warmup (s_0: 2.0 vs 9 deaths) and mid-panel (s_15: 5.3, late 3210).
68
+
69
+ C) PORTFOLIO/CVaR SELECTION: DEAD. (i) Building-correlation premise falsified: marginal-zone (rank 8-40)
70
+ devices die at 0.129 with NO recent building deaths vs 0.105 WITH; std logit coef of building recent-deaths
71
+ 0.05 vs p42's 0.57. Deaths do not cluster by building beyond p42. (ii) Count-matched reordering by expected
72
+ parked loss (p42 x early-death mass x 10/day + emergency-trip ops incl. travel/overtime): -4.4 +/- 67.6 wash —
73
+ the p42 order already carries the value signal; day-quantile noise on marginal devices eats the rest.
74
+
75
+ ## Conclusion
76
+
77
+ The radical-pipeline premise "the planner leaks cost" is 3/4 refuted: WHEN, ORDER, and WHO-at-fixed-count are
78
+ all at (or within noise of) their optimum given the champion's predictions. The one real leak is WHO-at-what-
79
+ count in eras where the model's belief about fleet hazard is wrong, and the fleet's own death-arrival record
80
+ (r42 + zone census) detects exactly those eras at plan time. e2_hgatez converts that detection into -245.8
81
+ +/- 88.3 (12.5% of SCORE) at +2.75 swaps. Recommend adjudicating e2_hgatez vs pl_pbe20 as the two forms of the
82
+ same finding; prefer hgatez on variance, appetite, and deployment-asymmetry grounds.
agent_reports/ft_findings.md ADDED
@@ -0,0 +1,57 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # ft — new feature engineering (temporal-purge CV)
2
+
3
+ STATUS: DONE (last updated 2026-08-22 ~20:1x)
4
+
5
+ Baseline: champion logbag/base SCORE 1972.0, swaps 9.21. All rows paired per-scenario vs /tmp/cv_all48oof.csv.
6
+ Reference points from siblings: logbag_rank 1746.4 (-225.6), frontier logbag_rank+gbm-0.30 blend 1630.3 (-341.7).
7
+
8
+ ## Results table (full-48 runs, sorted by delta vs champion 1972.0)
9
+
10
+ | label | ALL48 | delta | SE | W/L | swaps |
11
+ |---|---|---|---|---|---|
12
+ | ft_fr_ddown | 1675.0 | -297.0 | 101.6 | 34/13 | 9.29 |
13
+ | ft_fr_whit | 1748.9 | -223.1 | 84.9 | 32/15 | 9.15 |
14
+ | ft_rkw | 1758.3 | -213.7 | 68.8 | 34/13 | 8.92 |
15
+ | ft_fr_rwhit | 1782.3 | -189.7 | 81.9 | 31/16 | 8.96 |
16
+ | ft_rkwd | 1794.2 | -177.8 | 68.1 | 32/15 | 8.94 |
17
+ | ft_rwhit | 1922.7 | -49.3 | 41.0 | 29/19 | 8.96 |
18
+ | ft_rkw2 | 1931.5 | -40.6 | 37.3 | 26/19 | 8.96 |
19
+ | ft_rdip7 | 1961.9 | -10.1 | 28.4 | 24/17 | 9.27 |
20
+ | ft_dip7 | 1968.0 | -4.0 | 33.2 | 20/23 | 9.31 |
21
+ | ft_rddown | 1977.8 | +5.8 | 25.6 | 22/15 | 9.00 |
22
+ | ft_whit | 2015.1 | +43.1 | 39.2 | 18/30 | 9.44 |
23
+ | ft_wd | 2035.1 | +63.1 | 42.4 | 20/26 | 9.31 |
24
+
25
+ CRITICAL READING: the negative deltas in the top half are NOT my features — they are the r_vlast/r_tau rank pair and the gbm blend those configs sit on. The correct paired comparisons:
26
+ - ft_rkw vs logbag_rank alone: +11.9 SE 33.1 (30W/18L) — r_whit adds nothing significant.
27
+ - ft_fr_ddown vs frontier: +44.8 SE 25.7, 17W/28L — DEGRADES.
28
+ - ft_fr_whit vs frontier: +118.6 SE 48.9, 16W/32L — DEGRADES.
29
+ - ft_fr_rwhit vs frontier: +152.1 SE 42.3, 16W/31L — DEGRADES.
30
+ - ft_rkwd vs ft_rkw: r_dip7 costs ~36.
31
+ - ft_rkw2 (r_whit REPLACING r_tau): -40.6 vs champion — collapses from rkw's -213.7. r_tau is load-bearing; whit is no substitute.
32
+
33
+ ## What each feature was
34
+
35
+ - whit: analytic Wiener 42d first-hit probability (staleness-conditioned inverse-Gaussian CDF from wnr_m/wnr_s2/v_corr_last, per-origin fleet-median shrinkage), fed as logit. r_whit = within-origin pct-rank.
36
+ - dip7: v_last - v_min_7 (recent dip). newlow: v_min_30 - v_min_life. ddown: drawdown from running max of temp-corrected V (raw rebuild).
37
+ - b250_60/b242_60: days below 2.50/2.42 V in last 60d (raw rebuild). readslope60: 60d slope of daily read count. macd: EWMA(10d)-EWMA(30d) momentum. divmm: min-vs-median slope divergence. All from a causal per-device rebuild of battery_metrics.parquet (/tmp/ft/rawfeat.parquet).
38
+ - cohort_overdue/rel_age: install-batch calibrated clock (already in table, never in FEATURES).
39
+ - ghost: (days_below_245>42 & v_corr_last<2.55) label-process ghost indicator; ft_gz = hard GHOST_ZERO.
40
+
41
+ ## Triage graveyard (17 origins; cut, not confirmed)
42
+
43
+ cohort +20/+43, b250_60 +66 (5W/11L), obsr +75, stsl +52, b242_60 +7, readsl +2, fiterr +22, ghost +44, ghostv -22 (noise), GHOST_ZERO +533 (swaps 8.5->5.6, count rule gutted — phase-15 non-adoption emphatically confirmed under the purge; historical: never adopted).
44
+
45
+ ## Structural findings worth keeping
46
+
47
+ 1. Slot squatters vs wall misses (purged fits, 9 origins): the alive devices occupying top-12 ranks are largely label-process ghosts (median days_below_245=43, b250_60=24.5); the missed deaths at ranks 13-30 sit HIGHER in voltage (v_corr 2.479 vs 2.441, tau_projected 23 vs 9). BUT ghost-flagged devices still die at 19% (vs 29% non-ghost at same depth), so both demoting them (feature) and zeroing them (GHOST_ZERO) lose more late-swap than they free in slots. The squatter problem is real but not solvable by a ghost flag.
48
+ 2. Rank transforms are the transfer device on this instrument: raw whit +43 -> r_whit -49 (same information, rank form). Confirms the sibling logbag_rank finding from the feature side.
49
+ 3. Offline marginal-signal screens (AUC beyond v_last) DO NOT predict cost: b250_60 screened best (0.643) and hurt worst; the "extra signal" pointed at ghosts.
50
+ 4. 17-origin even-panel triage can cut losers but cannot confirm winners: ft_whit read -71 on the subset and +43 on the full 48 (the full panel block alone flipped to +57).
51
+
52
+ ## Conclusion / recommendation
53
+
54
+ NO FEATURE SURVIVOR. Recommend the frontier config UNCHANGED (logbag_rank + gbm-0.30, 1630.3) — every tested addition (whit raw/ranked, dip7, ddown, and by triage all others) is neutral-to-harmful on top of it. The champion's BASE_FEATURES remain fully distilled; the r_vlast/r_tau rank pair subsumes what my candidates offered.
55
+
56
+ Scripts: /tmp/ft/run.py (all variants), /tmp/ft/rawbuild.py (+ /tmp/ft/rawfeat.parquet).
57
+ CSVs: /tmp/cv_oofcand_ft_{whit,dip7,wd,rwhit,rdip7,rddown,rkw,rkwd,rkw2,fr_whit,fr_rwhit,fr_ddown}.csv; triage /tmp/ft/tri_ft_*.csv.
agent_reports/md_findings.md ADDED
@@ -0,0 +1,27 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # md — model families & hyperparameters — FINAL
2
+
3
+ STATUS: DONE 2026-08-22. Scripts: /tmp/md/runner.py, /tmp/md/mdmodels.py. Subset CSVs: /tmp/md/cv_sub_md_*.csv. Full-48 CSVs: /tmp/cv_oofcand_md_rank_c3_gbm30.csv, /tmp/cv_oofcand_md_c3.csv.
4
+
5
+ References: CHAMP = /tmp/cv_all48oof.csv (logbag, ALL48 1972.0, swaps 9.21). FRONTIER = /tmp/cv_oofcand_bl_lbr_gbm30.csv (logbag_rank + gbm@0.30, ALL48 1630.3, swaps 9.23).
6
+
7
+ ## FULL-48 runs (the only numbers that count)
8
+
9
+ | label | ALL48 | delta vs champ | SE | W/L | delta vs frontier | SE | W/L | swaps |
10
+ |---|---|---|---|---|---|---|---|---|
11
+ | md_rank_c3_gbm30 (frontier w/ base C=3) | **1615.24** | -356.8 | 106.5 | 36/11 | -15.0 | 13.2 | 18/22 | 9.27 |
12
+ | md_c3 (champion w/ C=3) | 1965.24 | -6.8 | 4.9 | 9/8 | — | — | — | 9.19 |
13
+
14
+ **Verdict: no survivor past the 2-SE bar.** md_rank_c3_gbm30 is the best absolute number seen anywhere (1615.24, swaps flat) but its edge over the frontier is 1.1 SE with W/L against (mean carried by a few scenarios). Treat as an optional coin-flip tweak for the frontier owner, not an adoption. C=2 base behaves identically to C=3 (saturation); C<1 hurts everywhere.
15
+
16
+ ## Key diagnostics (subset, 17 origins)
17
+
18
+ 1. **The frontier's gbm blend increment is NON-MONOTONE response.** Replacing the gbm partner with a monotone-constrained HGB (voltage down = risk up etc., sklearn monotonic_cst) destroys the increment: conservative constraints +141.6±46.3 vs frontier (W3/L12), aggressive +268.5±71.8. Whatever the gbm adds — real interactions or same-battery flattery — it is exactly the part a monotone GBM cannot express.
19
+ 2. **The frontier's partner params are locally optimal on every axis tested**: depth 2 (+54), depth 4 (+156), iters 100 (+23), iters 400@lr.05 (+129), leaf 50 (+112).
20
+ 3. **gbm is uniquely the right partner family**: ExtraTrees partner +101±61 (W4/L13), RandomForest partner +69±74 (W4/L12), all at weight 0.30.
21
+ 4. **Calibration is appetite in disguise and NOT additive to the frontier.** On champion base: calbag_sig -165±86, cal_iso -88±74, logcal -107±79 — all with swaps +2.0-2.1 and W/L ~even. Calibrated frontier base + gbm blend: -0.6±62 vs frontier (wash) with swaps 10.41 vs 8.29. The calibrated count buys nothing the frontier ordering hasn't already banked.
22
+ 5. **Champion hyperparameter plateau confirmed**: bags 15 optimal (5 flat; 30/60 +39/+44), impute median > mean (+42), scaler required (removal = noisy wash, 8x slower), L1 wash (+15±46), elasticnet skipped (bracketed by L2=0 and L1=wash), poly2 interactions worse (+34 to +141), class_weight=balanced catastrophic (+2829, swaps 63.7 — count channel explodes), MLP noise (-55±143), DayQuantiles depth/trees noise.
23
+ 6. Standalone flexible families (flagged: flexible-family purge flattery, and none approach the frontier): xtrees -160±104, rf leaf2 -171±129 (swaps +1.2), rf leaf10 -114±126 (swaps +0.9), hgb_mono +88±167.
24
+
25
+ ## Recommendation
26
+
27
+ Frontier (logbag_rank + gbm@0.30, C=1, bags=15, gbm defaults) stands. Its hyperparameters are already at a local optimum on every axis this lane tested. If the frontier owner wants a free coin-flip: base C=3 (full-48 1615.24, -15.0±13.2) — flat swaps, no protocol change, but not statistically earned.
agent_reports/pl_findings.md ADDED
@@ -0,0 +1,149 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # PL agent - planner/scheduling/day-placement/routing sweep (purge CV)
2
+
3
+ STATUS: DONE — all planned runs complete (last updated 2026-08-22 16:37:26)
4
+
5
+ Baseline: champion SCORE 1972.01 (warmup 3560.3 / panel 1839.6 / nearend 604.8; swaps 9.21).
6
+ Paired per scenario vs /tmp/cv_all48oof.csv. Survivor bar: delta < -2*SE.
7
+ Appetite axis REOPENED by user for this sweep (historical public results noted).
8
+
9
+ Code findings (pre-run):
10
+ - CHAMPION['day_q'] is DEAD for tsroute (signature-only); day placement = cost_curves + optimize_days.
11
+ - run_all48_oof hardcodes p_be=0/floor_day=0/p_conf=0.5 -> tested via call-time wrapper (identity check: delta exactly 0.0).
12
+ - Planner EARLY/LATE 0.5/10.0 match evaluator exactly (20:1). EMERGENCY_DAY=45 vs true queue ~48.
13
+
14
+ ## Results (sorted by delta; wu=warmup s0-7, pn=panel s8-41, ne=nearend s42-47)
15
+
16
+ | label | ALL48 | delta | SE | W/L | swaps | wu delta | pn delta | ne delta |
17
+ |---|---|---|---|---|---|---|---|---|
18
+ | pl_stack_hgatez | 1559.4 | -412.6 | 106.9 | 39W/9L | 11.7 | -1513 | -209 | -98 |
19
+ | pl_stack_hg25 | 1586.6 | -385.4 | 106.5 | 37W/11L | 10.6 | -1458 | -183 | -101 |
20
+ | pl_stack_hg30 | 1592.2 | -379.8 | 104.6 | 36W/12L | 9.9 | -1345 | -202 | -101 |
21
+ | pl_stack_shiftp4 | 1614.0 | -358.0 | 102.9 | 37W/11L | 9.2 | -1296 | -173 | -156 |
22
+ | pl_stack_shiftp2 | 1617.3 | -354.7 | 99.3 | 37W/11L | 9.2 | -1257 | -181 | -136 |
23
+ | pl_stack_shiftp6 | 1619.7 | -352.4 | 102.6 | 37W/11L | 9.3 | -1287 | -169 | -145 |
24
+ | pl_stack_hg15 | 1620.8 | -351.2 | 113.9 | 35W/13L | 13.5 | -1481 | -132 | -87 |
25
+ | pl_stack_base | 1630.3 | -341.7 | 103.8 | 37W/11L | 9.2 | -1284 | -163 | -101 |
26
+ | pl_pbe10g8 | 1670.4 | -301.6 | 128.0 | 12W/9L | 15.1 | -1708 | -31 | +39 |
27
+ | pl_pbe20g10 | 1673.7 | -298.3 | 93.2 | 21W/14L | 13.2 | -975 | -192 | +3 |
28
+ | pl_pbe15g8 | 1693.9 | -278.1 | 103.3 | 11W/10L | 12.7 | -1275 | -94 | +8 |
29
+ | pl_pbe20 | 1718.0 | -254.0 | 98.5 | 22W/21L | 14.7 | -975 | -132 | +14 |
30
+ | pl_pbe15 | 1735.6 | -236.4 | 130.9 | 18W/30L | 18.7 | -1473 | +3 | +55 |
31
+ | pl_stack_hg10 | 1735.7 | -236.3 | 130.4 | 30W/18L | 16.2 | -1564 | +48 | -75 |
32
+ | pl_pbe20g8 | 1755.2 | -216.8 | 81.5 | 12W/6L | 11.2 | -871 | -101 | +0 |
33
+ | pl_a15 | 1770.1 | -201.9 | 91.7 | 18W/25L | 14.7 | -887 | -81 | +27 |
34
+ | pl_a12 | 1798.1 | -173.9 | 72.5 | 22W/18L | 12.2 | -619 | -102 | +11 |
35
+ | pl_pbe30 | 1802.4 | -169.7 | 58.0 | 17W/10L | 10.8 | -598 | -99 | +3 |
36
+ | pl_pbe10 | 1849.1 | -122.9 | 164.5 | 16W/32L | 25.4 | -1870 | +236 | +170 |
37
+ | pl_pbe30g8 | 1854.4 | -117.6 | 42.9 | 9W/3L | 9.8 | -504 | -47 | +0 |
38
+ | pl_a10 | 1878.8 | -93.2 | 43.7 | 19W/20L | 10.8 | -269 | -69 | +7 |
39
+ | pl_a09 | 1896.0 | -76.0 | 33.1 | 14W/22L | 10.0 | -192 | -63 | +3 |
40
+ | pl_shiftp4 | 1958.8 | -13.2 | 9.4 | 22W/25L | 9.2 | -2 | -9 | -54 |
41
+ | pl_shift2 | 1964.7 | -7.3 | 9.4 | 21W/27L | 9.3 | -1 | -1 | -50 |
42
+ | pl_ec06 | 1968.8 | -3.2 | 11.1 | 7W/1L | 8.7 | +0 | +5 | -55 |
43
+ | pl_sd3 | 1975.7 | +3.7 | 2.4 | 12W/11L | 9.2 | +0 | +2 | +15 |
44
+ | pl_blend30 | 1977.6 | +5.5 | 4.7 | 13W/28L | 9.2 | -0 | +7 | +7 |
45
+ | pl_ed48 | 1978.0 | +6.0 | 4.2 | 1W/6L | 9.5 | +0 | +4 | +27 |
46
+ | pl_sec5 | 1980.8 | +8.8 | 39.7 | 12W/25L | 11.5 | -170 | +49 | +18 |
47
+ | pl_ec10 | 1991.2 | +19.2 | 8.2 | 1W/7L | 10.5 | +0 | +6 | +120 |
48
+ | pl_ec00 | 2016.2 | +44.2 | 27.5 | 3W/5L | 7.6 | +0 | +14 | +273 |
49
+ | pl_ec12 | 2019.8 | +47.8 | 16.8 | 0W/8L | 12.0 | +0 | +25 | +240 |
50
+ | pl_pig10 | 2024.0 | +52.0 | 27.6 | 11W/31L | 8.7 | -43 | +51 | +187 |
51
+ | pl_a07 | 2043.9 | +71.9 | 31.3 | 19W/13L | 8.5 | +306 | +30 | -2 |
52
+ | pl_a06 | 2110.8 | +138.8 | 50.2 | 19W/20L | 7.8 | +475 | +85 | -3 |
53
+
54
+ ## Candidate log
55
+
56
+ - pl_stack_hgatez: stack + e2 census-gated p_be=0.2 (SHIPPING CANDIDATE; gate marginal -70.8 +/-42.4 vs stack_base) -> -412.6 +/-106.9 [wu -1513 (8W/0L), pn -209 (25W/9L), ne -98], swaps 11.7. SURVIVOR (beats 2SE bar). CAVEAT: swaps 11.7 vs 9.2 - appetite-driven; check block attribution.
57
+ - pl_stack_hg25: stack + census-gated p_be=0.25 -> -385.4 +/-106.5 [wu -1458 (8W/0L), pn -183 (23W/11L), ne -101], swaps 10.6. SURVIVOR (beats 2SE bar). CAVEAT: swaps 10.6 vs 9.2 - appetite-driven; check block attribution.
58
+ - pl_stack_hg30: stack + census-gated p_be=0.3 -> -379.8 +/-104.6 [wu -1345 (8W/0L), pn -202 (22W/12L), ne -101], swaps 9.9. SURVIVOR (beats 2SE bar).
59
+ - pl_stack_shiftp4: stack + risk-scaled belief shift 4*p42 d earlier -> -358.0 +/-102.9 [wu -1296 (8W/0L), pn -173 (23W/11L), ne -156], swaps 9.2. SURVIVOR (beats 2SE bar).
60
+ - pl_stack_shiftp2: stack + risk-scaled belief shift 2*p42 d earlier (swap-neutral timing) -> -354.7 +/-99.3 [wu -1257 (8W/0L), pn -181 (23W/11L), ne -136], swaps 9.2. SURVIVOR (beats 2SE bar).
61
+ - pl_stack_shiftp6: stack + risk-scaled belief shift 6*p42 d earlier -> -352.4 +/-102.6 [wu -1287 (7W/1L), pn -169 (24W/10L), ne -145], swaps 9.3. SURVIVOR (beats 2SE bar).
62
+ - pl_stack_hg15: stack + census-gated p_be=0.15 -> -351.2 +/-113.9 [wu -1481 (7W/1L), pn -132 (22W/12L), ne -87], swaps 13.5. SURVIVOR (beats 2SE bar). CAVEAT: swaps 13.5 vs 9.2 - appetite-driven; check block attribution.
63
+ - pl_stack_base: MODEL FRONTIER logbag_rank + gbm rank-blend w=0.30 (cached preds; replication of model agent 1630.3) -> -341.7 +/-103.8 [wu -1284 (8W/0L), pn -163 (23W/11L), ne -101], swaps 9.2. SURVIVOR (beats 2SE bar).
64
+ - pl_pbe10g8: p_be=0.1 gated N<8 (warmup-only strong top-up) -> -301.6 +/-128.0 [wu -1708 (7W/0L), pn -31 (5W/7L), ne +39], swaps 15.1. SURVIVOR (beats 2SE bar). CAVEAT: swaps 15.1 vs 9.2 - appetite-driven; check block attribution.
65
+ - pl_pbe20g10: p_be=0.2 gated N<10 -> -298.3 +/-93.2 [wu -975 (7W/0L), pn -192 (14W/13L), ne +3], swaps 13.2. SURVIVOR (beats 2SE bar). CAVEAT: swaps 13.2 vs 9.2 - appetite-driven; check block attribution.
66
+ - pl_pbe15g8: p_be=0.15 gated N<8 -> -278.1 +/-103.3 [wu -1275 (6W/1L), pn -94 (5W/7L), ne +8], swaps 12.7. SURVIVOR (beats 2SE bar). CAVEAT: swaps 12.7 vs 9.2 - appetite-driven; check block attribution.
67
+ - pl_pbe20: break-even prob top-up p_be=0.2 (include all p42>=0.2 beyond count rule) -> -254.0 +/-98.5 [wu -975 (7W/0L), pn -132 (15W/19L), ne +14], swaps 14.7. SURVIVOR (beats 2SE bar). CAVEAT: swaps 14.7 vs 9.2 - appetite-driven; check block attribution.
68
+ - pl_pbe15: p_be=0.15 top-up -> -236.4 +/-130.9 [wu -1473 (7W/1L), pn +3 (11W/23L), ne +55], swaps 18.7. inconclusive (negative, inside 2SE). CAVEAT: swaps 18.7 vs 9.2 - appetite-driven; check block attribution.
69
+ - pl_stack_hg10: stack + census-gated p_be=0.1 -> -236.3 +/-130.4 [wu -1564 (7W/1L), pn +48 (18W/16L), ne -75], swaps 16.2. inconclusive (negative, inside 2SE). CAVEAT: swaps 16.2 vs 9.2 - appetite-driven; check block attribution.
70
+ - pl_pbe20g8: p_be=0.2 gated: fires only when count-rule N<8 (starvation gate, deployable) -> -216.8 +/-81.5 [wu -871 (6W/0L), pn -101 (6W/6L), ne +0], swaps 11.2. SURVIVOR (beats 2SE bar). CAVEAT: swaps 11.2 vs 9.2 - appetite-driven; check block attribution.
71
+ - pl_a15: appetite alpha=1.5 (historical public: 2188.78 vs 1661.45) -> -201.9 +/-91.7 [wu -887 (7W/1L), pn -81 (11W/20L), ne +27], swaps 14.7. SURVIVOR (beats 2SE bar). CAVEAT: swaps 14.7 vs 9.2 - appetite-driven; check block attribution.
72
+ - pl_a12: appetite alpha=1.2 -> -173.9 +/-72.5 [wu -619 (7W/0L), pn -102 (15W/16L), ne +11], swaps 12.2. SURVIVOR (beats 2SE bar). CAVEAT: swaps 12.2 vs 9.2 - appetite-driven; check block attribution.
73
+ - pl_pbe30: p_be=0.3 top-up -> -169.7 +/-58.0 [wu -598 (7W/0L), pn -99 (10W/9L), ne +3], swaps 10.8. SURVIVOR (beats 2SE bar). CAVEAT: swaps 10.8 vs 9.2 - appetite-driven; check block attribution.
74
+ - pl_pbe10: p_be=0.1 top-up -> -122.9 +/-164.5 [wu -1870 (8W/0L), pn +236 (8W/26L), ne +170], swaps 25.4. inconclusive (negative, inside 2SE). CAVEAT: swaps 25.4 vs 9.2 - appetite-driven; check block attribution.
75
+ - pl_pbe30g8: p_be=0.3 gated N<8 -> -117.6 +/-42.9 [wu -504 (6W/0L), pn -47 (3W/3L), ne +0], swaps 9.8. SURVIVOR (beats 2SE bar).
76
+ - pl_a10: appetite alpha=1.0 -> -93.2 +/-43.7 [wu -269 (6W/1L), pn -69 (13W/18L), ne +7], swaps 10.8. SURVIVOR (beats 2SE bar). CAVEAT: swaps 10.8 vs 9.2 - appetite-driven; check block attribution.
77
+ - pl_a09: appetite alpha=0.9 -> -76.0 +/-33.1 [wu -192 (4W/2L), pn -63 (10W/19L), ne +3], swaps 10.0. SURVIVOR (beats 2SE bar).
78
+ - pl_shiftp4: risk-scaled shift: quantiles 4*p42 days earlier (high risk -> earlier) -> -13.2 +/-9.4 [wu -2 (3W/4L), pn -9 (16W/18L), ne -54], swaps 9.2. inconclusive (negative, inside 2SE).
79
+ - pl_shift2: belief shift: all day-quantiles 2d earlier, optimizer re-solves -> -7.3 +/-9.4 [wu -1 (3W/5L), pn -1 (14W/20L), ne -50], swaps 9.3. inconclusive (negative, inside 2SE).
80
+ - pl_ec06: ec_margin=0.6 -> -3.2 +/-11.1 [wu +0 (0W/0L), pn +5 (2W/1L), ne -55], swaps 8.7. inconclusive (negative, inside 2SE).
81
+ - pl_sd3: split_days=3 -> +3.7 +/-2.4 [wu +0 (0W/0L), pn +2 (12W/7L), ne +15], swaps 9.2. reject (worse).
82
+ - pl_blend30: cost_curves blend=0.3 (low-p42 CDF toward uniform) -> +5.5 +/-4.7 [wu -0 (4W/3L), pn +7 (8W/20L), ne +7], swaps 9.2. reject (worse).
83
+ - pl_ed48: EMERGENCY_DAY=48 exact queue price (champion 45) -> +6.0 +/-4.2 [wu +0 (0W/0L), pn +4 (1W/2L), ne +27], swaps 9.5. reject (worse).
84
+ - pl_sec5: second-chance: ranks N+1..N+5 piggyback on already-visited buildings (marginal travel ~0) -> +8.8 +/-39.7 [wu -170 (4W/1L), pn +49 (8W/21L), ne +18], swaps 11.5. reject (worse).
85
+ - pl_ec10: ec_margin=1.0 -> +19.2 +/-8.2 [wu +0 (0W/0L), pn +6 (1W/2L), ne +120], swaps 10.5. reject (worse).
86
+ - pl_ec00: ec_margin=0 (EV top-up off; champion 0.8) -> +44.2 +/-27.5 [wu +0 (0W/0L), pn +14 (1W/2L), ne +273], swaps 7.6. reject (worse).
87
+ - pl_ec12: ec_margin=1.2 -> +47.8 +/-16.8 [wu +0 (0W/0L), pn +25 (0W/3L), ne +240], swaps 12.0. reject (worse).
88
+ - pl_pig10: plan_tspig2 alpha2=1.0 rank-gated piggyback planner -> +52.0 +/-27.6 [wu -43 (2W/2L), pn +51 (7W/25L), ne +187], swaps 8.7. reject (worse).
89
+ - pl_a07: appetite alpha=0.7 -> +71.9 +/-31.3 [wu +306 (1W/5L), pn +30 (17W/8L), ne -2], swaps 8.5. reject (worse).
90
+ - pl_a06: appetite alpha=0.6 -> +138.8 +/-50.2 [wu +475 (1W/6L), pn +85 (17W/14L), ne -3], swaps 7.8. reject (worse).
91
+
92
+ ## Conclusion (final, 2026-08-22 16:37)
93
+
94
+ 35 full-48 paired runs, zero peer file races (module md5 pinned start/end), identity
95
+ check of the wrapper reproduced baseline exactly (delta 0.0).
96
+
97
+ ### 1. The purge CV's appetite direction is ANTI-correlated with the public leaderboard
98
+ alpha curve on purge: 0.6 +138.8 / 0.7 +71.9 / 0.8 base / 0.9 -76.0 / 1.0 -93.2 /
99
+ 1.2 -173.9 / 1.5 -201.9 — monotone down. Public measured alpha 1.5 at 2188.78 vs
100
+ 1661.45 (+527). Same for cert-first (wd agent). Count-coupled purge wins are
101
+ REPORT-ONLY per coordination ruling; every p_be / gated-p_be / alpha "survivor" in
102
+ the table above carries that tag. Mechanically the purge starves models (warmup
103
+ hardest, panel too), so optimal appetite shifts up — an instrument property, not a
104
+ deployable insight.
105
+
106
+ ### 2. p_be break-even top-up: biggest purge lever, warmup-concentrated, count-coupled
107
+ Ungated p_be: 0.1 -122.9 (25.4 swaps) / 0.15 -236.4 (18.7) / 0.2 -254.1 (14.7) /
108
+ 0.3 -169.7 (10.8); peak 0.2. Gains concentrate at warmup (pbe20: wu -975 7W/0L,
109
+ panel wash at +6.3 swaps). Two gate triggers compared at p_be=0.2: e2's arrival
110
+ census (-245.8 +/-88.3, 11.96 swaps) vs my count-rule N<8 (-216.8 +/-81.5, 11.19) —
111
+ statistically equivalent; N<10 gate -298.3 +/-93.2 (13.2 swaps; gate width tuned
112
+ in-sample, discount accordingly).
113
+
114
+ ### 3. Full stack (logbag_rank+gbm30 x census-gated p_be): holds on purge, gate part is report-only
115
+ stack_base replicates 1630.26 exactly. stack+hgatez = 1559.4 (-412.6 +/-106.9 vs
116
+ champion), p_be=0.2 optimal under the gate (0.1 -236 / 0.15 -351 / 0.2 -413 /
117
+ 0.25 -385 / 0.3 -380). BUT the gate's paired MARGINAL on the frontier is only
118
+ -70.8 +/-42.4 (wu -229 +/-150, panel -46.6 +/-47.7 at +3.2 swaps) — fails the
119
+ "panel gain at flat swaps" shipping bar. The frontier model itself already repairs
120
+ most of the warmup undercount (its warmup swaps 9.9 vs champion 5.0). Verdict:
121
+ ship the ordering-only frontier; the gate is report-only.
122
+
123
+ ### 4. Day placement: converged except one weak, swap-neutral lever
124
+ - ed48 +6.0 / sd3 +3.7 / blend30 +5.6 / global shift2 -7.3: all noise or reject —
125
+ champion pricing/routing/split confirmed optimal under purge.
126
+ - RISK-SCALED belief shift (quantiles k*p42 days earlier): champion model
127
+ shiftp4 -13.2 +/-9.4 (swaps 9.23, exactly flat); frontier model marginal
128
+ shiftp2 -12.9 +/-10.7, shiftp4 -16.3 +/-10.9, shiftp6 -10.6 +/-12.9 (swaps flat
129
+ 9.25). Reproducible sign and size across two independent prediction sets, peak
130
+ k=4, never crosses 2SE individually. The ONLY swap-neutral candidate in my lane
131
+ with any signal. Recommend: cheap public A/B alongside the frontier if there is
132
+ submission budget; otherwise drop.
133
+
134
+ ### 5. Piggyback / second-chance: dead on the purge CV too
135
+ sec5 (ranks N+1..N+5 into visited buildings at ~zero marginal travel) +8.8 +/-39.7
136
+ 12W/26L; tspig2 alpha2=1.0 +52.0 +/-27.6. Matches the historical "even zero-travel
137
+ extras lose". Closed.
138
+
139
+ ### Top recommendation
140
+ No planner-side change qualifies for shipping on its own. The one candidate worth
141
+ carrying forward is pl_stack_shiftp4 (frontier model + risk-scaled 4*p42-day
142
+ earlier placement): purge 1614.0 vs frontier 1630.3, swap-neutral, reproducible
143
+ across model bases, sub-2SE — A/B-only. Everything count-coupled (p_be family,
144
+ alpha, gates incl. the -412.6 stack+hgatez) is report-only per the calibration
145
+ ruling; the purge CV cannot adjudicate count changes.
146
+
147
+ Artifacts: /tmp/pl/run.py (knob/wrapper driver), /tmp/pl/stack.py,
148
+ /tmp/pl/stack_shift.py, /tmp/pl/blocks.py, /tmp/pl/update_report.py,
149
+ CSVs /tmp/cv_oofcand_pl_*.csv (one per row above), log /tmp/pl/results.txt.
agent_reports/rk_findings.md ADDED
@@ -0,0 +1,61 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # rk — learning-to-rank (value-preserving order injection) — FINAL
2
+
3
+ STATUS: DONE — no rk survivor over the current frontier. Last updated 2026-08-22 18:25
4
+
5
+ Method: pairwise/listwise rankers supply the ORDER, the base model supplies the
6
+ p42 VALUES via cv.run_all48_oof(blend=('rk_r', w)). Within-origin (dying,
7
+ surviving) pairs, hard-negative mining (top-40 survivors by prelim pointwise
8
+ score + 10 random per death), 3-seed rank-bagged torch MLP(16); ListNet
9
+ (listwise softmax CE per origin, days-to-death gain) variant; linear PairLogit
10
+ variant. Code: /tmp/rk/rk_models.py, runner /tmp/rk/run_cost.py.
11
+
12
+ ## Full-48 results (paired vs /tmp/cv_all48oof.csv champion baseline 1972.0)
13
+
14
+ | label | ALL48 | delta | SE | W/L | swaps |
15
+ |---|---|---|---|---|---|
16
+ | rk_lbr_trbag3r_b50 | 1729.0 | -243.0 | 104.9 | 30/18 | 9.29 |
17
+ | rk_lbr_trbag3r_b25 | 1750.0 | -222.0 | 98.0 | 31/17 | 9.29 |
18
+ | rk_trbag3_b25 | 1957.0 | -15.0 | 36.5 | 20/23 | 9.23 |
19
+ | rk_comb_b25 | 1971.9 | -0.1 | 28.0 | 19/19 | 9.31 |
20
+ | rk_lnbag3g2_b25 | 1974.3 | +2.3 | 24.0 | 17/22 | 9.29 |
21
+ | rk_trbag3_b50 | 1985.7 | +13.7 | 54.6 | 17/30 | 9.25 |
22
+
23
+ (rk_lbr_* rows: base kind='logbag_rank', ranker trained WITH r_vlast/r_tau.
24
+ CSVs: /tmp/cv_oofcand_rk_*.csv. Baseline swaps 9.21 — all rows count-flat.)
25
+
26
+ ## Head-to-head vs the frontier (bl_lbr_gbm30 = logbag_rank + gbm@0.30, 1630.3)
27
+
28
+ - rk_lbr_trbag3r_b25 vs bl_lbr_gbm30: +119.8 SE 42.9, W/L 17/27 (worse on
29
+ every block: warmup +165, panel +130).
30
+ - rk_lbr_trbag3r_b50 vs bl_lbr_gbm30: +98.8 SE 58.0, W/L 15/33.
31
+ - VERDICT: the learned pairwise order LOSES to the gbm order as blend partner
32
+ on the same base. Do not adopt any rk candidate.
33
+
34
+ ## What was learned (transferable)
35
+
36
+ 1. Ordering diagnostics improve but do not convert: rec13 .651 -> .689
37
+ (RankNet bag3 b25) / .704 (ListNet g2 b25) on 62 deaths, yet panel cost
38
+ stayed flat-to-worse in every run. Phase-47's lesson replicated on the
39
+ temporal-purge instrument: head-ordering gains are eaten in conversion.
40
+ 2. The ranker's value concentrates EXACTLY where the base is data-starved:
41
+ on the champion base, warmup late_swap -161/origin (b25, 4W/0L) deepening
42
+ to -213 at b50, while panel worsened +20 -> +66. Clean two-sided dose-
43
+ response; a fixed global blend weight cannot win on the champion base.
44
+ The bl lane's logbag_rank+gbm30 (warmup -1284) hit the same vein harder.
45
+ 3. Single-seed torch rankers are unstable (one seed fell below champion);
46
+ 3-seed rank-bagging fixed it. Any future torch ranker should seed-bag.
47
+ 4. Pure ranker order (no blend) is far worse than champion (rec13 .502
48
+ RankNet, .676 ListNet standalone) — all value is in the hybrid.
49
+ 5. Cross-origin pairs add nothing over within-origin (diag .651 vs .665).
50
+ 6. RankNet and ListNet deltas correlate only 0.43, but rank-averaging them
51
+ diluted wins to 0.0 rather than uniting them.
52
+ 7. Post-hoc gated splice (ranker only on warmup, w=0 elsewhere): -28.0
53
+ SE 18.8 (b25). Not claimed: gate threshold chosen after seeing the wins,
54
+ no natural cliff in the gate signal (past-side pool grows smoothly
55
+ 18k->66k pairs). Recorded only.
56
+
57
+ ## Artifacts
58
+ - /tmp/rk/rk_models.py (PairLogit, TorchRankNet, TorchListNet)
59
+ - /tmp/rk/run_cost.py (runner; RK_EXTRA env adds ranker-only features)
60
+ - /tmp/rk/diag_rank.py, diag_seeds.py, diag_listnet.py + CSVs in /tmp/rk/
61
+ - /tmp/cv_oofcand_rk_{trbag3_b25,trbag3_b50,lnbag3g2_b25,comb_b25,lbr_trbag3r_b25,lbr_trbag3r_b50}.csv
agent_reports/sv_findings.md ADDED
@@ -0,0 +1,112 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # sv — Full survival curves + decision-theoretic visit-day planning
2
+
3
+ STATUS: DONE. Two of the three radical axes REFUTED with clean attribution;
4
+ one survivor-shaped composite: sv_dhgate (cold-start-gated censored-pool
5
+ hazard) = -51.4 +/- 22.1 (-2.33 SE), swaps 9.23 vs 9.21 (flat).
6
+
7
+ Theme: replace (a) single-horizon p42 with censoring-aware full survival
8
+ curves S(t), t=1..42, and (b) the 0.8*sum(p42) count rule with per-device
9
+ expected-cost economics. Protocol: exact copy of cv.run_all48_oof loop
10
+ (temporal purge, full-fleet, floor off); harness copy verified byte-identical
11
+ to champion baseline. Baseline /tmp/cv_all48oof.csv (champion 1972.0/9.21sw).
12
+
13
+ ## Results — FULL-48 (paired, n=48)
14
+
15
+ | label | ALL48 | delta | SE | W/L | swaps |
16
+ |---|---|---|---|---|---|
17
+ | sv_dhgate | 1920.6 | -51.4 | 22.1 | 7/1 (8 active) | 9.23 |
18
+ | sv_dhr_vp | 1932.4 | -39.6 | 58.3 | 25/20 | 9.33 |
19
+ | sv_dhr_who | 1937.5 | -34.5 | 88.2 | 28/20 | 9.04 |
20
+ | sv_dh_who | 1951.1 | -20.9 | 43.8 | 24/24 | 9.31 |
21
+ | sv_lb_ec | 1967.5 | -4.5 | 47.0 | 19/26 | 13.17 |
22
+ | sv_dhrb_vp | 1989.6 | +17.6 | 52.0 | 22/17 | 9.27 |
23
+
24
+ - sv_dhgate: gate at fit time on past_uniq_pos = unique dead devices among
25
+ PAST-side purged closed pairs; < 20 -> DTHazFine (3d-bucket discrete-time
26
+ hazard on the censored pool), else champion logbag. Planner untouched.
27
+ Gate fires at exactly s_0-7 (past_uniq_pos 3..16; s_8 = 20). 20 is
28
+ CHAMPION['floor_gate'], not tuned here. Blocks: warmup 3251.8 (-308.6,
29
+ 7W/1L), panel 1839.6 (=champion), nearend 604.8 (=champion).
30
+ End-to-end boundary run s_5-s_10 verified byte-exact vs composition.
31
+ - sv_dh_who: hazard everywhere. Warmup -308.6 / panel +43.8 / nearend -4.4.
32
+ The hazard is a cold-start specialist, slightly worse than logbag when
33
+ the past side is rich.
34
+ - sv_dhr_who / sv_dhr_vp: + within-origin rank features (r_vlast/r_tau);
35
+ triage promise (-107) did not survive the full panel (+4.4/+5.6); s_2
36
+ blowup +2150 in the un-remapped form. Value-preserving control shows the
37
+ panel ordering gain was noise.
38
+ - sv_lb_ec (decision-theoretic COUNT: visit iff min-day expected cost <
39
+ park): -4.5 at swaps 13.17 (+4 appetite), nearend +171.2 (0W/6L).
40
+ REFUTED — see appetite calibration below.
41
+ - sv_dhrb_vp (50/50 rank blend logbag+hazard, value-preserving): +17.6. No
42
+ committee effect.
43
+
44
+ ## Results — triage (origins 8..40 step 2, n=17, paired)
45
+
46
+ | label | T17 mean | delta | SE | W/L | swaps |
47
+ |---|---|---|---|---|---|
48
+ | sv_lb_ec12 | 1711.9 | -158.2 | 76.2 | 12/5 | 12.8 |
49
+ | sv_dhr_who | 1763.3 | -106.8 | 89.8 | 9/8 | 8.5 |
50
+ | sv_lb_ec | 1773.9 | -96.1 | 95.9 | 10/7 | 10.6 |
51
+ | sv_dhc_ec12 | 1786.8 | -83.3 | 89.1 | 9/8 | 11.4 |
52
+ | sv_dh_who | 1811.2 | -58.9 | 67.8 | 8/9 | 8.6 |
53
+ | sv_dh_pmf | 1842.3 | -27.8 | 64.6 | 7/10 | 8.7 |
54
+ | sv_dhc_who | 1866.2 | -3.9 | 61.7 | 10/7 | 7.8 |
55
+ | sv_dhc_pmf | 1875.1 | +5.0 | 59.2 | 9/8 | 8.1 |
56
+ | sv_dh_ec | 1879.2 | +9.1 | 102.2 | 8/9 | 10.4 |
57
+ | sv_lbdh_when | 1908.3 | +38.2 | 19.9 | 4/13 | 8.5 |
58
+ | sv_lb_sav | 1931.7 | +61.6 | 71.9 | 5/8 | 8.5 |
59
+ | sv_dhc_ec | 1959.3 | +89.2 | 123.5 | 7/10 | 10.2 |
60
+ | sv_dhc_sav | 2069.7 | +199.6 | 101.7 | 5/12 | 8.1 |
61
+ | sv_dhc_ec08 | 2108.7 | +238.7 | 140.1 | 6/11 | 7.7 |
62
+ | sv_aft_pmf | 2168.7 | +298.6 | 71.5 | 3/14 | 6.6 |
63
+ | sv_aft_who | 2170.5 | +300.4 | 70.5 | 3/14 | 6.6 |
64
+
65
+ ## Stage attribution
66
+
67
+ 1. WHEN (full-curve day placement): REFUTED. Pure curve-shape swap
68
+ (champion p42/count, hazard pmf shape into the same expected-cost
69
+ machinery): +38.2 +/- 19.9, 4W/13L. The champion's 4-knot GBR
70
+ DayQuantiles beat the hazard's own bucket CDF — confirms the old phase
71
+ finding on the new instrument. pmf placement also cost ~+31 inside the
72
+ hazard arms (dh_pmf vs dh_who).
73
+ 2. COUNT (expected-cost economics): REFUTED — it is an appetite dial in
74
+ disguise, and an inferior one. Calibration on this instrument: pl_a10
75
+ (plain alpha 1.0, swaps 10.4 on T17) = -117.3 and pl_pbe20 (swaps 14.8)
76
+ = -265.7; my sv_lb_ec (swaps 10.6) = -96.1 and sv_lb_ec12 (swaps 12.8)
77
+ = -158.2 — strictly worse than the alpha dial at matched appetite, and
78
+ full-48 collapses to -4.5 with nearend 0W/6L (over-swaps where false
79
+ swaps cost real mobility). The appetite axis itself is user-closed and
80
+ publicly refuted. Ranking picks by expected savings at FIXED count also
81
+ loses (sv_lb_sav +61.6, sv_dhc_sav +199.6).
82
+ 3. WHO (survival model): the only live axis. Weibull AFT: dead (+300,
83
+ undercounts). Isotonic calibration: no help (dhc_who -3.9; economics
84
+ still erratic) — logbag/hazard p42 are already usably calibrated in
85
+ sum. The discrete-time hazard matches logbag overall (flat swaps) and
86
+ BEATS it at cold start: warmup -308.6, 7W/1L.
87
+ 4. Cold-start mechanism ATTRIBUTED to the likelihood, not the data:
88
+ LogBagOpen (same censored pool, determined binary labels) at warmup =
89
+ +21.3 vs the hazard's -308.6. Person-period decomposition extracts more
90
+ from the same scarce labels (each death contributes K timing-resolved
91
+ rows instead of one binary row).
92
+
93
+ ## Top recommendation
94
+
95
+ sv_dhgate — keep the champion pipeline EXCEPT: when the fit-time pool has
96
+ fewer than 20 past-side unique training deaths (the champion's existing
97
+ floor_gate constant), fit p42 with the censored-pool discrete-time hazard
98
+ (3d buckets) instead of logbag. -51.4 +/- 22.1 on THE SCORE, swaps flat.
99
+ HONESTY FLAGS: (1) the decision to gate on the cold-start regime was made
100
+ after seeing dh_who's warmup wins (one selection look) — the gate rule and
101
+ its constant are a-priori, the look is not; (2) in deployment the static
102
+ model is fit once on all closed windows — the gated branch matters only for
103
+ fleets whose calendar-past has <20 observed deaths (true for fresh splits;
104
+ the warmup harness regime is the closest proxy the instrument has).
105
+ Runner-up (not recommended): nothing else cleared or approached the bar.
106
+
107
+ ## Artifacts
108
+ - Harness/models: /tmp/sv/sv_lib.py; runs: /tmp/sv/triage.py, wave2.py,
109
+ full48.py, gated.py (end-to-end gated), warmattr.py, smoke_*.py
110
+ - Full-48 CSVs: /tmp/cv_oofcand_sv_dhgate.csv (boundary-verified composite),
111
+ /tmp/cv_oofcand_sv_{dh_who,dhr_who,dhr_vp,dhrb_vp,lb_ec}.csv
112
+ - Triage CSVs: /tmp/sv/triage_sv_*.csv; logs: /tmp/sv/*.log
agent_reports/tj_findings.md ADDED
@@ -0,0 +1,46 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # tj — voltage-trajectory forecasting (radical pipeline agent)
2
+
3
+ STATUS: DONE. Best candidate: tj_blend25e3 (champion logbag + 25% MC-trajectory-sim rank, value-preserving) = 1885.9, delta -86.1 +/- 45.5 on full-48 — the strongest rank-blend on the board (existing: rf -52.3, fht -47.6, gbm -28.7), but formally just short of the 2*SE survivor bar (needs -91). Replicated across 3 independent MC seeds (-75.9 / -83.3 / -86.1). Standalone trajectory pipelines (radical replacement of p42) are all honest negatives.
4
+
5
+ ## Verified facts (reusable by any agent)
6
+ - Death rule (80/82 exact): EOL = day of the 3rd consecutive gated (10-30C) daily-median reading < 2.40 V, + ~1d (median lag 0-1d; 57/80 within +/-1d). "Consecutive" = consecutive gated READINGS, not calendar days. Zero ghosts at this rule on train.
7
+ - Recorded death REQUIRES readings: dark devices cannot be labeled until they resume. KM resume curve (censored): P(gap>1d)=.024, P(resume within 42d | silent 28d) ~ .5. Dark-drop is heavy-tailed: q10 = -0.10V over 30-60d silences.
8
+ - Empirical P(sustained-cross within 42d | 7-reading median level) — self-supervised calibration curve: 2.40-2.42: .80 | 2.42-2.45: .49 | 2.45-2.475: .27 | 2.475-2.50: .20 | 2.50-2.55: .07 | 2.55-2.60: .03 | 2.60-2.70: .007 | >2.70: ~0.
9
+ - Cliff/plunge regime: onset ~0.01/device-day below 2.8V (0.003 above), FINITE depth (median 0.08V, q75 0.12) — only devices within ~0.15V of threshold can plunge-die. Reading noise: 0.008 fast + slow wobble (lag-1 rho ~0.5, total 0.014).
10
+
11
+ ## Results (delta = paired vs champion baseline; triage = origins 8..40 step 2, base 1870.1; full = all 48, base 1972.0)
12
+ | label | scope | ALL | delta | SE | W/L | swaps |
13
+ |---|---|---|---|---|---|---|
14
+ | tj_blend25e3 (25% sim-rank blend, 3-seed ensemble) | FULL | 1885.9 | -86.1 | 45.5 | 31/17 | 9.2 |
15
+ | tj_blend25s1 (25% sim-rank blend, seed 1) | FULL | 1888.7 | -83.3 | 45.2 | 29/18 | 9.2 |
16
+ | tj_blend25 (25% sim-rank blend, seed 0) | FULL | 1896.1 | -75.9 | 46.2 | 29/19 | 9.2 |
17
+ | tj_blend15 (15% sim-rank blend) | FULL | 1929.2 | -42.8 | 34.0 | 29/14 | 9.2 |
18
+ | tj_blend25 | triage | 1781.1 | -89.0 | 72.2 | 9/8 | 8.6 |
19
+ | tj_blend15 | triage | 1788.6 | -81.5 | 55.2 | 12/5 | 8.5 |
20
+ | tj_blend20n12 (w=.20, 1200 sims) | triage | 1815.5 | -54.6 | 55.8 | 10/7 | 8.6 |
21
+ | tj_ablend50 (promote-only blend w=.5) | triage | 1841.0 | -29.1 | 39.7 | 9/5 | 8.6 |
22
+ | tj_blend35 | triage | 1861.0 | -9.1 | 89.1 | 7/10 | 8.5 |
23
+ | tj_blend50 | triage | 1862.0 | -8.1 | 90.5 | 7/10 | 8.5 |
24
+ | tj_daysw (champion p42 + sim day quantiles) | triage | 1868.3 | -1.8 | 25.9 | 10/7 | 8.5 |
25
+ | tj_ablend25 (promote-only w=.25) | triage | 1874.1 | +4.0 | 4.0 | 3/1 | 8.5 |
26
+ | tj_ssblend25 (blend w/ self-supervised GBM ranks) | triage | 1880.5 | +10.5 | 98.2 | 8/8 | 8.5 |
27
+ | tj_h2s60 (v2 sim standalone, p42*0.6) | triage | 2190.9 | +320.8 | 113.0 | 5/12 | 10.3 |
28
+ | tj_h2s45 (v2 standalone, p42*0.45) | triage | 2250.7 | +380.6 | 113.7 | 3/14 | 7.8 |
29
+ | tj_hybrid2 (v2 standalone, unscaled) | triage | 2261.9 | +391.9 | 193.2 | 4/13 | 17.5 |
30
+ | tj_ss1 (self-supervised crossing GBM standalone) | triage | 2294.1 | +424.1 | 156.9 | 4/13 | 7.6 |
31
+ | tj_radical2 (direct schedule at crossing-quantile) | triage | 2274.4 | +404.3 | 177.6 | 5/12 | 17.1 |
32
+ | tj_radical1 (direct schedule, wider inclusion) | triage | 2758.0 | +887.9 | 241.2 | 4/13 | 25.3 |
33
+ | tj_hybrid1 (v1 sim: naive resume) | triage | 2957.2 | +1087.1 | 178.6 | 1/16 | 23.5 |
34
+
35
+ ## Verdicts
36
+ - STANDALONE trajectory p42 (any version): REJECTED. Even the fully calibrated self-supervised crossing GBM (swaps 7.6, perfect count) ranks recorded deaths worse than the 82-label logbag at matched N (late 1779 vs 1376). The label-free crossing signal is real but coarser than the labeled classifier.
37
+ - RADICAL direct scheduling (swap at crossing-quantile minus margin): REJECTED (+404 at best). Late cost falls to 870-976 (it does catch deaths) but early-swap explodes — the expected-cost placement machinery is worth its keep.
38
+ - Timing swap (sim day quantiles into champion): exact wash (-1.8 +/- 25.9). Sim physics timing == DayQuantiles GBM in cost terms.
39
+ - RANK BLEND (the survivor candidate): champion p42 values kept (count/appetite/pricing identical, swaps pinned at 9.2), ordering = 0.75*champ_rank + 0.25*sim_rank. Full-48: -86.1 +/- 45.5 (1.89 sigma), panel block -130.7 +/- 55.8 (22W/12L), nearend -29.3 (6W/0L), warmup +60 (noise). Late 1455 -> 1376, early 296 -> 259. Mechanism: the MC sim through the exact death rule up-ranks threshold-run (r0) devices and dark near-threshold devices that logbag underranks; demotions also help (moving stale false-positives out). Beats every existing rank-blend candidate (rf -52.3, fht -47.6, gbm -28.7, tau +45.1) — the sim adds information beyond the Wiener-FHT feature blend.
40
+ - Caveat: three seeds of the same config all land 1.6-1.9 sigma; formally SHORT of the 2*SE bar. Public-refutation history of rank-boost interventions (cert-first +43 public) argues caution: the sim's biggest promotions are cert-like crossed-but-unlabeled devices, exactly the class that inverted on the public fleet (ghosts). If considered for submission, weight w=0.15 is the tamer variant (-42.8 +/- 34.0, 29W/14L).
41
+
42
+ ## Reproduce
43
+ - Sim: /tmp/tj/forecast3.py (two-timescale robust WLS on temp-corrected daily medians, EB slope shrinkage, KM resume + empirical dark-drop, level-dependent finite plunge hazard, AR slow+fast noise, exact sustain-3 rule + 1d lag; all statistics from telemetry <= T).
44
+ - Harness copy: /tmp/tj/run_eval.py (per-scenario loop identical to cv.run_all48_oof incl. purge, full-fleet plan, evaluate_plan, CSV schema). Blend mode fits purged logbag exactly as cv.py does.
45
+ - Champion-comparable CSVs: /tmp/cv_oofcand_tj_blend25e3.csv (also _tj_blend25, _tj_blend25s1, _tj_blend15). Triage CSVs in /tmp/tj/.
46
+ - Best run: PYTHONPATH=<repo> venv/bin/python /tmp/tj/run_eval.py tj_blend25e3 blend full ver=3 w2=0.25 nseeds=3
agent_reports/tr_findings.md ADDED
@@ -0,0 +1,108 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # tr findings (training-data composition)
2
+ STATUS: DONE — updated 2026-08-22 16:55
3
+
4
+ Baseline champion SCORE 1972.0, swaps 9.2. Paired full-48 temporal-purge CV. delta<0 = better.
5
+
6
+ | label | ALL48 | delta | SE | W/L | swaps |
7
+ |---|---|---|---|---|---|
8
+ | tr_rankgbm_ctrl | 1630.3 | -341.7 | 103.8 | 37W/11L | 9.2 |
9
+ | tr_rank_proxdedup | 1651.7 | -320.3 | 103.9 | 31W/17L | 10.5 |
10
+ | tr_rank_dedup | 1665.0 | -307.0 | 90.9 | 33W/15L | 11.1 |
11
+ | tr_rankgbm_prox60 | 1666.6 | -305.5 | 89.4 | 34W/14L | 8.5 |
12
+ | tr_rankgbm_hard | 1672.7 | -299.3 | 104.9 | 31W/17L | 8.6 |
13
+ | tr_rank_prox120 | 1737.6 | -234.4 | 85.4 | 31W/15L | 8.9 |
14
+ | tr_rank_hard | 1757.6 | -214.4 | 81.9 | 30W/17L | 8.6 |
15
+ | tr_rank_prox60 | 1765.2 | -206.8 | 87.2 | 30W/18L | 8.5 |
16
+ | tr_prox_dedup | 1774.3 | -197.7 | 64.6 | 24W/23L | 10.4 |
17
+ | tr_dedup | 1855.0 | -117.0 | 53.9 | 22W/25L | 10.9 |
18
+ | tr_hard_prox60 | 1864.5 | -107.5 | 41.2 | 30W/13L | 8.3 |
19
+ | tr_dedup05 | 1883.7 | -88.3 | 40.3 | 20W/25L | 10.1 |
20
+ | tr_pos3 | 1901.1 | -70.9 | 108.3 | 17W/31L | 18.0 |
21
+ | tr_hard | 1912.2 | -59.8 | 40.3 | 28W/11L | 8.8 |
22
+ | tr_prox60 | 1915.0 | -57.0 | 39.7 | 28W/17L | 8.7 |
23
+ | tr_prox30 | 1915.5 | -56.5 | 61.7 | 28W/19L | 8.5 |
24
+ | tr_d49 | 1938.1 | -33.9 | 26.5 | 15W/31L | 10.5 |
25
+ | tr_hard5 | 1941.6 | -30.4 | 45.5 | 28W/14L | 8.4 |
26
+ | tr_prox120 | 1943.0 | -29.0 | 30.3 | 23W/15L | 9.0 |
27
+ | tr_soft | 1945.8 | -26.2 | 41.8 | 16W/32L | 11.2 |
28
+ | tr_dedupvp | 1948.0 | -24.0 | 29.9 | 17W/18L | 9.5 |
29
+ | tr_prox240 | 1958.7 | -13.3 | 23.5 | 19W/12L | 9.2 |
30
+ | tr_prox480 | 1959.7 | -12.3 | 23.4 | 15W/13L | 9.2 |
31
+ | tr_fut20 | 1966.8 | -5.2 | 46.6 | 20W/26L | 9.8 |
32
+ | tr_rw240 | 1967.2 | -4.8 | 29.5 | 22W/18L | 8.9 |
33
+ | tr_fut50 | 1983.4 | +11.3 | 30.6 | 15W/21L | 9.5 |
34
+ | tr_lowstale | 1988.6 | +16.6 | 49.7 | 23W/23L | 8.2 |
35
+ | tr_rw120 | 1990.2 | +18.2 | 42.2 | 27W/19L | 8.8 |
36
+ | tr_thin3 | 1990.9 | +18.9 | 36.1 | 14W/24L | 9.4 |
37
+ | tr_pastonly | 1991.2 | +19.2 | 86.8 | 15W/31L | 11.4 |
38
+ | tr_thin2 | 2003.8 | +31.8 | 25.9 | 13W/19L | 9.4 |
39
+ | tr_bldg | 2012.2 | +40.2 | 62.2 | 16W/32L | 13.5 |
40
+ | tr_d35 | 2044.4 | +72.4 | 38.1 | 31W/16L | 8.1 |
41
+ | tr_d21e | 2077.0 | +105.0 | 59.9 | 27W/21L | 7.2 |
42
+ | tr_pos10 | 2221.1 | +249.1 | 191.1 | 15W/33L | 33.0 |
43
+
44
+ - **tr_rankgbm_ctrl** — CONTROL: frontier logbag_rank + gbm blend 0.30. delta -341.7±103.8, swaps 9.2 (base 9.2). SURVIVOR candidate.
45
+ - **tr_rank_proxdedup** — rank feats + prox120 * dedup. delta -320.3±103.9, swaps 10.5 (base 9.2). SURVIVOR candidate.
46
+ - **tr_rank_dedup** — rank feats + dedup 1/k. delta -307.0±90.9, swaps 11.1 (base 9.2). SURVIVOR candidate.
47
+ - **tr_rankgbm_prox60** — frontier + prox60. delta -305.5±89.4, swaps 8.5 (base 9.2). SURVIVOR candidate.
48
+ - **tr_rankgbm_hard** — frontier + hard-band x3. delta -299.3±104.9, swaps 8.6 (base 9.2). SURVIVOR candidate.
49
+ - **tr_rank_prox120** — rank feats + proximity hl 120d. delta -234.4±85.4, swaps 8.9 (base 9.2). SURVIVOR candidate.
50
+ - **tr_rank_hard** — rank feats + hard-band x3. delta -214.4±81.9, swaps 8.6 (base 9.2). SURVIVOR candidate.
51
+ - **tr_rank_prox60** — rank feats + prox60. delta -206.8±87.2, swaps 8.5 (base 9.2). SURVIVOR candidate.
52
+ - **tr_prox_dedup** — prox120 * dedup combo, base feats. delta -197.7±64.6, swaps 10.4 (base 9.2). SURVIVOR candidate.
53
+ - **tr_dedup** — downweight overlapping same-device windows w=1/k. delta -117.0±53.9, swaps 10.9 (base 9.2). SURVIVOR candidate.
54
+ - **tr_hard_prox60** — hard-band x3 * prox60. delta -107.5±41.2, swaps 8.3 (base 9.2). SURVIVOR candidate.
55
+ - **tr_dedup05** — softer dedup w=1/sqrt(k). delta -88.3±40.3, swaps 10.1 (base 9.2). SURVIVOR candidate.
56
+ - **tr_pos3** — positives upweighted 3x. delta -70.9±108.3, swaps 18.0 (base 9.2). weak win.
57
+ - **tr_hard** — upweight prefit decision band ranks 3-30 x3. delta -59.8±40.3, swaps 8.8 (base 9.2). weak win.
58
+ - **tr_prox60** — proximity |origin-T| half-life 60d. delta -57.0±39.7, swaps 8.7 (base 9.2). weak win.
59
+ - **tr_prox30** — proximity half-life 30d. delta -56.5±61.7, swaps 8.5 (base 9.2). weak win.
60
+ - **tr_d49** — dies49 where purge-safe (est. T). delta -33.9±26.5, swaps 10.5 (base 9.2). weak win.
61
+ - **tr_hard5** — hard-band x5. delta -30.4±45.5, swaps 8.4 (base 9.2). weak win.
62
+ - **tr_prox120** — proximity half-life 120d. delta -29.0±30.3, swaps 9.0 (base 9.2). weak win.
63
+ - **tr_soft** — soft label: 42<d<=63 graded weight, purge-safe. delta -26.2±41.8, swaps 11.2 (base 9.2). weak win.
64
+ - **tr_dedupvp** — dedup ORDER, champion p42 values (count-matched). delta -24.0±29.9, swaps 9.5 (base 9.2). weak win.
65
+ - **tr_prox240** — proximity half-life 240d. delta -13.3±23.5, swaps 9.2 (base 9.2). weak win.
66
+ - **tr_prox480** — proximity half-life 480d. delta -12.3±23.4, swaps 9.2 (base 9.2). weak win.
67
+ - **tr_fut20** — future-side pairs weighted 0.2. delta -5.2±46.6, swaps 9.8 (base 9.2). weak win.
68
+ - **tr_rw240** — recency half-life 240d (existing kind). delta -4.8±29.5, swaps 8.9 (base 9.2). weak win.
69
+ - **tr_fut50** — future-side pairs weighted 0.5. delta +11.3±30.6, swaps 9.5 (base 9.2). worse.
70
+ - **tr_lowstale** — train only rows with staleness<=30d. delta +16.6±49.7, swaps 8.2 (base 9.2). worse.
71
+ - **tr_rw120** — recency half-life 120d (existing kind). delta +18.2±42.2, swaps 8.8 (base 9.2). worse.
72
+ - **tr_thin3** — keep every 3rd pool origin. delta +18.9±36.1, swaps 9.4 (base 9.2). worse.
73
+ - **tr_pastonly** — past-side pairs only (fallback: all, warmup). delta +19.2±86.8, swaps 11.4 (base 9.2). worse.
74
+ - **tr_thin2** — keep every 2nd pool origin. delta +31.8±25.9, swaps 9.4 (base 9.2). worse.
75
+ - **tr_bldg** — building-balanced weights. delta +40.2±62.2, swaps 13.5 (base 9.2). worse.
76
+ - **tr_d35** — train label dies35. delta +72.4±38.1, swaps 8.1 (base 9.2). worse.
77
+ - **tr_d21e** — mean(dies42, dies21) two-label ensemble. delta +105.0±59.9, swaps 7.2 (base 9.2). worse.
78
+ - **tr_pos10** — positives upweighted 10x. delta +249.1±191.1, swaps 33.0 (base 9.2). worse.
79
+
80
+ ## CONCLUSION (all 35 runs complete)
81
+
82
+ 1. **The rank+gbm frontier stands; this lane adds nothing on top of it.** Control replicated exactly
83
+ (tr_rankgbm_ctrl 1630.3, -341.7±103.8, swaps flat). Layering my two best weightings ON the frontier
84
+ made it worse: hard-band 1672.7 (+42 vs ctrl), prox60 1666.6 (+36 vs ctrl). The within-origin rank
85
+ features + gbm blend subsume the ordering information my weights were adding.
86
+ 2. **Best flat-count survivor on the PLAIN champion base: tr_hard_prox60** (hard-band x3 times proximity
87
+ hl60): -107.5±41.2 (2.6 SE), swaps 8.3, 31W/13L. Components additive (hard -59.8, prox60 -57.0).
88
+ Relevant ONLY if the team ships the plain-base champion instead of the rank+gbm config.
89
+ 3. **Proximity beats recency decisively** — the new |origin - T_scenario| weighting (T estimated from the
90
+ purge hole in the origin grid, exact to 0 days on all tested scenarios) gives -57 (hl60) / -29 (hl120)
91
+ / -13 (hl240), while classic recency (rw120/rw240) is flat-to-worse (+18/-5). Monotone in half-life,
92
+ plateaus at hl 30-60.
93
+ 4. **tr_dedup's -117 does NOT survive count-matching.** Its value-preserving twin (same ORDER, champion
94
+ p42 values, swaps 9.5) reads -24.0±29.9 (n.s.). ~80% of the dedup gain is a +1.7-swap appetite shift
95
+ smuggled in through the class balance (near-death rows sit at window edges where overlap-count k is
96
+ small, so 1/k upweights positives). Appetite dose-response across my runs: swaps 9.2 base ->
97
+ 10.9 (dedup, -117) -> 18.0 (pos3, -71) -> 33.0 (pos10, +249). The purge CV's appetite optimum is a
98
+ MILD boost (~+1.5 swaps); worth a direct count-rule test in the appetite lane, not via train weights.
99
+ 5. **Dead axes** (honest negatives): building-balanced weights (+40, swaps 13.5), origin thinning
100
+ (+32/+19), staleness filter (+17), past-side-only pool (+19, SE 87 - the future-side purge pairs
101
+ stabilize fits), future downweight (flat), label-window changes d35/d21e (+72/+105 - count starvation),
102
+ d49/soft labels (small count-shift wins, subsumed by dedup), hard-band overdose x5 (-30 < x3's -60).
103
+
104
+ **Top recommendation:** adopt nothing from this lane on top of the logbag_rank+gbm frontier - it stands
105
+ as the best known config. If (and only if) the plain-base champion ships, add tr_hard_prox60. Pass the
106
+ appetite dose-response numbers (point 4) to the appetite lane.
107
+
108
+ Scripts: /tmp/tr/tr_models.py (model zoo), /tmp/tr/run_tr.py (runner). Runs: /tmp/cv_oofcand_tr_*.csv (35).
agent_reports/wave1_registry.md ADDED
@@ -0,0 +1,52 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Wave 1 — full OOF_CANDIDATES registry re-run under the temporal purge
2
+
3
+ STATUS: DONE 2026-08-22 ~16:05. 25 registry candidates + champion repeat, all full-48, zero failures.
4
+ Baseline: champion logbag/base ALL48 = 1972.0, swaps 9.21. Paired per scenario.
5
+ Harness verified DETERMINISTIC (champrep delta exactly 0.0 on all 48) — every nonzero delta is a real method effect; only scenario-sampling noise (SE) matters.
6
+
7
+ | label | ALL48 | delta | SE | W/L | swaps | verdict |
8
+ |---|---|---|---|---|---|---|
9
+ | logbag_rank | 1746.4 | -225.6 | 74.0 | 34W/11L | 9.5 | **SURVIVOR bar met** |
10
+ | vrel_only | 1854.5 | -117.5 | 49.5 | 32W/14L | 8.4 | wins, but count-shifted |
11
+ | vrel | 1855.3 | -116.7 | 50.3 | 32W/16L | 8.4 | wins, but count-shifted |
12
+ | rf | 1887.3 | -84.7 | 67.6 | 29W/19L | 9.8 | negative, inside noise |
13
+ | blind4 | 1905.9 | -66.1 | 61.8 | 28W/20L | 8.3 | negative, inside noise |
14
+ | vcorr | 1913.1 | -58.9 | 39.9 | 29W/15L | 9.1 | negative, inside noise |
15
+ | rankavg25rf | 1919.7 | -52.3 | 31.5 | 28W/11L | 9.1 | negative, inside noise |
16
+ | rankavg25fht | 1924.4 | -47.6 | 34.6 | 20W/25L | 9.5 | negative, inside noise |
17
+ | dthaz | 1933.0 | -39.0 | 34.3 | 22W/26L | 9.6 | negative, inside noise |
18
+ | ranks | 1934.6 | -37.4 | 89.5 | 27W/21L | 9.1 | rejected |
19
+ | rankavg25gbm | 1943.3 | -28.7 | 40.8 | 25W/17L | 9.1 | rejected |
20
+ | logbagC03 | 1952.7 | -19.3 | 22.1 | 15W/11L | 9.2 | rejected |
21
+ | logbagC01 | 1957.5 | -14.5 | 25.8 | 23W/12L | 9.3 | rejected |
22
+ | logistic | 1971.9 | -0.1 | 20.1 | 8W/11L | 9.2 | rejected |
23
+ | champrep | 1972.0 | +0.0 | 0.0 | 0W/0L | 9.2 | noise floor: exactly 0 |
24
+ | zone | 1975.7 | +3.7 | 41.3 | 18W/28L | 10.1 | rejected |
25
+ | vrel_bldg | 1986.0 | +14.0 | 8.8 | 14W/24L | 9.2 | rejected |
26
+ | blind3 | 1997.4 | +25.4 | 64.3 | 21W/27L | 10.5 | rejected |
27
+ | gbm | 2000.5 | +28.5 | 84.5 | 24W/24L | 8.5 | rejected |
28
+ | vmin7_only | 2013.0 | +41.0 | 25.1 | 15W/23L | 9.1 | rejected |
29
+ | rankavg25tau | 2017.1 | +45.1 | 38.6 | 15W/24L | 9.6 | rejected |
30
+ | aux_ucb05 | 2066.8 | +94.8 | 50.4 | 11W/36L | 9.4 | rejected |
31
+ | aux_ucb10 | 2079.1 | +107.1 | 49.2 | 11W/35L | 9.6 | rejected |
32
+ | logbag_aux | 2095.8 | +123.8 | 47.2 | 12W/34L | 9.2 | rejected |
33
+ | v_last_only | 2425.2 | +453.2 | 77.1 | 6W/42L | 11.0 | rejected |
34
+
35
+ ## Reading
36
+
37
+ - **logbag_rank is the wave-1 headline: -225.6 +/- 74.0 (t=-3.05), 34W/11L, swaps 9.5 (~flat).**
38
+ Champion + within-origin fleet-rank features (r_vlast, r_tau). Linear, rank-based - no
39
+ same-device memorization channel. This kind was REJECTED on the old self-fit instrument
40
+ (phase 8 lineage); the purge reverses it. Combination runs (x vrel, x rf-blend) queued.
41
+ - vrel / vrel_only (-117, t=-2.3, swaps 8.4): fleet-relative voltage transfers; second real signal.
42
+ - bl_rf35 (-81, t=-2.06, swaps flat 9.2): rf rank-blend at 35% - flexible-family purge flattery
43
+ caveat applies (accepted by user directive; flagged, not vetoed).
44
+ - gbm alone (+28.5) and aux features (logbag_aux +123.8) are clearly rejected under purge.
45
+ - v_last_only (+453) demolishes the blind-repo phase-39 claim on this instrument.
46
+ - Multiplicity note: ~60 candidates adjudicated so far; expected max |t| under the global null
47
+ is ~2.6-2.9, so a lone t=-3.05 is suggestive-strong, not conclusive. The W/L record (34/11)
48
+ and combination behavior are the confirmation instruments (harness is deterministic;
49
+ re-running the same config adds no information).
50
+
51
+ Agent-prefixed rows (pl_/bl_/tr_/rk_...) live in the agents' own files; the aggregate is
52
+ `venv/bin/python -m batteryswap_example.cv oofreport`.
agent_reports/wd_findings.md ADDED
@@ -0,0 +1,154 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # wd (wild card) — untested registry kinds + literature methods
2
+
3
+ STATUS: DONE (last updated 2026-08-22 16:19)
4
+
5
+ ## TOP RECOMMENDATION
6
+ **wd_frcert — cert-first confirmation guard composed onto the bl frontier: ALL48 = 1604.0**
7
+ (frontier logbag_rank + value-preserving gbm 0.30 rank-avg = 1630.3; champion logbag = 1972.0)
8
+
9
+ - Marginal of cert on the frontier, paired per-origin: **-26.2 +- 14.8, W/L 3/0, 45 exact ties,
10
+ swaps 9.23 vs 9.23 (byte-identical count)**. It moves ONLY origins 25/26/27
11
+ (-401.5 / -419.0 / -438.2) and is a no-op everywhere else.
12
+ - Mechanism (label-process grounded, phase-46 reverse engineering, 81/82 exact): EOL is stamped
13
+ ~3d after the gated 10-30C daily-median voltage sustains < 2.40 V for 3 consecutive gated
14
+ readings. A device confirmed at plan time is a certain death; the guard adds +2.0 to its
15
+ rank_score (rank-only: p42, count, and timing curves untouched). Worst case = swapping a
16
+ device days before its already-in-flight EOL stamp - one-sided risk.
17
+ - Historical public read: +43 - but that adjudication ran on top of ALPHA_STATIC=1.5 + cliff
18
+ (contaminated baseline per submit.py phase notes). Purge says pure win. Implementation:
19
+ cert_confirm_days() already exists in submit.py behind BATTERYSWAP_CERT_FIRST.
20
+ - wd_frcertday (also force day_q=1 for confirmed devices) = 1605.5: the 3 wins persist but day
21
+ jiggle adds 10 noisy origins (+216 loss at s35). NOT recommended - rank boost only.
22
+ - Model code: /tmp/wd/wd_models.py (FrontierCert); runs: /tmp/cv_oofcand_wd_frcert.csv.
23
+
24
+ ## Full-48 results (paired vs champion 1972.0 baseline; swaps baseline 9.2)
25
+ | label | ALL48 | delta | SE | W/L | swaps | verdict |
26
+ |---|---|---|---|---|---|---|
27
+ | wd_frcert | 1604.0 | -368.0 | 104.4 | 37/11 | 9.2 | NEW FRONTIER: cert on (logbag_rank + gbm30 rank-avg) |
28
+ | wd_frcertday | 1605.5 | -366.5 | 104.7 | 37/11 | 9.2 | + immediate day placement: inert-to-harmful, drop |
29
+ | wd_certrank | 1708.5 | -263.5 | 75.7 | 35/11 | 9.5 | cert on logbag_rank (no gbm blend): survivor, dominated by wd_frcert |
30
+ | wd_rkblend | 1769.0 | -203.0 | 80.0 | 32/16 | 9.0 | prob-mean blend form: dominated by value-preserving rank-avg (bl 1630.3) |
31
+ | wd_xtrank | 1816.4 | -155.6 | 80.0 | 32/16 | 8.3 | xtrees + rank feats: real but weaker |
32
+ | wd_blend | 1900.5 | -71.5 | 66.0 | 29/19 | 8.8 | logbag(+)gbm prob mean: 1.1 SE only |
33
+ | wd_logcal | 1901.8 | -70.2 | 46.9 | 18/30 | 11.3 | swaps +2.1, L>W: appetite in disguise. REJECTED |
34
+ | wd_rank_rf | 1932.1 | -39.9 | 44.5 | 28/19 | 9.2 | noise |
35
+ | wd_cert20 | 1933.6 | -38.4 | 23.5 | 7/2 | 9.2 | cert on champion logbag: only s25/26/27 move, all wins (-1845 tot) |
36
+ | wd_xtrees | 1935.4 | -36.6 | 62.1 | 26/22 | 9.2 | subset -160 was luck |
37
+ | wd_aux_all | 1949.4 | -22.6 | 43.5 | 22/24 | 9.1 | null |
38
+
39
+ ## Re-opened axes - purge vs public calibration (subset reads)
40
+ | axis | subset delta | swaps | read |
41
+ |---|---|---|---|
42
+ | wd_alpha15 (appetite 1.5) | -202.3 +- 159 | 14.9 (+5.7) | purge REWARDS appetite; public said +527. The purge CANNOT adjudicate appetite - its optimism channels pay for extra swaps. Do not adopt appetite on purge evidence. |
43
+ | wd_cliffct (cliff, count-coupled) | -113.8 +- 101 | 11.1 (+2.5) | appetite-flavored, same caveat |
44
+ | wd_cliff (cliff, rank-only) | -80.9 +- 92 | 8.5 flat | clean but noisy; cert-first captures the same devices with a sharper rule |
45
+ | wd_cert (cert-first, rank-only) | -56.6 | 8.5 flat | pure win, see top recommendation |
46
+
47
+ ## Triage table - ALL untested registry kinds + innovations (subset origins 8..40/2, champion subset mean 1870.1)
48
+ | kind | mean | delta | SE | W/L/T | swaps |
49
+ |---|---|---|---|---|---|
50
+ | blend | 1708.6 | -161.5 | 102.6 | 12/5/0 | 8.2 |
51
+ | xtrees | 1710.5 | -159.6 | 103.9 | 9/8/0 | 8.9 |
52
+ | cg_all | 1741.6 | -128.5 | 129.9 | 8/8/1 | 12.9 |
53
+ | cg_silent | 1741.6 | -128.5 | 129.9 | 8/8/1 | 12.9 |
54
+ | aux_all | 1760.6 | -109.5 | 76.3 | 10/7/0 | 8.1 |
55
+ | logcal | 1763.5 | -106.6 | 79.1 | 7/10/0 | 10.5 |
56
+ | rank_rf | 1778.2 | -91.9 | 103.7 | 10/7/0 | 8.5 |
57
+ | logbag_cw | 1793.3 | -76.8 | 182.8 | 7/10/0 | 18.7 |
58
+ | logbag_rankproj | 1804.2 | -65.9 | 132.7 | 8/8/1 | 8.5 |
59
+ | wd_cert20 | 1813.5 | -56.6 | 56.6 | 1/0/16 | 8.5 |
60
+ | wd_cert05 | 1813.5 | -56.6 | 56.6 | 1/0/16 | 8.5 |
61
+ | mlp | 1815.4 | -54.6 | 142.9 | 10/7/0 | 9.5 |
62
+ | aux_rank | 1817.9 | -52.2 | 108.1 | 9/7/1 | 8.6 |
63
+ | wd_moe10 | 1846.0 | -24.1 | 85.6 | 8/8/1 | 8.6 |
64
+ | aux_log | 1848.2 | -21.9 | 55.0 | 8/9/0 | 8.5 |
65
+ | blend_dh | 1850.8 | -19.3 | 44.4 | 8/8/1 | 8.7 |
66
+ | aux_rvr | 1853.0 | -17.1 | 56.8 | 6/9/2 | 8.5 |
67
+ | logbag_c3 | 1854.1 | -16.0 | 13.3 | 3/1/13 | 8.5 |
68
+ | silentfix06 | 1869.5 | -0.6 | 0.6 | 1/0/16 | 8.5 |
69
+ | silentfix015 | 1870.1 | +0.0 | 0.0 | 0/0/17 | 8.5 |
70
+ | silentfix03 | 1870.1 | +0.0 | 0.0 | 0/0/17 | 8.5 |
71
+ | crt_in25 | 1870.1 | +0.0 | 0.0 | 0/0/17 | 8.5 |
72
+ | logbag_proj | 1873.5 | +3.4 | 65.5 | 5/4/8 | 8.8 |
73
+ | logbag_open | 1887.3 | +17.2 | 31.0 | 5/9/3 | 8.8 |
74
+ | wd_moe21 | 1893.8 | +23.7 | 106.5 | 9/8/0 | 8.4 |
75
+ | crt_sp15 | 1900.2 | +30.1 | 150.1 | 8/9/0 | 10.4 |
76
+ | dthaz_aux | 1904.2 | +34.1 | 94.2 | 9/8/0 | 8.9 |
77
+ | aux_bag50 | 1905.0 | +34.9 | 72.0 | 4/10/3 | 8.6 |
78
+ | logbag_dh | 1905.6 | +35.5 | 18.9 | 4/13/0 | 8.5 |
79
+ | aux_bag30 | 1905.8 | +35.7 | 72.1 | 4/10/3 | 8.6 |
80
+ | lw_mean | 1908.0 | +37.9 | 197.8 | 7/10/0 | 23.0 |
81
+ | blend_dhaux | 1909.9 | +39.8 | 92.4 | 5/9/3 | 8.8 |
82
+ | logbag_rw240 | 1911.0 | +40.9 | 64.3 | 5/9/3 | 8.2 |
83
+ | wd_brate | 1918.4 | +48.3 | 66.2 | 6/10/1 | 8.2 |
84
+ | wd_brate_m50 | 1924.2 | +54.2 | 75.9 | 8/8/1 | 8.1 |
85
+ | logbag_rw120 | 1935.4 | +65.3 | 50.8 | 7/10/0 | 7.9 |
86
+ | aux_rv | 1936.1 | +66.0 | 67.1 | 6/9/2 | 8.5 |
87
+ | logbag_aux2 | 1961.7 | +91.6 | 64.7 | 5/11/1 | 8.5 |
88
+ | aux_rvg | 1963.7 | +93.6 | 79.4 | 4/12/1 | 8.5 |
89
+ | aux_proj | 2021.1 | +151.0 | 84.2 | 3/12/2 | 8.8 |
90
+ | wd_cox_p001 | 2109.1 | +239.0 | 131.7 | 5/12/0 | 9.5 |
91
+ | aft | 2207.1 | +337.0 | 108.8 | 5/12/0 | 6.3 |
92
+ | wd_bfe | 2292.9 | +422.8 | 126.6 | 3/14/0 | 8.4 |
93
+ | wd_bfe_c03 | 2318.2 | +448.1 | 128.5 | 4/13/0 | 8.2 |
94
+ | wd_cox | 2416.6 | +546.5 | 111.9 | 2/14/1 | 7.7 |
95
+ | logbag_lah | 2870.1 | +1000.0 | 171.1 | 0/17/0 | 9.9 |
96
+ | logbag_lah_ds | 2921.3 | +1051.2 | 157.5 | 0/17/0 | 8.7 |
97
+ | lw_stale | 2950.0 | +1079.9 | 223.8 | 1/16/0 | 21.2 |
98
+ | wiener | 2969.9 | +1099.9 | 330.3 | 4/13/0 | 37.2 |
99
+ | rank_v | 14493.1 | +12623.0 | 828.1 | 0/17/0 | 172.1 |
100
+
101
+ Not run, proven inert by inspection + one representative: crt_in15/40/50 (identical to crt_in25
102
+ = logbag: p_cut only read by plan_tscut, mode 'in' trains on everything; measured delta exactly 0.0).
103
+ CRASH (stale feature dep, cached fht parquet lacks fht_days): logbag_fht, logbag_fht2.
104
+
105
+ ## One-line verdicts (registry kinds I owned)
106
+ - blend/xtrees/aux_all/logcal/rank_rf: see full-48 table - none survives alone.
107
+ - cg_all, cg_silent (-128.5 identical, swaps +4.4): cohort lift inflates count = appetite. Rejected.
108
+ - logbag_cw (-77, swaps 18.7): stake-weighting doubles inclusion = pure appetite. Rejected.
109
+ - logbag_rankproj (-66+-133), aux_rank (-52+-108), mlp (-55+-143), aux_log, aux_rvr, blend_dh,
110
+ logbag_c3 (-16+-13): noise-level; c3 is a mild real but tiny regularization effect.
111
+ - silentfix015/03/06: EXACTLY inert (silent-cohort model needs >=20 silent-zone train deaths; purge pools rarely have them).
112
+ - logbag_proj, logbag_open, dthaz_aux, blend_dhaux, aux_bag30/50, lw_mean, logbag_rw120/240,
113
+ aux_rv/rvg/proj, logbag_aux2, logbag_dh, crt_sp15: null to mildly negative (+3 to +92).
114
+ - Survival family is DEAD under the purge: aft +337 (count collapses, swaps 6.3), wd_cox +546,
115
+ wd_cox_p001 +239, logbag_lah +1000, logbag_lah_ds +1051, lw_stale +1080, wiener +1100.
116
+ - Building identity is DEAD: wd_bfe +423, wd_bfe_c03 +448 (24 one-hot intercepts), wd_brate +48,
117
+ wd_brate_m50 +54 (even a single shrunk building-rate column hurts).
118
+ - Staleness MoE: wd_moe10 -24+-86, wd_moe21 +24+-107 - inert.
119
+ - rank-v +12623: emits ranks as p42, count rule explodes (contract violation, not a model flaw).
120
+
121
+ ## Artifacts
122
+ - Scripts: /tmp/wd/triage.py, /tmp/wd/wd_run.py, /tmp/wd/wd_models.py, /tmp/wd/wd_alpha.py, /tmp/wd/summarize.py
123
+ - Subset CSVs: /tmp/wd/sub_*.csv; full-48 CSVs: /tmp/cv_oofcand_wd_*.csv; log: /tmp/wd/triage.log
124
+
125
+ ---
126
+
127
+ ## ORCHESTRATOR CORRECTION (appended after agent completion — main session)
128
+
129
+ The top recommendation above (`wd_frcert`) must NOT be adopted on this
130
+ evidence, and its historical-context claim is factually wrong:
131
+
132
+ 1. **Cert-first was publicly adjudicated ISOLATED on the clean stack**, not
133
+ on the contaminated alpha-1.5+cliff stack: submission `9438aac`
134
+ ("cert-first isolated, pooling default off") scored 1704.64 vs 1661.45
135
+ (EXPERIMENTS.md Phase 48). The exculpation does not hold.
136
+ 2. **The local signature is a re-measurement of the same trap**: the original
137
+ cert-first read -37.9 at 3W/0L with 45 ties locally, then +43.2 publicly.
138
+ `wd_frcert` reads -26.2 at 3W/0L with 45 ties on the purge. Same mechanism,
139
+ same shape, new instrument. The failure mode (crossed-but-never-labeled
140
+ "ghost" devices, which exist in public data and are ZERO in train) is
141
+ structurally invisible to ANY local CV, including the purge. A rank-only
142
+ boost is if anything MORE ghost-exposed than the original force-swap form:
143
+ boosted ghosts DISPLACE real picks from the fixed swap budget.
144
+ 3. **The agent's own alpha calibration finding proves the instrument limit**:
145
+ purge rewards alpha 1.5 by -202 while the public punished it +527. Together
146
+ with cert-first, that's two independent demonstrations that the purge
147
+ cannot adjudicate (a) count-coupled changes or (b) label-process exploits.
148
+
149
+ **Standing conclusions from this lane** (valid and valuable): the registry
150
+ triage (conformal = byte-identical to logbag; survival kinds dead; building
151
+ fixed effects dead; cg_*/logbag_cw = appetite), and the calibration finding
152
+ itself, which sets the shipping bar for the whole campaign: only
153
+ ordering-only, label-process-free purge wins are trustworthy for deployment.
154
+ Current shippable frontier remains `logbag_rank` + gbm30 rank-blend (1630.3).
batteryswap_example/cv.py CHANGED
@@ -68,7 +68,11 @@ BASE_FEATURES = list(mc.FEATURES)
68
  # Mirrors submit.py's rolling branch: logbag / tsroute alpha 0.8 + break-even
69
  # top-up (ec_margin 0.8, ec_pmax 25) + 7d building split + censor-aware
70
  # pricing + the gated cold-start floor (k=2.5, gate 20).
71
- CHAMPION = dict(model='logbag', planner='tsroute', p_star=0.8, day_q=0.05,
 
 
 
 
72
  ec_margin=0.8, ec_pmax=25.0, split_days=7,
73
  floor=2.5, floor_gate=20, floor_zone=1)
74
 
@@ -236,6 +240,10 @@ def run_all48_oof(origins=range(48), dataset_path=Path('dataset'), kind=None,
236
  a post-hoc blend whose beliefs disagree with the count machinery fails
237
  for that reason alone).
238
  """
 
 
 
 
239
  kind = kind or CHAMPION['model']
240
  t = load_table(dataset_path)
241
  mc.FEATURES = list(VARIANTS[variant](t))
 
68
  # Mirrors submit.py's rolling branch: logbag / tsroute alpha 0.8 + break-even
69
  # top-up (ec_margin 0.8, ec_pmax 25) + 7d building split + censor-aware
70
  # pricing + the gated cold-start floor (k=2.5, gate 20).
71
+ # Phase 56 (2026-08-22): champion = logbag_rank + gbm value-preserving rank
72
+ # blend at w=0.30 (THE SCORE 1630.3, was 1972.0 for plain logbag). Deployed
73
+ # as FrontierRUL in submit.py (bit-exact fidelity test in Phase 56).
74
+ CHAMPION = dict(model='logbag_rank', blend=('gbm', 0.30),
75
+ planner='tsroute', p_star=0.8, day_q=0.05,
76
  ec_margin=0.8, ec_pmax=25.0, split_days=7,
77
  floor=2.5, floor_gate=20, floor_zone=1)
78
 
 
240
  a post-hoc blend whose beliefs disagree with the count machinery fails
241
  for that reason alone).
242
  """
243
+ if kind is None and blend is None:
244
+ # the champion arm carries its own blend; an explicit candidate kind
245
+ # replaces the model config outright (no implicit blend inheritance)
246
+ blend = CHAMPION.get('blend')
247
  kind = kind or CHAMPION['model']
248
  t = load_table(dataset_path)
249
  mc.FEATURES = list(VARIANTS[variant](t))
batteryswap_example/submit.py CHANGED
@@ -42,7 +42,7 @@ from batteryswap_public.utils import load_dataset, iterate_scenarios
42
  from batteryswap_example.features import (
43
  daily_voltage, daily_all, weekly_betas, master_curve, physics_features,
44
  features_at_origin, WINDOW_DAYS, BETA_DEFAULT)
45
- from batteryswap_example.models_cv import SklearnRUL, plan_tsroute
46
  from batteryswap_example import models_cv
47
 
48
  TRAIN_TABLE = Path(__file__).parent / 'data' / 'train_features.parquet'
@@ -94,6 +94,68 @@ HELDOUT_BUILD_BUDGET_S = float(os.environ.get('BATTERYSWAP_HELDOUT_BUDGET_S', '3
94
  # them again: ~5.5 min/split, ~11 min for the pair, comfortably inside 20.
95
  HELDOUT_REFIT_EVERY = int(os.environ.get('BATTERYSWAP_HELDOUT_REFIT_EVERY', '4'))
96
  MODEL_KIND = 'logbag'
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
97
  # Inclusion appetite, tuned by local CV: alpha sweep 0.7-1.3 on dev has a clear
98
  # minimum at 0.8 (beats every alternative on 11-12 of 16 origins), confirmed on
99
  # the test block (0.8: 1398 vs 1.15: 1516). Component curves show why: past 0.8
@@ -311,7 +373,7 @@ def adaptive_split_plans(split, split_path, log=print, deadline=None):
311
  # eliminates the time-budget fallback risk. Own-fleet rows are
312
  # excluded: same fleet means same answer key.
313
  foreign = base[~base['device_id'].isin(fleet)]
314
- static_model = SklearnRUL(MODEL_KIND).fit(foreign)
315
  static_uniq = int(foreign.loc[foreign['dies42'] == 1, 'device_id'].nunique())
316
  log(f' static foreign fit: {len(foreign)} pairs, {static_uniq} unique '
317
  f'deaths (own-fleet frac {own_fleet:.2f})')
@@ -418,7 +480,7 @@ def adaptive_split_plans(split, split_path, log=print, deadline=None):
418
  own_pairs = train[~train['foreign']]
419
  assert (own_pairs['origin'] + pd.Timedelta(days=WINDOW_DAYS) <= T).all()
420
  uniq = int(train.loc[train['dies42'] == 1, 'device_id'].nunique())
421
- fitted[fkey] = (SklearnRUL(MODEL_KIND).fit(train), uniq)
422
  model, train_uniq = fitted[fkey]
423
 
424
  feats = features_at_origin(daily, locs, T)
 
42
  from batteryswap_example.features import (
43
  daily_voltage, daily_all, weekly_betas, master_curve, physics_features,
44
  features_at_origin, WINDOW_DAYS, BETA_DEFAULT)
45
+ from batteryswap_example.models_cv import SklearnRUL, LogBagFeats, plan_tsroute
46
  from batteryswap_example import models_cv
47
 
48
  TRAIN_TABLE = Path(__file__).parent / 'data' / 'train_features.parquet'
 
94
  # them again: ~5.5 min/split, ~11 min for the pair, comfortably inside 20.
95
  HELDOUT_REFIT_EVERY = int(os.environ.get('BATTERYSWAP_HELDOUT_REFIT_EVERY', '4'))
96
  MODEL_KIND = 'logbag'
97
+ # Phase 56 frontier (2026-08-22 purge-CV campaign, ~250 candidates across 11
98
+ # lanes): logbag + within-origin fleet-rank features (r_vlast, r_tau) with a
99
+ # gbm rank-blend at w=0.30, value-preserving (blended ORDER mapped back onto
100
+ # the primary's own p42 values, so count/pricing/timing machinery see the
101
+ # identical p42 distribution - ordering-only, swaps flat 9.23 vs 9.21).
102
+ # THE SCORE: 1630.3 vs champion 1972.0 (-341.7 +/- 103.8, 37W/11L, wins all
103
+ # three blocks). Components independently significant: rank features -225.6
104
+ # (linear, clean), gbm order increment -116.1 (non-monotone response; carries
105
+ # the accepted flexible-model purge-flattery risk - monotonic-constrained
106
+ # partner destroys the increment, so the public score is the arbiter).
107
+ # Confirmed local optimum by 5 lanes (hyperparams, features, weights, neural
108
+ # rankers, physics blends all subsumed or worse head-to-head).
109
+ FRONTIER = os.environ.get('BATTERYSWAP_FRONTIER', '1') != '0'
110
+ # Blend weight dial for public A/B: 0.30 = full frontier (purge 1630.3);
111
+ # 0 = plain logbag_rank, no gbm (purge 1746.4 - the clean linear component,
112
+ # fallback if the gbm increment turns out to be purge flattery on public);
113
+ # BATTERYSWAP_FRONTIER=0 = legacy plain logbag (purge 1972.0, the 1661.45
114
+ # public config).
115
+ FRONTIER_W2 = float(os.environ.get('BATTERYSWAP_FRONTIER_W2', '0.30'))
116
+
117
+
118
+ class FrontierRUL:
119
+ """logbag_rank + gbm value-preserving rank blend (the phase-56 frontier).
120
+
121
+ Faithful deployment of cv.run_all48_oof(kind='logbag_rank',
122
+ blend=('gbm', 0.30)): primary = LogBagFeats(['r_vlast', 'r_tau']) (bagged
123
+ logistic on FEATURES + within-origin fleet-rank transforms), partner =
124
+ SklearnRUL('gbm') on FEATURES; the blended rank ORDER is mapped back onto
125
+ the primary's own sorted p42 values, and the DayQuantiles timing columns
126
+ stay with their device (exactly what the CV blend branch does).
127
+ """
128
+
129
+ def fit(self, train):
130
+ t = train.copy()
131
+ t['r_vlast'] = t.groupby('origin')['v_last'].rank(pct=True)
132
+ t['r_tau'] = t.groupby('origin')['tau_projected'].rank(pct=True)
133
+ self.primary = LogBagFeats(['r_vlast', 'r_tau']).fit(t)
134
+ self.partner = SklearnRUL('gbm').fit(t)
135
+ return self
136
+
137
+ def predict(self, rows):
138
+ r = rows.copy()
139
+ # prediction rows are one fleet snapshot at one origin: the
140
+ # within-origin rank is a rank over the fleet
141
+ r['r_vlast'] = r['v_last'].rank(pct=True)
142
+ r['r_tau'] = r['tau_projected'].rank(pct=True)
143
+ pred = self.primary.predict(r)
144
+ if FRONTIER_W2 <= 0:
145
+ return pred
146
+ p2 = self.partner.predict(r)
147
+ rk = ((1 - FRONTIER_W2) * pred['p42'].rank(pct=True)
148
+ + FRONTIER_W2 * p2['p42'].rank(pct=True))
149
+ vals = np.sort(pred['p42'].values)[::-1]
150
+ pred = pred.copy()
151
+ pred['p42'] = pd.Series(
152
+ vals, index=rk.sort_values(ascending=False).index
153
+ ).reindex(pred.index)
154
+ return pred
155
+
156
+
157
+ def _fit_model(train):
158
+ return (FrontierRUL() if FRONTIER else SklearnRUL(MODEL_KIND)).fit(train)
159
  # Inclusion appetite, tuned by local CV: alpha sweep 0.7-1.3 on dev has a clear
160
  # minimum at 0.8 (beats every alternative on 11-12 of 16 origins), confirmed on
161
  # the test block (0.8: 1398 vs 1.15: 1516). Component curves show why: past 0.8
 
373
  # eliminates the time-budget fallback risk. Own-fleet rows are
374
  # excluded: same fleet means same answer key.
375
  foreign = base[~base['device_id'].isin(fleet)]
376
+ static_model = _fit_model(foreign)
377
  static_uniq = int(foreign.loc[foreign['dies42'] == 1, 'device_id'].nunique())
378
  log(f' static foreign fit: {len(foreign)} pairs, {static_uniq} unique '
379
  f'deaths (own-fleet frac {own_fleet:.2f})')
 
480
  own_pairs = train[~train['foreign']]
481
  assert (own_pairs['origin'] + pd.Timedelta(days=WINDOW_DAYS) <= T).all()
482
  uniq = int(train.loc[train['dies42'] == 1, 'device_id'].nunique())
483
+ fitted[fkey] = (_fit_model(train), uniq)
484
  model, train_uniq = fitted[fkey]
485
 
486
  feats = features_at_origin(daily, locs, T)