R3: suite de tests golden — 16 scénarios, bloquante avant push
- tests/golden/run.mjs : chaîne complète des 5 nodes (code réel) en sandbox vm, horloge simulée par scénario, snapshot HA réel comme fixture. - 16 scénarios attendus figés après revue : nuit HC (P7), solaire, abondance P6, provocation P3, gardes SOC, force_grid/force_charge, stop, overload. - n8n-push.mjs exécute la suite avant tout PUT du workflow EVCS : golden rouge = push refusé (--skip-golden en échappatoire consciente). - Validé par mutation : P7 cassé volontairement -> 2 échecs détectés + push bloqué. - tools/fetch-snapshot-fixture.mjs : recapture d'un snapshot production.
This commit is contained in:
52
HANDOFF.md
52
HANDOFF.md
@@ -520,3 +520,55 @@ divergence silencieuse entre sourceMode (WINDOWS) et conditions (BCL).
|
||||
|
||||
---
|
||||
*Document mis à jour le : 07/08/2026 (~19:10) — R1 déployé, comportement inchangé (A/B), production stable*
|
||||
|
||||
## 13. Session du 07/08/2026 (soir) — R3 : Suite de tests golden
|
||||
|
||||
### Ce qui existe désormais (`tests/golden/`)
|
||||
- **`run.mjs`** : exécute le VRAI code des nodes en chaîne complète
|
||||
(INPUT_PARSE → WINDOWS_SOURCEV2 → BATTERY_CLOUD_LOCKS → DECISION_ENGINEV2
|
||||
→ HA_SERVICE_CALLS_OUTPUT) dans une sandbox vm avec **horloge simulée**
|
||||
(Date épinglée par scénario) sur un **snapshot HA réel** modifié par overrides.
|
||||
- **`fixture-snapshot.json`** : snapshot production capturé depuis l'exécution
|
||||
n8n 975833 (173 champs, re-capturable via `tools/fetch-snapshot-fixture.mjs`).
|
||||
- **`scenarios.mjs`** : 16 scénarios avec attendus FIGÉS après revue manuelle :
|
||||
6 nuit HC (P7 ON/OFF, sous-cible, hard floor, sans véhicule, EDF ON→start),
|
||||
4 solaire (matin fort, matin nuageux, abondance P6, provocation P3),
|
||||
garde SOC midi HC, force_grid, force_charge nuit, stop, overload, débranché.
|
||||
|
||||
### Usage
|
||||
- `node tests/golden/run.mjs` → 16/16 ✅ ou liste des diffs + exit 1
|
||||
- `--print` : affiche les résumés obtenus (pour autoriser une évolution)
|
||||
- `--json` : sortie machine (utilisée pour figer les attendus)
|
||||
- `--only=<motif>` : filtre par id de scénario
|
||||
|
||||
### Intégration au déploiement (le point clé)
|
||||
`tools/n8n-push.mjs` exécute la suite AVANT tout PUT du workflow EVCS :
|
||||
**golden rouge = rien n'est poussé**. Échappatoire consciente : `--skip-golden`.
|
||||
Évolution volontaire du comportement → mettre à jour les attendus dans
|
||||
`scenarios.mjs` DANS LE MÊME COMMIT que le patch.
|
||||
|
||||
### Validation par mutation
|
||||
P7 volontairement cassé (`nightGridHcPreferred = false`) → la suite détecte
|
||||
2 échecs avec diffs précis (sourceMode, takeover, EDF) et bloque le push ;
|
||||
restauration → 16/16. Le filet fonctionne.
|
||||
|
||||
### Résumé testé par scénario
|
||||
profile, sourceMode, state, decision, desiredCharging, currentA,
|
||||
takeoverNeeded, action EDF ON, service helper takeover.
|
||||
|
||||
### Notes de comportement figées (découvertes en écrivant les attendus)
|
||||
- SOC 20 la nuit avec maison sur batterie (−14 A) → `battery_current_hard_stop`
|
||||
(bande lt25 : hard −8 A) + demande réseau simultanée. Protection cohérente.
|
||||
- `force_charge_now` la nuit (toggle HC ON) → `start_manual_local_min_current`
|
||||
ET takeover helper ON (session nuit active) : EDF peut venir en renfort. Voulu.
|
||||
- Garde SOC>35 midi : sourceMode `grid_hc_allowed` mais `idle_wait_conditions`
|
||||
(le grid HC midi ne s'active que SOC ≤ 35) — comportement épinglé par le test.
|
||||
|
||||
### Prochaines étapes du plan
|
||||
- R2 : git source de vérité (src/nodes/*.js + assemblage dans n8n-push).
|
||||
- Agent IA planificateur en mode ombre (après R2).
|
||||
- Enrichir la suite au fil des incidents : chaque bug corrigé = +1 scénario.
|
||||
|
||||
---
|
||||
*Document mis à jour le : 07/08/2026 (~19:20) — R3 en place, 16/16, push bloquant*
|
||||
|
||||
|
||||
Reference in New Issue
Block a user