Commit History
-
HEAD: T3 warmup gate - gated hazard order + alpha 1.4 boost - CV 1418.3
Thibaut Forest +1: Claude Fable 5While the training fleet's death ledger at the plan origin is below WARMUP_RATE (0.0759/device = 35/461), Ft2RUL switches ORDER to a censored-pool discrete-time hazard HGB and boosts appetite x1.4 via a consume-once plan_tsroute.alpha_boost; past the gate the model is byte-identical to the previous head (WARMUP_RATE=0 disables exactly, verified 0.0 max cell diff vs 1541.3). bgkf: 1418.3, -123.0 +/- 43.1 (2.9sigma), 14W/5L, Wilcoxon .0017. COUNT-COUPLED (swaps 2.54 vs 2.27) - shipped on the user's CV-first call for a public trigger. Scale harness: gate narrows as fleets grow (8/4/0 active scenarios at 1x/2x/4x) - bounded downside. Rehearsal: gate fired on exactly s_0-14, s_15+ byte-identical, 0 warnings. Includes T3 lane reports (gm label-statistic axis closed: the exact label is a lagging smoother; cold-start gating; scale validation) and phases 65-66. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>e4745d2 -
HEAD: T2 planner objective - timing_weight 2.0 + split_days 3 - CV 1541.3
Thibaut Forest +1: Claude Fable 5lam2sp3 from the T2 planner lane: scale timing curves x2 inside optimize_days' objective (new BATTERYSWAP_TIMING_WEIGHT dial, default 2.0) and SPLIT_DAYS default 7->3. Refuses cheap trip-merges that drag swaps off timing-optimal days: late -3.5, early -1.2, mobility +0.8. bgkf paired vs 1545.4 champion: -4.11 +/- 1.41 (2.9sigma), 25W/4L, Wilcoxon 8.8e-6, count-flat (battery sets cell-identical); dose-response plateau on both dials; survives 35-arm multiplicity. New-mechanism tier (2sigma + controls) PASSED. Deployment parity: cand ft2a10 cell-exact (diff 0.0) vs the lane measurement; timing_weight=1.0 legacy path bit-exact vs pre-T2 reference (ft2a10_sp7 control). End-to-end pseudo- split rehearsal clean (static held-out branch, 0 warnings, 38s). Also: phases 63-64 records (public conversion 1575.31 at 4c93883; five-lane T2 campaign - timing/order/hazard axes closed with structure, counts lane report-only incl. warmup-gated alpha 1488.0 for a possible public trigger) + the five t2_*.…60d65da
-
Silence the benign all-NaN-imputer warning at source (tau_projected before the curve exists); message-targeted so real warnings stay visible
Thibaut Forest +1: Claude Opus 5 (1M context)Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>534abdd
-
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 21-23: unmasked foreign pooling for held-out splits + Docker PATH fix
Thibaut Forest +1: Claude Opus 5 (1M context)- submit.py: pool the packaged train table UNMASKED on held-out splits (66,890 closed-window pairs, 82 dead devices from origin 0); the target split's own fleet stays under the T-42d mask; byte-inert when the target IS train (all-48 Docker reproduces 1851.0186805555559 exactly). Holdout-validated (fleet A=packaged, B=target): warm-up 1108.6 vs floor's 1091.0 (tie) vs starved 1478.9; mid/late spots 1088.4 vs 1141.9. The cold-start floor gate now never opens on held-out splits (by design); it remains live for local warm-up regimes. - Dockerfile: pin /app/env/bin onto PATH - newer base-image entrypoints shadow the competition env with miniconda at runtime, breaking `python3 script.py` with ModuleNotFoundError. - models_cv.py: phase-21 comment (evaluator emergency queue truly opens at end-of-week, day 48; exact pricing tested and rejected) + inert nn_order visit-ordering machinery (phase 22, rejected: panel tie 1679.4 vs 1679.2). - EXPERIMENTS.md: phases 21 (emergency…3c7b883 -
Phase 19-20: cold-start count floor (all-48 2146.9->1851.0) + CV harness upgrade
Thibaut Forest +1: Claude Opus 5 (1M context)Gated floor k=2.5 wins warm-up 8/8, panel byte-identical. Ungated and foreign-fleet variants refuted (panel +21..+114; fleet-holdout harness shows the probability scale transfers across device subsets). Near-end block s_42-47 added: top-up worth -273 there, censor pricing -64. Three-regime scorecard codified; tie-aware selection stability; component decomposition by default. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>bd56acd -
Phase 18: limit-aware constructive initializer rejected; limit tail is a correct trade
Thibaut Forest +1: Claude Opus 5 (1M context)Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>3d2958f -
Phase 17: label-arrival hazard, domain-split, cost-weighting, backtest-alpha all refuted; count channel closed
Thibaut Forest +1: Claude Opus 5 (1M context)Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>a354f2b -
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 -
Phase 14: building day-splitting (sd7) + censoring-aware pricing adopted
Thibaut Forest +1: Claude Opus 5 (1M context)Panel 1679.2 vs 1702.0, sd7 selected in 100% of random and blocked splits; censoring-aware curves -32 on TRUNC=30 counterfactual, inert on covered windows. Hazard-WHEN and park_mobility rejected. All-48 Docker metric 2146.9 (was 2175.4). Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>2ba75d6
-
Phase 11: price-adaptive break-even top-up (fresh-only, m0.8/pm25) + two-sided cost-curve fix
Thibaut Forest +1: Claude Opus 5 (1M context)Panel 1702.0 vs 1715.8, 63% random-split selection, never beaten in a decided blocked split. All-48 Docker metric 2175.4 (was 2202). Includes user's phase-10 CohortGate + merged-block protocol write-up. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>4fb1dc8 -
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 -
Classifier-family sweep: RF/ExtraTrees/MLP + rank-hybrid all rejected by CV
Thibaut Forest +1: Claude Opus 5 (1M context)RandomForest (default/deep/class-balanced), ExtraTrees, and a small MLP all lose 170-820 dev points to bagged logistic. RF ranks better at some origins (AUC 0.94 vs 0.85 at s_23) but its compressed probabilities break topsum's count; a rank_rf hybrid preserving logbag's probability scale while using mean-rank ordering still loses (+92). Champion unchanged. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>fbe4c36 -
Phase 7: full coordinate sweep finds nothing - champion is a local optimum
Thibaut Forest +1: Claude Opus 5 (1M context)~25 knob values across forecast (C, bags, day-model GBR, recency weighting, training-set variants incl. discrete hazard and determined labels, blends) and optimization (emergency-day anchor, search budget, tspig/tspig2 routing-aware inclusion). Acceptance rule (>=60 dev AND >=10/16 origins) adopted nothing; best was bags=30 at -9.4. dthaz statistically tied using a different likelihood. Champion unchanged: logbag/tsroute/a0.8, dev 2073.9, test 1398, public 1767.87 (rank 2). EXPERIMENTS.md updated with phases 5-7, public LB readings, and full champion spec. Also wires SklearnRUL variant specs (bags/dtrees/ddepth/q6) and per-config search knobs into the harness. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>30e8503 -
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