Commit History
-
Phase 41-42: fixed-N ablation rejects the vrel port; public says pooling is a wash
Thibaut Forest +1: Claude Opus 5 (1M context)Phase 41 discharges phase 39's standing directive ("do not port anything from that lineage without re-running the ablation on recall at fixed N"). Adds cv.ablate: holds N fixed and varies only the score, so a feature's effect on ORDERING is separated from its effect on the topsum count. No planner and no evaluator - recall at fixed N and the rank distribution of misses are functions of the score alone. Deaths caught at fixed N, paired per origin, bootstrap 95% CI: native N=12 native N=20 static N=12 static N=20 vrel alone -6 [-12,-1] +4 [-1,+9] +6 [+0,+13] -1 [-9,+7] vmin7_rank alone -1 [ -5,+2] +4 [+0,+9] -5 [-11,+1] +0 [-4,+4] both -7 [-15,+0] +5 [-1,+11] +4 [ -2,+10] -1 [-9,+7] v_last alone -39 [-57,-22] -8 [-20,+5] +7 [-10,+25] +5 [-10,+20] REJECT the port. The sign flips with N on both instruments, every CI straddles zero, and the ordering is byte-identical at 36-41 of 48 native origins and 228-230…41a82cd -
Phase 40: port the research loop's CV discipline + ship in-fleet pooling
Thibaut Forest +1: Claude Opus 5 (1M context)CV protocols move out of /tmp into batteryswap_example/cv.py, with the champion config itself promoted from /tmp/all48.py into cv.CHAMPION: all48 full-fleet walk-forward, three-regime scorecard static the deployment gate - one foreign-fleet fit, no refits, 11s a seed, ORDERING questions only (this construction manufactures a sum(p42) undercount; phase 26 believed it and public went 1661 -> 2189) screen offline model screen grouped by BATTERY, never by scenario/row models_cv.rank_stats now runs inside walk_forward, so dev/panel/test also report rec12/rec20, operating-point recall+precision, the count actually bought, and the median rank of missed deaths beside the cost. Base reproduces 1661.7 / 2379.7 / 1679.2 / 604.8 byte-exact - the additions are diagnostic only. What the new metrics show: the panel's missed deaths sit at median rank 57, 45 ranks past the cut. That is the closed appetite axis as a measurement rather than an argument. screen s…c7d5d98
-
Phase 15: swap-truncation/ghost/quarantine all rejected by panel; label 'noise' is the label process
Thibaut Forest +1: Claude Opus 5 (1M context)Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>e3fa964
-
Silent-death campaign closed: precursor found (volatility) but unactionable
Thibaut Forest +1: Claude Opus 5 (1M context)Precursor screen on the blind zone (11,599 healthy-voltage pairs, 24 deaths): 30d voltage range/std carry AUC 0.83/0.81 before the plunge starts; diurnal drift, beta drift, reading-rate, low-side outliers ~ chance. Both deployment mechanisms fail CV: as global features (test 1438.7 vs champion 1397.5) the signal dilutes; as a scale-free blind-zone ordering override (SilentFix) it is inert at safe weights and harmful at active ones. Root cause quantified: 0.2% blind-zone prevalence makes precursor precision a few percent, so every action loses in expectation against the 0.5/10 penalty arithmetic. Champion unchanged (dev 2073.9 / test 1397.5). Features and SilentFix kept in code as documented-rejected; ceiling moves only with new information. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>cedc5cb -
Explore voltage-silent deaths: cohort clock rejected by CV, champion unchanged
Thibaut Forest +1: Claude Opus 5 (1M context)Silent deaths are fast plungers (same 2.40V crossing, ~3-week collapse), not a separate mechanism. Candidates tested on the silent subpopulation: - spatial clustering: AUC ~0.52, dead - mean temperature: AUC 0.64, too weak - install-cohort clock: AUC 0.906 in isolation (batch explains ~90% of lifetime variance) but degrades dev CV in every encoding (2074 -> 2279 raw, 2433 overdue-neutral) due to 14%/54% coverage; kept in features.py as documented-rejected, excluded from FEATURES. Champion reproduces exactly after revert: dev 2073.9 (logbag/tsroute/a0.8). Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>b636dfd -
Adaptive runtime submission: per-scenario refits, bagging, stronger routing
Thibaut Forest +1: Claude Opus 5 (1M context)Uses the 30-minute runtime budget instead of a static pickle: - submit.py: refits the model at every scenario origin on the target split's own history pooled with packaged train features, with labels self-masked to windows closed before each origin (assertion-enforced; never reads future eol_times). Time-budget + mid-split deadline guards fall back to the static pickle per split. - logbag model: 15-fold bagged logistic (dev 2126 -> 2074, test 1440 -> 1398) - stronger routing search: merge moves + restarts, and within-day visits now sorted by building/room (the evaluator pays repeated building changes for interleaved rows) - tau_projected feature: master-curve inversion minus staleness, targeting devices that go dark and keep discharging (test 1476 -> 1439) - synthetic training origins every 4 days back to Feb-2025 (2.7x positives) Walk-forward: dev 2074, test 1398, honest all-48 train metric 2202 with mobility+limits at 242 vs current leaderboard leader's 280. Runtime: 2…fc9c286
-
Logistic RUL model with adaptive top-sum planner (walk-forward CV selected)
Thibaut Forest +1: Claude Opus 5 (1M context)- features.py: cached (device, origin) feature table; leak-free per-origin slicing - models_cv.py: walk-forward CV harness; logistic/GBM/AFT/rank models, threshold/topsum/batching planners; dev s_8-s_23, test s_24-s_41 - planner.py: final TopSumPlanner (logistic p42, N = 0.8 * sum(p42), q05 day placement, building batching); refit on all closed windows - harness.py: baseline comparisons (defer-all, lowest-voltage-k, oracle) - best.pickle trained inside the competition Docker image (sklearn 1.7.2) to avoid version skew; verified via script.py + metric in the image Test-block walk-forward mean total_cost 1368 (voltage-15 2034, defer 2512, oracle 186); train split via official metric: 2150 vs 8673 for the example. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>b89e779