Commit History
-
Revert "HEAD: order re-weight .50/.20/.30 for the alpha-1.4 band (user call, public A/B) - bgkf 1476.0; revert FT2_W .30 / FT2_GAPW .20"
Thibaut ForestThis reverts commit 354fd2d5fac60035f4e12b0656b1d9365b58ca96.435304e -
HEAD: order re-weight .50/.20/.30 for the alpha-1.4 band (user call, public A/B) - bgkf 1476.0; revert FT2_W .30 / FT2_GAPW .20
Thibaut Forest +1: Claude Fable 5Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>354fd2d -
HEAD: flat alpha 1.4 for public A/B (user call) - bgkf 1498.3, podium operating point; revert = both alpha defaults 1.0
Thibaut Forest +1: Claude Fable 5Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>62e9d91 -
HEAD: warmup gate OFF by default (publicly refuted 1594.89) - head restored to 60d65da config, bgkf cell-exact 1541.3
Thibaut Forest +1: Claude Fable 5Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>71bfff2 -
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 -
HEAD: wiener weight .30 in the 3-way order (.50/.30/.20) - CV 1545.4
Thibaut Forest +1: Claude Fable 5s_503020 from the simplex sweep: -23.2 +/- 12.3 (1.9sigma, count-flat, bowl mapped on all sides) - qualifies under the 1.5-sigma tier for weight tweaks in validated mechanisms. Deployment parity bit-exact after fixing a float knife-edge (1-.30-.20 = 0.4999...94 flipped one exact rank tie and moved a cell by 539; primary weight now rounded - and noted: single-config SCOREs carry ~+/-11 tie sensitivity on this instrument). Rehearsal clean (47s, recall .538, swaps 9.6/scen). Wave-S remainder all dead: HGB evolutions worse (monotone constraints break the gap features), plateau wiener inert, alpha bowl still at 1.0. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>4c93883 -
HEAD: gap-approach HGB third order source at w .20 (user call) - CV 1568.6
Thibaut Forest +1: Claude Fable 5Order = .55*logbag(vm7) + .25*wiener + .20*HGB(d2, gap-approach features: gap_ratio/rel_close/dwell_flat/gap_log - the plateau-vs-fast-crosser shape from the autopsy). Value-preserving; counts untouched. Evidence: -32.5 +/- 25.2 vs 1601.2, six-of-six sign consistency across weights/bases, below the formal 2-sigma bar for new mechanisms - shipped on the count-flat order-blend risk class (never publicly refuted). Deployment parity bit-exact (1568.6, cell diff 0); end-to-end pseudo-split rehearsal clean (48s, recall .535 vs .514 prior head at equal swaps). days_below_245 merged into the shipped train table; BATTERYSWAP_FT2_GAPW=0 reverts. cv cand ft2a10 / head now run the literal deployed class. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>274f134 -
HEAD: wiener weight .25 (1601.2 on bgkf, deployment parity exact; count-flat weight tweak inside the validated blend; sub-bar 1.6sigma, shipped per user)
Thibaut Forest +1: Claude Fable 5cv cand head = the shipped model. FT2_W env reverts. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>f8a734c -
HEAD = the alpha-1.0 A/B (same model as 296f8f2, now on current version for public scoring): ft2 frontier + alpha 1.0
Thibaut Forest +1: Claude Fable 5The user triggers public scoring on the current git version, so the A/B candidate moves to head. Behavior identical to 296f8f2 (which lacked the later FT2_FIXEDREF dial - default off, inert). Safe 0.8 config remains one commit away (97af9ac) and via BATTERYSWAP_ALPHA(_STATIC)=0.8. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>401f171 -
Phase 62: synthetic scaling study (1x/2x/4x, official-mechanism EOLs); count rule scales cleanly; fixed-ref vmin7 dial (default off); alpha-1.0 edge holds at every scale
Thibaut Forest +1: Claude Fable 5Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>34c30a6 -
Restore safe alpha 0.8 default at head (A/B candidate remains selectable at 296f8f2)
Thibaut Forest +1: Claude Fable 5Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>7d7632c -
PUBLIC A/B CANDIDATE (score this commit to test): alpha 1.0 on the ft2 frontier
Thibaut Forest +1: Claude Fable 5Single-variable experiment. Evidence FOR: entire public podium operates at 15-17.6 swaps/scenario vs our 12.1 with HALF our late cost; bgkf alpha 1.0 on ft2 = -64.5 mean; CP-SAT planner fed ft2 predictions lands at 16.4 swaps and -96 locally. Evidence AGAINST: mean-only support (17W/24L), and alpha 1.5 on the OLD ordering publicly caught zero extra deaths (6ea03da). This commit exists so the user can price the question with one public trigger; the next commit restores the safe 0.8 default at head. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>296f8f2 -
ADOPT campaign-2 frontier ft_vmin7r_wnr20: BATTERYSWAP_FT2 default ON
Thibaut Forest +1: Claude Fable 5Ft2RUL = logbag on FEATURES+vmin7_rank, 0.20 value-preserving WienerFHT order blend (order remapped onto primary's own sorted p42 values; count/ pricing/timing untouched). bgkf v5: 1688.4 vs 1760.2 (-71.8 +/- 23.5, 3.05 sigma, Wilcoxon .037, swaps flat, count-clean; reproduced exactly by 3 lanes). Worst-case within-test-fleet vmin7 recompute still -60.8 (2.3 sigma). Deployment parity vs the CV frontier: bit-exact (max cell diff 0). wnr_m/s2/n merged into the shipped train table; split-path wiener params computed past-only from the scored split's own telemetry (0.1s/scenario). Soft degradation: missing wnr -> pure vm7 order; fit error -> legacy champion. BATTERYSWAP_FT2=0 reverts to the measured-1661.45 config. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>3f9bf12
-
Phase 56 addendum 2: frontier purge gain = hidden per-scenario appetite (corr 0.76); head default reverted to legacy champion
Thibaut Forest +1: Claude Opus 5 (1M context)Anchor decomposition: order-only worth -37..-47 +/- 43 n.s.; the -342 was count reallocation via calibration (era hazard leaks through both-sides fits - purge limitation #3). BATTERYSWAP_FRONTIER now defaults OFF; dials kept for explicit A/B. Shipping bar tightened to count-matched evaluation. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>f5f3fda -
Phase 56 addendum: public refutes UNANCHORED frontier (1877.08, swaps 517 vs 580); fix = value-anchor to plain logbag
Thibaut Forest +1: Claude Opus 5 (1M context)Count collapse, not ordering: logbag_rank's sum(p42) is 0.78-0.80x plain logbag under deployment past-only fits at late origins (both-sides purge fits hid it - swaps read flat in CV). FrontierRUL now anchors p42 VALUES to a plain-logbag donor (count/pricing/timing = the measured 580-swap champion machinery, byte-equivalent) while rank+gbm supply ONLY the order. Verified at worst-collapse origins s_35/s_45: donor sums exact, frontier order exact, top-13/25 identical. BATTERYSWAP_FRONTIER_ANCHOR=0 restores the refuted unanchored form for forensics. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>86f3f93 -
Phase 56: NEW CHAMPION logbag_rank + gbm rank-blend w=0.30 (purge 1630.3, was 1972.0)
Thibaut Forest +1: Claude Opus 5 (1M context)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_re…698401a -
Phase 48: public refutes cert-first (+43.19, ghost force-swaps at ~111 early-days each); default off
Thibaut Forest +1: Claude Opus 5 (1M context)Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>e382bfa -
Phase 48 submission: isolate cert-first (HELDOUT_POOL default off)
Thibaut Forest +1: Claude Opus 5 (1M context)Public look spent on the phase-46 certainty-first ordering: rank_score = 2+p42 for devices whose gated daily median sustained <2.40 V for 3 consecutive gated readings, all confirmed <= origin. Local all-48 cost 1661.7 -> 1623.7, 3W/0L/45T; loss-free at every fixed N on both instruments; fires 0.46 devices/scenario (the label-lag wobble population). Pooling default flipped off per its public verdict (phase 42: 1665.89 vs 1661.45, 3x training deaths bought zero recall), so this submission is cert-first against the 1661.45 champion with no confound. Rehearsed on the 2x held-out fixture: static foreign fit both splits, cert-first fired at 32 scenario-instances, 79560 rows in 162s, no fallbacks. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>9438aac -
Phase 46: overfitting audit - luck bounds, certain pool; ADOPT cert-first (k=3) ordering, all-48 1661.7 -> 1623.7, 3W/0L/45T
Thibaut Forest +1: Claude Opus 5 (1M context)Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>4e17cd1
-
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 34-35: retire cross-fleet CV, re-screen 72 configs, champion unchanged
Thibaut Forest +1: Claude Fable 5No behaviour change to the shipped path. models_cv.py is untouched; the only code edits are docstrings and four unused imports (planner.py numpy/FEATURES, train.py Field, submit.py sys). Champion config verified in submit.py: logbag, ALPHA=ALPHA_STATIC=0.8, EC_MARGIN=0.8, EC_PMAX=25, SPLIT_DAYS=7, FLOOR=2.5/gate 20, CLIFF_SCALE=1.0 (off). all-48 = 1661.7, public 1661.45. Phase 34: cross-fleet CV retired after a second confident false positive. rankavg won it at -18.4 (27/32 folds, p=0.0002) and is +55.3 on the real full-fleet all-48 - losing on the panel alone (+23.9), so not a warm-up weighting artifact. Root cause: every fold trains on the full history, so the harness cannot reproduce cold-start scarcity. Also closed: warm-up physics prior (logbag already best at cold origins), optimizer budget (2x60 optimal), feature LOO (best removal +2/308). Phase 35: everything ever judged on a retired instrument re-run on the surviving one. 72 configs, base reproduced 1661.7 in every group, no…7d93fb8 -
Phase 28 public refutation: revert static appetite to 0.8, cliff boost off
Thibaut Forest +1: Claude Fable 5Public look 2026-08-20 (6ea03da): 2188.78 vs 1661.45 (3c7b883). First public exposure of the whole static stack at once; component signature is pure over-inclusion - battery_swap +68%, early +444, late +13 (zero recall gain). - ALPHA_STATIC default 1.5 -> 0.8: phase 26's undercount premise is refuted on the real held-out fleet; phase 20 (the probability scale transfers / overcounts) was right. The half-fleet holdout manufactures the undercount (~6 deaths/scenario makes inclusions look cheap; marginal exchange rate 0.46 late-saved per early-spent locally, ~0.03 on public, break-even 1.0) and is hereby refuted as an appetite adjudicator - count decisions are public-look-only now. It stays valid for structural questions. - CLIFF_SCALE default 2.2 -> 1.0: the boost was only ever adjudicated on top of the refuted 1.5 baseline, and the public look condemns it transitively (every cliff device was included at 1.5 + boost and late did not move). - Retained: static-fit machinery…bb5a0c1 -
Phase 28: cliff-gated static appetite (cliff_count22) for held-out splits
Thibaut Forest +1: Claude Fable 5- submit.py: on the static held-out path ONLY, rows whose raw hourly readings show a knee (>=35% of the last 7 days' readings below 2.45 V, >=20 readings, corrected voltage < 2.46) get rank_score / p42_sum = clip(2.2 * p42, 1) while raw p42 - and hence every timing curve - stays untouched. Train/rolling path byte-inert by construction. Env: BATTERYSWAP_CLIFF_SCALE (1.0 disables). - Adjudication (exp_x28.py; EXPERIMENTS.md phase 28): mined from the public Attention-Heads repo. Real-label static holdout -54.5/scenario (4/5 fleet splits, baseline at ALPHA_STATIC=1.5 so the gain is additive to phase 26, not double-counted); barrier-event resampler -66.8 with the sign held in 120/120 draws; correlated per-quarter-shock variant -66.1, also 120/120; beats plain alpha raises on mean, variance and tail (alpha=2.5 turns negative). Panel rejected it on the native path (+27): static branch only. - Verified: cliff-mask parity 1.0000 vs the adjudication harness at s_16/28/40;…6ea03da
-
Phase 27: held-out-parity audit - penalty wiring + 3-layer failure isolation
Thibaut Forest +1: Claude Opus 5 (1M context)Dress rehearsal (Docker main() over fake public+private with renamed device IDs) exposed that one bad split could destroy the whole submission: a check_dataset assertion killed the adaptive path AND the pickle fallback identically, escaped main()'s handler, and no submission.csv was written. - load_best_effort(): dataset consistency check demoted to a logged warning - fallback guarded individually; new raw-file last resort (defer-everything plans, alive-filtered) guarded again - a split can at worst lose itself - cost_curves penalty constants (EARLY/LATE) wired from each scenario's settings (evaluator charges these; constant 0.5/10.0 in train, byte-inert at defaults); planning_window_days != 42 logs loudly - audit: per-scenario settings vary only in base_location/base_room (16 bases; mobility sim already reads them live) Rehearsal after fixes: both splits static-path, complete 2-split submission.csv in 35s; all-48 checksum 1851.0186805555559 byte-exact. Co-Authored-By: Claud…fc780fa -
Phase 24b+26: static per-split fit + ALPHA_STATIC=1.5 for held-out splits
Thibaut Forest +1: Claude Opus 5 (1M context)- submit.py: held-out splits (own-fleet frac < 0.5 vs the packaged table) now fit ONE model per split on the full foreign train pool and skip the per-origin split-table build and refit loop. Holdout harness: statistical tie on score (static 1057.7 vs rolling 1087.0), minutes instead of ~17 per split, near-zero time-budget fallback risk. Train-fleet splits keep the rolling self-masked path. - ALPHA_STATIC=1.5 (env BATTERYSWAP_ALPHA_STATIC): the static foreign fit's sum(p42) undercounts on held-out fleets, so the deployment path needs a larger inclusion appetite than the panel's 0.8. Sweep won on ALL FOUR independent fleet-splits (0.8: 1156.3 -> 1.5: 916.4 mean; plateau from 1.5). Only the static branch reads it; panel champion unchanged. - EXPERIMENTS.md: phases 24b + 26 (incl. public 1717.8 -> 1661.45 from the phase-23 submission, matching the holdout prediction band). All-48 Docker checksum: 1851.0186805555559 byte-exact (train path untouched); static branch end-t…faf80ea -
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 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 -
Revert alpha to 0.8: local CV sweep rejects the leaderboard-motivated 1.15
Thibaut Forest +1: Claude Opus 5 (1M context)Dev sweep 0.7-1.3: minimum at 0.8 (2074; 1.15 scores 2219, losing on 12/16 origins). Test block confirms from the existing ledger (0.8: 1398 vs 1.15: 1516). Late_swap saturates ~1100 for alpha >= 1.15 while early keeps climbing - remaining misses are voltage-silent deaths, not an inclusion problem. Selection stays on local CV, not public feedback. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>c9e7e41 -
Raise inclusion alpha to 1.15 based on public leaderboard evidence
Thibaut Forest +1: Claude Opus 5 (1M context)Both public readings show late/early ratio ~8 for us vs ~1 for every top team: the public fleet rewards more insurance swaps than the local test block. alpha=1.15 reproduces the leader timing profile locally (late 722 / early 550 vs 851/312 at 0.8). Clean A/B vs fc9c286: adaptive pipeline identical, one constant changed. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>82d9553 -
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