Fix E: latch 'charge terminée' en session active + coupure recovery_done (incident rebond 08-09/08)

- DECISION: branche completed prioritaire dans la session active (avant VDF/source-lost)
  → état collant écrit au 1er cycle status=3, relais encore fermé
- WINDOWS: garde puissance <=300W sur Fix D (anti-glitch)
- Hystérésis: turn_off_recovery_done (bypass min_on, dry-run 5 cas)
- golden 23→25 (session armée status 3, flap statut post-latch)
- HANDOFF §18
This commit is contained in:
Tallagrand Thierry
2026-08-09 06:31:33 +02:00
parent 9bc4af0ea1
commit b287e5ba73
7 changed files with 225 additions and 5 deletions

View File

@@ -801,3 +801,57 @@ P7 a chargé la VW dès 01:24 ✓ (session 1h32m). Ensuite :
---
*Document mis à jour le : 08/08/2026 (~14:15) — fixes A/B/C/D déployés, golden 23/23*
## 18. Session du 09/08/2026 — Incident nuit 08-09/08 : le rebond est revenu par un AUTRE chemin (Fix E)
### Incident (captures HA, VW branchée, HC, VW pleine vers ~03:00)
Fix A/D du 08/08 ont bien fonctionné CÔTÉ WINDOWS (status 3 → completed →
takeover Désactivé, source blocked). MAIS l'état EVCS observé était
`hold_min_run_source_lost` / `stop_source_lost` — jamais `night_recovery_done_idle`.
Cycles ~30 min de 03:00 à 05:40 : EDF ON (2531 W réseau, SOC 51 % > cible 35)
→ arrêt urgence utilisateur 05:43 (EDF URGENCE OFF + stratégie stop) → débranchement.
### Root cause (ordre des branches DECISION)
1. Status 3 arrive PENDANT la session armée (relais fermé, chg=1/perm=1/l=1).
2. WINDOWS → sourceMode 'blocked' (Fix D) ; mais dans DECISION la branche
session ACTIVE traite 'blocked' comme « source perdue » :
`hold_min_run_source_lost` (25 min de session zombie !) puis `stop_source_lost`.
La branche P8 (état collant) est dans la chaîne NON-active → jamais atteinte.
3. Au stop, le relais s'ouvre → le statut EVCS RETOMBE (3 → 1/6, même piège que
le VDF documenté en P8) → completed=false → re-P7 → takeover ON 1 cycle →
`edf_general_ok_on` rallume EDF + restart → status 3 → goto 2. Rebond ~30 min.
4. L'hystérésis adoptait l'EDF ON du cycle de flap puis `hold_on_min_runtime`
25 min (ov=0/eg=0 ensuite, mais latch pris) → EDF ON quasi permanent.
### Fix E (déployé 09/08 ~06:25, golden 25/25)
- **DECISION** : nouvelle PREMIÈRE branche du bloc session-active (avant VDF) :
`night_hc && vehicleChargeCompleted && !force*` → setOff immédiat avec l'état
collant (`night_recovery_done_idle` si SOC ≥ cible, sinon
`night_session_done_idle`), decision `stop_vehicle_full_or_paused`.
→ l'état collant est écrit AU PREMIER cycle où status=3, relais encore fermé ;
les retombées de statut ensuite sont sans effet (prev state dans la liste).
- **WINDOWS** : garde puissance sur Fix D (`status==3 && evcsAcPowerW <= 300 W`)
pour ne jamais latcher sur un glitch en pleine charge.
- **Hystérésis** (patch tools/patch-20260809-e2-recovery-done-cut.mjs) :
`turn_off_recovery_done` = es=night_recovery_done_idle + pas d'override +
SOC ≥ seuil OFF → coupure EDF immédiate (bypass min_on 25). Sûr car l'état
est collant (le takeover ne peut pas revenir, sauf SOC ≤ cible−2 → override).
Dry-run 5 cas validé avant push.
### Golden : 23 → 25
- `night-charged-en-session-active` : status 3 en session ARMÉE → arrêt propre
+ latch immédiat (LE chemin de l'incident) ;
- `night-flap-statut-apres-latch` : relais ouvert, statut retombé à 1,
prev=night_recovery_done_idle → collant, aucun re-P7/EDF.
### Comportement attendu au REBRANCHEMENT d'une VW pleine en HC
1. Session nuit → P7 → EDF ON → tentative de charge (inévitable : le système
ne peut pas savoir que la VW est pleine sans fermer le relais) ;
2. VW refuse (0 W, status 3) → ≤ 1 min : `night_recovery_done_idle` collant,
takeover OFF, session stoppée proprement ;
3. Hystérésis : `turn_off_recovery_done` → EDF OFF ≤ 1 min (plus de min_on 25) ;
4. Plus RIEN jusqu'au débranchement / fin de fenêtre (flaps de statut ignorés).
Total attendu : EDF ON ~2-3 min UNE seule fois, puis silence.
---
*Document mis à jour le : 09/08/2026 (~06:35) — Fix E déployé (EVCS + hystérésis), golden 25/25*