services/planning/solver_v2.py: MILP s objective = reálné peníze (cash +
degradace − terminal SoC value z DB faktoru). Tvrdá pravidla: bilance, SoC
dynamika, breaker (tvrdý), curtail jen A, GEN cutoff binárka, neg-buy/neg-sell
export bloky, export z baterie ⇒ arb floor (p.19), zákaz současného imp+exp,
EV deadline (placený slack 50 Kč/kWh místo infeasibility), TUV look-ahead,
provozní režimy. SQL masky allow_* vědomě ignorovány (heuristika, ne fyzika).
solver_v2_eval.py: v2 vs v1 na golden fixtures (SoC-fér):
v2 lepší na VŠECH 5 řešitelných (+231.5 Kč ≈ +22 %), extreme_neg_buy den
v1=INFEASIBLE → v2 OK (−674.5 Kč). Časy 0.4–10 s (2× na time limitu — TODO).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
SoC série, neg-sell fáze/okna, evening push, pre-neg logika — čistý přesun,
fasáda v planning_engine.py beze změny chování (golden 5/5, baseline faily
beze změny). Roztroušené konstanty MORNING_PRENEG_* doplněny do constants.py.
planning_engine.py: 6345 → 3925 řádků (zbývá: solver, orchestrace, compare).
heuristics.py nese warning: hlavní kandidáti na prune ve Fázi 2/3.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Čistý přesun 57 konstant (vč. SOLVER_RELAX_STEPS) z planning_engine.py;
engine je importuje zpět (fasáda, beze změny chování). Golden replay 5/5,
unit testy beze změny vůči baseline (4+1 předexistující faily).
Ekonomické penalty/váhy tím získaly jedno místo — kandidáti na DB ve Fázi 2.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>