diff --git a/AGENTS.md b/AGENTS.md index 60a5e65..e5fb8fb 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -289,6 +289,37 @@ publique propre, l'héritage pourrait être remplacé par composition. --- +### Verrous minOn/minOff — protection compresseur (décision Patrick) + +Le délestage du waterfall est **strict au niveau budget** (surplus net signé : en import, +budget négatif → palier 0). Mais une charge à compresseur (PAC, ballon thermodynamique) +ou un VE ont un **temps de fonctionnement minimum incompressible** : ce n'est pas du +confort, c'est de la **protection matérielle** (le court-cycling détruit le compresseur). + +**Séparation des responsabilités** : +- Le **scheduler** décide le palier idéal selon le budget (peut vouloir « palier 0 »). +- L'**adaptateur** borne ce choix via `minStage`/`maxStage` (fenêtre `lockWindow()` évaluée + au temps de cycle) : une charge verrouillée ON garde son palier ; l'import transitoire + est **borné par minOn**, pas illimité. Le scheduler clampe et décrémente le budget au + palier réel (puissance engagée non-coupable) → budget correct pour les charges suivantes. +- `minOnS`/`minOffS` sont des **paramètres par charge** (constructeur `EcsRelayAdapter`, + config installateur) — **jamais codés en dur**. + +**Défauts indicatifs par type** (à affiner à la mise en service) : + +| Type de charge | minOn | minOff | Raison | +|----------------|-------|--------|--------| +| Ballon résistif (ECS simple) | ~60 s | ~60 s | anti-rebond relais seul | +| Ballon thermodynamique / PAC | ~300–600 s | ~300 s | **protection compresseur** (anti court-cycling) | +| SG-Ready PAC (3e) | `minStateHoldS` ~900 s | — | maintien d'état imposé constructeur | + +**Seam de temps** : `minStage`/`maxStage` (décision) ET le verrou de `applyAction` +(exécution) partagent le **même `now = ctx.timestamp`** via `lockWindow()` — source unique, +divergence impossible par construction, injectable en simulation. Voir `iloadadapter.h` +(contrat « temps = paramètre, jamais l'horloge »). + +--- + ## MODÈLE DE SÉCURITÉ (décision Patrick — immuable) Cinq couches indépendantes. Chacune est conçue pour qu'une défaillance des couches