Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Phase 58: definitive v5-vs-public coherence - zero false adoptions under the full protocol; faithful config reproduction matters (alpha stack reads n.s., approximations overstated misalignment)
Thibaut Forest+1: Claude Opus 5 (1M context)
b6d4319
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
CV v5 fidelity pass (user): GroupKFold with deployment-exact held-out semantics
Thibaut Forest+1: Claude Opus 5 (1M context)
2a6a86a
Fold fits on TRAIN buildings' full closed history (= the static foreign fit
deployment-legal for held-out fleets); planner state = submit.py static-path
knobs exactly, incl. the cold-start floor gate (structurally inert at fold
sizes >= 60 deaths vs gate 20); in-fold purge dropped (stricter than the
deployment it represents, bought no public coherence). Both public and
private splits are ~2x held-out fleets (Docker rehearsal) -> ONE CV for both.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
CV v4 (user directive): building-GroupKFold x temporal purge - per fold, per scenario, fit on train buildings' pairs with label windows entirely outside the scenario window; test scenario on the test buildings as a standalone fleet
Thibaut Forest+1: Claude Opus 5 (1M context)
9d114fd
Double holdout by construction (fleet axis + time axis), no tuning: the
public-calibrated pricing layer was explicitly rejected. Coherence with
recorded public deltas is checked, never fitted.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Phase 57: bgkf-vs-public alignment check (3 sign flips; better than purge; vrel the one coherent cross-fleet signal)
Thibaut Forest+1: Claude Opus 5 (1M context)
24b7f13
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Phase 57: CV replaced with building-GroupKFold (user directive) - test group planned as standalone fleet, stratified on failures + travel centrality
Thibaut Forest+1: Claude Opus 5 (1M context)
4be2283
Simulates the held-out deployment path (static foreign fit) the private
split's unseen fleets take. Purge harness retired (three deployment blind
spots, phase 56); recoverable at f5f3fda.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
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)
f5f3fda
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>
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)
86f3f93
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>
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)
698401a
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…
The purge harness now requires only that a method yield a plan: the
pred-shape ranking metrics assumed a per-device p42 ranking, which not
every method will have. models_cv.rank_stats untouched (ad-hoc use).
CSV schema change: n_swaps replaces the rank columns; stale /tmp
candidate CSVs deleted. (Attribution note for the record: the cv.py
consolidation itself is 4f5f060 by session 59; a6c0af5 was
EXPERIMENTS.md only despite its message.)
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Phase 55: temporal-purge CV is THE SCORE and sole validator (user directive); cv.py consolidated to the purge harness only
Thibaut Forest+1: Claude Opus 5 (1M context)
a6c0af5
Protocol (session 59 implementation, user-specified): per scenario, one model
on ALL buildings' pairs with label windows fully outside the scenario window,
full-fleet plan, SCORE = ALL-48 mean. Champion 1972.0 (panel 1839.6).
all48/static/screen/lobo/ablate removed from cv.py - recover at 2000281.
Purge-vs-LOBO paired diagnosis recorded: same-device-fate channel ~-18/origin
on the panel for the linear champion, warm-up harsher via calendar starvation.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
cv: temporal purge is the ONLY protocol (user spec) - all48oof fits per scenario on ALL buildings' pairs whose 42d label windows lie fully before/after the scenario window (no building holdout, full-fleet plans); all48/static/screen/lobo/ablate and the lobo/wf/self variants REMOVED (git history keeps them; exp_x29/x30 need the old cv.py); SCORE 1877.3 -> 1972.0 (harsher: warmup 3560.3 vs 2875.3 loses the calendar-local window; panel 1839.6 vs 1857.7)
Thibaut Forest+1: Claude Fable 5
4f5f060
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
all48oof static: EXACT leave-one-building-out predictions per user spec (24 models on 23 buildings each, was 5 fold models on ~19); SCORE 1913.3 -> 1877.3
Thibaut Forest+1: Claude Opus 5 (1M context)
227c214
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
all48oof prints THE SCORE as a single value (mean cost/scenario, building-clean predictions, full-fleet plans); lobo demoted to diagnostic
Thibaut Forest+1: Claude Opus 5 (1M context)
596925f
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
cv lobo: leave-one-building-out cost CV (user-specified primary) - per scenario x building, static fit on the other 23 buildings' full closed history, per-building plan+score; reports mean/bldg, sum, recall, and zero-swap-with-death count (the model-adaptation to-do list)
Thibaut Forest+1: Claude Opus 5 (1M context)
2512a0a
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
all48oof: static fit protocol is the default (user-shaped) - one fit per fold on the other buildings' FULL closed history, deployment's exact shape; 40s runtime; new reference panel 1893.4 / ALL-48 1913.3; 'cv all48oof wf' keeps the walk-forward variant
Thibaut Forest+1: Claude Opus 5 (1M context)
79a4af2
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
all48oof defaults to the oof arm only (THE SCORE); 'cv all48oof self' re-enables the validity-check arm and the flattery readout
Thibaut Forest+1: Claude Opus 5 (1M context)
11cbd93
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
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)
534abdd
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Phase 52 addendum: building split extended to the cost harness - new cv all48oof protocol (building-OOF p42, full-fleet planning, paired self arm); panel 1679.2 -> 1813.6 (+134.4/origin, 8W/26L), self-building fit flatters all48 by ~+134/origin; prices harness optimism, no selection change
Thibaut Forest+1: Claude Fable 5
43761b5
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Phase 53: building-CV re-adjudication - GHOST_ZERO/QUARANTINE/combined all reject; screen confirms feature rejections; record closed
Thibaut Forest+1: Claude Opus 5 (1M context)
60e7aaf
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Phases 50-51: dynamics forecast family - strongest screens of the campaign, closed by the cost harness and the building-split autopsy (own-telemetry memorization)
Thibaut Forest+1: Claude Fable 5
075488b
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Phase 48 addendum: late +75 proves zero public catches; cert-first family closed
Thibaut Forest+1: Claude Opus 5 (1M context)
6627f14
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
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)
e382bfa
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Phase 46 addendum: threshold sweep - cert-first works only at the label rule's exact parameters; direction closed
Thibaut Forest+1: Claude Opus 5 (1M context)
54b578c
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Phase 49: four new ordering-signal families opened and closed - longitudinal cross-origin, interactions, tau re-rank, temporal ensembling; the marginal-rank defect is missing information, not noise
Thibaut Forest+1: Claude Fable 5
2cabcac
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
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>
The blind4 writeup was swept into 4e17cd1 with a colliding Phase 46 header.
Renumbered to 47 per cross-session coordination. cv.py gains the rejected
blind4/blind3 variants with the verdict inline so the port cannot be
re-attempted by inspection.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Phase 45: pairwise ranking objective rejected - no new information, demotion artifact exposed; all axes now measured
Thibaut Forest+1: Claude Opus 5 (1M context)
25432c8
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Phase 44: leaderboard inversion - appetite closed on numbers, tail transfer is the defect, no local instrument sees it
Thibaut Forest+1: Claude Opus 5 (1M context)
ab4b0fd
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Phase 43: innovation sweep - queue pricing, lead-time bias, late decomposition; and a verified data leak we are not taking
Thibaut Forest+1: Claude Opus 5 (1M context)
e44c7a4
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Phase 41-42: fixed-N ablation rejects the vrel port; public says pooling is a wash
Thibaut Forest+1: Claude Opus 5 (1M context)
41a82cd
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…
Track *.png via LFS (HF rejects non-LFS binaries)
Thibaut Forest+1: Claude Opus 5 (1M context)
d5b03a1
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Phase 40: port the research loop's CV discipline + ship in-fleet pooling
Thibaut Forest+1: Claude Opus 5 (1M context)
c7d5d98
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…
Phase 37: dq_g20 cannot be made always-on - benefit and harm come from the same rows
Thibaut Forest+1: Claude Fable 5
9fd6de6
H1 (devw harm was a double-bootstrap artifact): refuted. Re-implemented with
true sample_weight in a manual bagging loop plus a uniform-weight control;
devw is +389 vs that control, clean dose-response, harm unchanged.
H2 (quar's 2.48 threshold is over-broad): refuted. It does drop 77 devices vs
the ~26 real ghosts, but tightening toward the ghosts is monotone in the wrong
direction on s_8-47 (2.40 +36.7 ... 2.48 +509.5) with the trend's limit being
'do not filter'. At 2.40 warm-up is identical to base, so the tight filter that
spares the panel also yields no cold-start gain.
Devices that look dead and survive are label noise at 3-20 positives and
informative hard negatives at 800+; the effect changes sign rather than
attenuating. Champion unchanged: all-48 1661.7, s_8-47 1518.0.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Phase 36: fit-protocol axis - warm-up mechanism validated (-49.8+/-6.0 across 6 seeds) but inert in deployment (static_uniq=82 vs gate 20)
Thibaut Forest+1: Claude Fable 5
c64ca4a
quar (drop 26 'looks dead, labeled survives' ghosts) and devw (device-equal
resampling) each improve warm-up substantially and wreck the panel; gated at
train_deaths<20 they leave panel/near-end byte-identical. Stacked (dq_g20):
all-48 1619.1 vs 1661.7, every one of 6 resampling seeds improves.
Not adopted. submit.py scores public,private - both held-out, both static
branch, train_uniq = static_uniq = 82 unique dead devices in the foreign
pool. Every gate tested is far below that, so the branch never runs where it
is scored. The whole warm-up regime (23.9% of the checksum) is absent from
the scored splits, which is why the cold-start floor's huge local gain
(2146.9->1851.0) never showed on public.
Deployment-faithful window is s_8-47, base 1518.0. Re-ranked all 86 screened
configs on it: no hidden winner, only the known s_39-46 tail artifacts.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
No 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…
Phase 33: late-swap root cause - count is optimal, ranking is the wall
Thibaut Forest+1: Claude Opus 5 (1M context)
eb395ee
Forensics (panel s_8-41): late is 97.9% MISSES, 2.1% caught-late; we already
swap a median 12.2d before EOL, so no timing lever exists. Recall 176/308.
Missed deaths are LINGERERS (median days_below_245 63 vs 29.5 caught) sitting
at median rank 35 of ~450.
Definitive alpha curve on the SHIPPING rolling path (full evaluator cost):
0.6:1844 0.8:1679 1.0:1771 1.2:1862 1.5:2084 2.0:2369. Clean U with the
minimum at 0.8. More swaps DO cut late (1019->691) but early rises 3x faster
(444->1409); at 28.5 swaps our late still never reaches the leader's 499
while early is 2.3x theirs. No alpha reaches the leader profile - their 19
swaps are a consequence of better ranking (~40% marginal hit rate vs our 8%),
not a cause. Independently reproduces public 6ea03da (+8 swaps, late -13,
early +444).
Six ranking attacks rejected, all with the same signature - AUC UP, top-12
recall DOWN: zone features, v_corr_last+thresh_dist, RF ranking, rank blends,
cohort-restricted model, sub-daily/intra-day f…
Phase 28 public refutation: revert static appetite to 0.8, cliff boost off
Thibaut Forest+1: Claude Fable 5
bb5a0c1
Public 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…
Phase 28: cliff-gated static appetite (cliff_count22) for held-out splits
Thibaut Forest+1: Claude Fable 5
6ea03da
- 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;…
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…
Phase 24b+26: static per-split fit + ALPHA_STATIC=1.5 for held-out splits
Thibaut Forest+1: Claude Opus 5 (1M context)
faf80ea
- 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…
- 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…