400 invalid_grant = spálený token rotací NEBO ~10min výpadek po revokaci
souhlasu (Tesla) — místo tracebacku log s návodem a return None (EMS jede
dál na defaultech). deploy/tesla/reauth.sh: authorize URL → výměna → DB →
ověření v jednom kroku (žádná příležitost pro rotační past).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
V dev portálu je registrováno https://ems.vojacek.eu/t-auth — docs i setup
skript diktovaly /tesla/callback (mismatch = invalid_auth_code / chybné
návody). Caddy blok nově servíruje callback stránku na /t-auth (rewrite).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Run 368/369: flyway validate 9,5 min nedostal spojení k db (EOF) — server
zadušený běžícím stackem + buildem. Stop backend/frontend/postgrest hned po
compose config; db zůstává pro flyway. Workflow self-install už funguje
(ověřeno v logu 369: nový skript se použil).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Doména slouží jen jako veřejná vizitka pro Tesla: Caddy blok vystavuje POUZE
.well-known public key a statickou OAuth callback stránku (zobrazí ?code=,
nic neodesílá), vše ostatní 404 — EMS zůstává na VPN. Certifikát Let's Encrypt
řeší hostovský Caddy automaticky.
deploy/tesla/setup_tesla_domain.sh (spustit NA SERVERU): EC keypair prime256v1
(privátní do /opt/ems-deploy/secrets 0600), public do .well-known, callback,
vypíše Caddy blok. docs/tesla-fleet-api.md: developer portál, partner
registrace, OAuth flow, plán EMS integrace (tesla_client + hook v _on_ev_arrival).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
deploy.sh validate selhával na nové/změněné repeatable (flyway 12: pending =
error), kterou má hned následující migrate aplikovat → -ignoreMigrationPatterns
'*:pending'. Workflow deploy step nově nejdřív resetne checkout a nainstaluje
ROOT kopii deploy.sh z repa — opravy skriptu se propagují bez ručního zásahu
na serveru (deploy.sh fetch/reset zopakuje idempotentně).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Podklady: harness +22 % na 6 fixtures (vč. vyřešení Infeasible dne 2026-05-01),
první živé srovnání 11. 6.: v2 o 28.8 Kč lepší (v1 kvůli relax řetězci potlačil
evening push a neprodal špičku 3.92 Kč/kWh). Předletová kontrola: planning_interval
v2 bez NULL, Planning.tsx snapshot parsing defenzivní, exporter čte jen
planning_interval. Rollback: PLANNING_ENGINE_VERSION=v1 v /opt/ems-deploy/.env.
Pozn.: pokud .env na serveru definuje PLANNING_ENGINE_VERSION, přebíjí tento
default — po deployi ověřit build tag aktivního runu.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Slabý server: build s běžícím stackem se dusí (pozorování z provozu) —
před docker compose build zastavit backend/frontend/postgrest (db zůstává).
Self-sync: po git resetu se ROOT/deploy.sh atomicky obnoví z checkoutu
(projeví se příštím během). První instalace nové verze ručně:
install -m 0755 /opt/ems-deploy/app/deploy/deploy.sh /opt/ems-deploy/deploy.sh
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
PLANNING_ENGINE_COMPARE_ENABLED default true v deploy compose — aktivní
zůstává v1, v2 se počítá paralelně do planning_run.solver_params.comparison.
Přepnutí na v2 později přes PLANNING_ENGINE_VERSION v /opt/ems-deploy/.env.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>