§10 — Éco et confort : deux passes, deux lectures, une seule commande

Réponse de l'app aux trois questions du brief plugin docs/BRIEF_depuis_plugin.md §9 (= DESIGN_10.md 8.5, LM-1002 / LM-1003 / LM-1006 couplage 2 / LM-1009). Rien n'est câblé côté app : cette maquette est le brief, et la charge utile demandée est en bas de page.

Elle vaut comme contrat, pas comme feuille de route. Le §10 n'est pas implémenté, le transport du §14a n'existe pas, draw non plus : aucun de ces trois écrans ne se construit avant que levels[] soit en ligne. Ce qu'elle fixe, c'est la forme de ce qui sera publié — pour que le moteur n'ait pas à inventer une charge utile que l'écran devra ensuite arranger.

1 · La liste reste ordonnée par RANG — parce que c'est la surface d'édition du rang, et parce que l'ordre de service n'est pas une propriété de la configuration : il change à chaque cycle selon les planchers déjà atteints. Une liste qui se réordonne toute seule sous le doigt est inutilisable.

2 · Une seule entrée par charge dans la liste, deux lignes DANS la carte — la commande est le parent, les deux niveaux sont sa décomposition. On ne dédouble que là où l'objet affiché est la séquence, jamais là où l'objet est la charge.

3 · L'ordre de service devient un second écran, en lecture seule — c'est lui qui « le dit ». Il montre le rang 4 éco avant le rang 1 confort, avec les rangs visibles, donc il montre en même temps que votre ordre est respecté dans chaque passe. C'est l'écran qui désamorce « l'ordre n'est pas respecté ».

‹

Rôles & appareils

⟳
Arbitrage en direct · cycle de 06:41, il y a 22 s
Matin sans soleil2 comptabilités
■Passe 2 — surplus disponible
Surplus0
Réservé VE *0
Recrédité0
Alloué0
Reliquat0
■Passe 1 — autorisation de soutirage
Autorisé4 000
Engagé4 000
Restant0
Borné parGRD
◆ Deux passes ce cycle Tous les planchers éco sont servis d'abord, par rang croissant ; le confort ensuite, dans le même ordre. Un plancher de rang 4 passe donc avant un confort de rang 1 — c'est voulu, et votre ordre est respecté à l'intérieur de chaque passe. Voir l'ordre de service de ce cycle ›
Charges pilotables · ordonnées par rang — glissez pour classer
⠿1
Chauffe-eauRouteur de relais · 3 relais · ECS
Décidé 1 400 Wune seule décision
↳ appliqué au mécanisme : palier 1 000 W (relais 1+2) — l'adaptateur n'a pas ce point exact
ÉCO
Plancher servi — 1 400 W achetés au réseau 2,1 kWh livrés sur les 3,0 dus avant 07:00 (heure box) MESURÉ
CONFORT
En attente Aucun surplus ce cycle — le bonus n'est pas refusé, il n'a rien à prendre.
⠿2
PAC bancSG-Ready · chauffage
Décidé 0 Wétat SG-Ready 2 appliquéune seule décision
ÉCO
Plancher atteint 3,0 kWh livrés sur 3,0 MESURÉ — plus rien à servir en passe 1.
CONFORT
En attenteAucun surplus ce cycle.
⠿3
Borne sans compteur de sessionBorne de recharge · VE
Décidé 2 600 Wune seule décision
↳ appliqué au mécanisme : 11 A · 1 phase ≈ 2 530 W — le courant est entier, la décision ne l'est pas
ÉCO
Plancher servi — 2 600 W achetés au réseau Avancement non mesurable : cette borne ne publie pas d'énergie de session. NON MESURABLE
Reste 4,0 kWh à livrer en 5 h 13 — et ce taux ne peut que monter : rien n'est soustrait de ce qui reste, donc l'achat s'accélère jusqu'à l'échéance. L'obligation est servie ; elle ne pourra jamais être annoncée tenue.
CONFORT
En attenteAucun surplus ce cycle.
⠿4
Plancher chauffantCharge modulable · chauffage
Décidé 0 Wune seule décision
ÉCO
Plancher NON servi — plafond de soutirage atteint Plafond imposé par le gestionnaire de réseau (4 000 W), épuisé au rang 3. Ce n'est pas la protection de surcharge de l'installation. 0,4 kWh livrés sur 2,0 MESURÉ — obligation reportée.
CONFORT
En attenteAucun surplus ce cycle.
⠿5
Sèche-serviettesRouteur de relais · 1 relais
Décidé 0 Wune seule décision
CONFORT
Pas demandeur 22,4 °C mesurés ≥ 22 °C de consigne — le bonus n'est plus utile.
Aucune obligation éco déclarée : cette charge ne participe qu'à la passe 2 — c'est exactement le comportement d'aujourd'hui.
Écran 1 — liste au rang, une entrée par charge
Ce qui ne change pas : le glisser-déposer produit toujours une suite d'entiers priority à plat, et il n'existe qu'un rang. La maquette est un rejet appliqué de prioritéEco/prioritéConfort.
  • Les deux lignes de niveau vivent sous la ligne de commande, décalées et rattachées par un filet : la commande est le fait, les niveaux en sont la décomposition. C'est ce qui rend LM-1003 lisible sans l'écrire.
  • L'écart affiché est décidé ↔ appliqué, jamais Σ targetW ↔ allocatedW : ces deux-là sont égaux par construction, tous deux du décidé. Un écran bâti sur la prémisse inverse comparerait deux valeurs toujours égales — il ne montrerait jamais rien, et sans erreur. L'appliqué se lit dans la charge utile de mécanisme (stageW, setpointW, currentA), qui existe déjà aujourd'hui.
  • Et il ne se répartit pas non plus. L'écart appartient à la charge, pas à un niveau : l'adaptateur arrondit une consigne unique, il ne sait pas de quel besoin elle venait.
  • L'heure d'une échéance est celle de la BOX, pas celle du client : dailyDeadline est un "HH:MM" sans fuseau, interprété dans celui de la box. Mesuré le 2026-09-04 — .75 est en Europe/London, donc « 12:00 » vaut 13:00 sur une horloge française. Le fuseau se lit par System.GetTime : l'écran l'affiche à côté du champ et signale la divergence, plutôt que de choisir une horloge à la place de l'installateur.
  • Sous unmeasurable, le plancher ne peut pas se refermer — mesuré le 2026-09-01 sur quatre cycles : remainingWh figé à 4 000, remainingS qui descend, gridW qui monte 755 → 767. Ce n'est pas un cas limite, c'est la trajectoire garantie du régime : l'écran doit montrer reste et temps, pas seulement les watts de l'instant, sans quoi « 767 W achetés » ne laisse pas deviner le mur.
  • * « Commandé, pas encore mesuré » — et ce n'est pas une destination. Le champ budget.evReservedW est un terme de correction : la latence entre l'ordre et sa lecture au compteur. Il est affiché parce que la box le publie, jamais sommé. Son ancien libellé, « Réservé au véhicule », affirmait deux faussetés — que c'est réservé, et que ça regarde le véhicule plutôt que la latence de sa mesure ; réécrit le 2026-08-30 sur la définition livrée par le moteur. Les watts achetés, eux, n'ont de registre qu'avec draw.committedW.
  • Le bandeau ◆ n'apparaît que si au moins une charge porte une obligation éco. Sans obligation, il n'y a qu'une passe utile et la phrase serait du bruit (LM-1007).
‹

Ordre de service

⟳
Ce que le moteur a fait, dans l'ordre Cycle de 06:41 · lecture seule. Une charge apparaît deux fois — une par passe : ici l'objet affiché est la séquence, pas la charge. Votre rang décide de l'ordre à l'intérieur de chaque passe, jamais entre les deux.
1PLANCHERS ÉCO4 000 W autorisés au réseau
1
Chauffe-eau2,1 / 3,0 kWh · au réseau
1 400 Wreste 2 600
2
PAC bancPlancher déjà atteint — rien à servir
0 Wreste 2 600
3
Borne sans compteur de sessionAvancement non mesurable · au réseau
2 600 Wreste 0
⚠ Autorisation de soutirage épuisée ici — plafond du gestionnaire de réseau (4 000 W). Les charges suivantes ne verront pas leur plancher ce cycle.
4
Plancher chauffant0,4 / 2,0 kWh · obligation reportée
refuséplafond GRD
5
Sèche-serviettesAucune obligation déclarée
—hors passe 1
puis, sur le reliquat, et seulement là
2CONFORT0 W de surplus
Aucun surplus ce cycle — la passe 2 a été parcourue en entier et n'a rien pu servir. Ce n'est pas un refus par charge : c'est une passe sans budget.
1
Chauffe-eauDemandeur · en attente
0 Wreste 0
2
PAC bancDemandeur · en attente
0 Wreste 0
3
Borne sans compteur de sessionDemandeur · en attente
0 Wreste 0
4
Plancher chauffantDemandeur · en attente
0 Wreste 0
5
Sèche-serviettesPas demandeur — 22,4 °C ≥ 22 °C
—sauté
Pourquoi le rang 4 passe avant le rang 1 Le rang classe les charges. La hiérarchie éco/confort classe les besoins, et elle surplombe le rang : un plancher est une obligation, un confort est un bonus. Aucune charge ne double une autre à niveau égal — et c'est exactement ce que cet écran donne à vérifier, ligne à ligne.
Écran 2 — séquence, une charge deux fois
Écran dérivé, sans champ nouveau. La séquence se reconstruit entièrement côté app par un tri lexicographique sur (niveau, priority) : ne publiez pas d'index d'ordre, il serait une seconde source de vérité pour une donnée déjà déductible.
  • Les compteurs « reste N » de chaque ligne sont un cumul local — ils exigent seulement que chaque niveau publie ce qu'il a pris et son financement.
  • Le point de rupture (« autorisation épuisée ici ») est lu, jamais déduit d'un solde à zéro : il vient du motif DRAW_CAP de la première charge refusée, avec sa source.
  • Cet écran s'ouvre depuis le bandeau ◆ et depuis chaque carte ; il n'a aucun réglage, donc aucun risque de devenir un second endroit où l'on classe.
‹

États d'un niveau

?
Le vocabulaire, et il est fermé Chaque niveau d'une charge est toujours dans un de ces états, et chacun est un état positif — jamais « à moitié servie », jamais un pourcentage d'avancement.
Niveau ÉCO · présent seulement si la charge porte une obligation
ÉCOPlancher serviECO_FLOOR_*
« Plancher servi — 1 400 W pris sur le surplus »
« Plancher servi — 1 400 W achetés au réseau »
Deux phrases, parce que ce sont deux faits différents pour le client : l'un est gratuit, l'autre est une facture. Le financement se lit sur le niveau, pas sur la charge.
ÉCOPlancher atteintECO_FLOOR_MET
« Plancher atteint — 3,0 / 3,0 kWh livrés »
Le seul état qui ferme l'obligation. Interdit sous le régime « non mesurable » : on ne peut pas annoncer tenu ce qu'on ne mesure pas (LM-1009 C1).
ÉCONon servi — plafondDRAW_CAP
« Plafond de soutirage atteint — gestionnaire de réseau »
« … — protection du branchement » · « … — limite que vous vous imposez »
Trois sources, trois phrases, trois gestes : subir et se renseigner, délester ou revoir l'abonnement, ou changer un réglage. Un motif qui les confond envoie diagnostiquer le mauvais problème.
Sa frontière : DRAW_CAP ne sort que si l'autorisation résiduelle est nulle. S'il en reste mais sous le plus petit palier, le motif est BELOW_MIN_POWER — il y en a, pas au bon format. Deux gestes : revoir le plafond, ou lire la fiche technique.
ÉCOAvancement non mesurableregime
« Servi · avancement non mesurable » — barre hachurée, aucun chiffre livré.
Un régime, pas un motif : les trois régimes coexistent dans le même cycle sur des charges différentes (LM-1009 C2). Zéro serait un mensonge ; l'absence est la vérité.
Corrigé le 2026-08-30 : l'exemple ne nomme plus la V2C Trydan — elle publie `sessionEnergy` depuis le plugin `+etm13`, vérifié sur charge réelle (15,80 → 15,84 kWh en mouvement). Le régime « non mesurable » reste vrai pour les bornes qui n'ont pas cet état.
Niveau CONFORT · toujours présent
CONFORTServiSURPLUS_SETPOINT
« Bonus servi — 2 100 W de surplus »
L'état d'aujourd'hui, inchangé. Une charge sans obligation éco n'a jamais que cette ligne : le modèle à deux niveaux dégrade proprement vers l'actuel.
CONFORTEn attenteSURPLUS_INSUFFICIENT
« En attente — aucun surplus ce cycle »
« En attente — reliquat épuisé au rang 2 »
La charge veut son bonus et ne l'a pas. Un état de file d'attente, pas un échec — et surtout pas « 0 W » tout seul, qui ne dit pas s'il y avait une demande.
CONFORTPas demandeurCOMFORT_SKIPPED
« Pas demandeur — 22,4 °C ≥ 22 °C de consigne »
Rien ne manque, rien n'attend : le comparateur de LM-1008 est satisfait. À ne jamais confondre avec « en attente » — l'un se règle en changeant la consigne, l'autre en attendant le soleil.
×3 Trois nombres, et jamais le même sens
Décidé allocatedW — ce que l'arbitre a planifié, et ce que les compteurs de budget comptent.
Appliqué mechanism.* — ce que l'adaptateur a su produire.
Mesuré measurement.powerW — ce que la charge tire, quand c'est mesurable.
Chaque écart dit autre chose : décidé ↔ appliqué = l'arrondi du mécanisme, normal et permanent ; appliqué ↔ mesuré = la charge n'obéit pas (et ce que ça prouve dépend de measurement.source) ; décidé ↔ mesuré = la somme des deux, à ne jamais lire seule — elle mélange une cause bénigne et une cause qui ne l'est pas.
✖ Ce que l'écran n'affichera jamais
  • Un pourcentage d'avancement d'obligation — l'énergie livrée, ou rien (LM-1009 D1).
  • Une charge « servie à moitié » : deux niveaux, deux états nommés.
  • Deux consignes pour une charge : les deux lignes décomposent une commande unique.
  • Un zéro à la place d'une mesure absente.
  • Un second classement à régler.
  • Un écart entre Σ targetW et allocatedW : ils sont égaux par construction. Cherché là, l'arrondi est invisible et l'écran se tait sans se tromper.
  • Une exception de réconciliation : avec counts, il n'y en a plus une seule. Un écart qui subsiste est un défaut, et il se dit.
Écran 3 — catalogue des états de niveau
Pourquoi un catalogue plutôt qu'une échelle : « éco servi / confort non » est le cas le plus fréquent en régime normal. S'il s'affiche comme une fraction de quelque chose, il se lira comme une dégradation permanente. Nommé, il se lit comme le fonctionnement nominal — le plancher est tenu, le bonus attend le soleil.

Ce que ces écrans demandent à GetLoadTelemetry

Aucun de ces trois écrans n'est constructible sur la charge utile d'aujourd'hui : un allocatedW et un decision par charge, un seul de chaque. Voici la forme minimale qui les rend possibles — elle ajoute un tableau et ne retire rien.

{
  "loadId": "…", "available": true, "measurement": { … },   // inchangés

  "allocatedW": 1400,        // INCHANGÉ — le DÉCIDÉ du cycle. Σ targetW == allocatedW, exactement.
                              // L'appliqué vit dans "mechanism" ; le mesuré dans "measurement".

  "levels": [                    // AJOUT — un élément par passe RÉELLEMENT parcourue
    { "level":   "eco",     // RELEVÉ sur `.75` le 2026-09-01, +etm43
      "targetW": 766.813994355397,   // le décidé, NON arrondi
      "funding": "grid",
      "counts":  { "draw.committedW": 766.813994355397 },
      "progress": { "regime": "unmeasurable", "targetWh": 4000 },
                              // deliveredWh ABSENT sous unmeasurable — jamais 0
      "decision": { "code": "ECO_FLOOR_GRID", "params": {
          "gridW": 767, "remainingWh": 4000, "targetWh": 4000,
          "remainingS": 18779, "regime": "unmeasurable", "atMaximum": false } } },
    { "level":   "comfort",
      "targetW": 0,
      "decision": { "code": "SURPLUS_INSUFFICIENT", "params": { "requiredW": 900, "availableW": 0 } } }
  ],

  "decision": { "level": "eco", "code": "ECO_FLOOR_GRID", "params": { … } }  // CONSERVÉ + le niveau reflété
}

// et, une fois par cycle, à côté de "budget" :
"draw": { "authorisedW": 4000, "committedW": 4000, "remainingW": 0,
          "binding": "gridOperator", "perPhaseBound": false }

// ⚠ committedW part SEUL, et AVANT counts (2026-08-30) : c'est le registre des watts
// achetés, et il n'en existe aucun aujourd'hui. draw: {"committedW": 1400} tout court
// est la bonne première livraison — les quatre autres champs ABSENTS, jamais à 0 :
// un authorisedW forgé afficherait un plafond de soutirage qui n'existe pas.

Huit exigences, et chacune tient un endroit précis de la maquette

R1`levels[]` ne contient que les passes réellement parcourues

Une charge sans obligation éco porte une seule entrée, comfort — pas une entrée eco à zéro. L'absence est alors l'information (« ne participe qu'à la passe 2 », LM-1007), et un zéro forgé la détruirait. levels[] entièrement absent = box antérieure : l'app retombe sur allocatedW/decision et n'affiche ni bandeau ◆ ni écran 2.

R2`funding` descend au niveau — ✔ EN COURS côté moteur

Aujourd'hui il est par charge. Au §10, la même charge peut être financée au réseau pour son éco et au surplus pour son confort dans le même cycle : un funding par charge devient indécidable. Or c'est lui qui porte notre identité de réconciliation (« somme des allocations financées au surplus == budget.allocatedW »). S'il reste à la charge, cette identité cesse d'être vérifiable sans que rien ne le signale.

Si vous hiérarchisez, prenez celle-ci en premier : c'est la seule des huit qui soit un changement de forme d'un champ existant et non un ajout. Chaque écran qui s'appuiera d'ici là sur un funding par charge en augmentera le coût de déplacement — les sept autres attendent sans se renchérir.

Parti le 2026-08-29 — l'argument de coût a emporté la priorisation. C'est la première des huit à être écrite.

R3Chaque watt tombe dans un compteur nommé — ✔ résolu par `counts`

La forme du moteur est prise telle quelle (2026-08-30) : à côté de funding, un counts qui nomme les registres, avec Σ counts == targetW toujours, publié même à une seule destination. L'identité devient calculable sans exception et par niveau : l'exception EV_GRID_START, qui partageait une allocation entre deux compteurs, disparaît — remplacée par une règle vérifiable qui vaudra telle quelle quand draw.committedW arrivera.

Les deux champs ne se dérivent pas l'un de l'autre, et c'est ce qui empêchera qu'on en supprime un : funding dit l'origine (« ces watts sont achetés » — voisin du motif), counts dit le registre (« ils sont comptés ici » — une comptabilité).

Sur un niveau mixte, un code unique : "grid" — et la règle demandée n'est pas « une approximation » mais « grid l'emporte dès qu'un watt est acheté ». Déterministe, indépendante des proportions (un libellé qui bascule sur 900/480 serait pire que faux), et alignée sur ce qu'un humain doit savoir : l'achat est le fait actionnable. Elle vaudra sans nouvelle décision pour le plancher éco du §10. Ni omission (notre isSurplusFunded range alors le niveau au soleil, en silence) ni "mixed" publié : une troisième valeur tomberait dans la branche par défaut de tout client — « surplus » — donc reproduirait la panne de l'omission, et elle serait dérivable de counts, donc supprimée un jour à juste titre.

Et il a un préalable, trouvé en le câblant (2026-08-30) : draw.committedW. budget.evReservedW n'est pas un registre d'allocation mais un terme de correction du budget — une borne servie au réseau qui tire déjà ce qu'on lui a commandé y contribue 0 pour un targetW de 7 000 W. Σ counts == targetW y serait vraie au premier cycle après un changement et fausse ensuite : une identité dépendante du temps, qui passe tous les tests et certifie un total faux. Les watts achetés n'ont aucun registre aujourd'hui — d'où une seule identité vérifiable, du côté surplus, et rien de l'autre côté tant que committedW n'est pas publié.

Ce que l'app promet en échange : les clés de counts sont traitées comme des identifiants opaques, jamais comme des chemins. Une clé inconnue d'une version ancienne n'est pas perdue : l'identité Σ counts == targetW reste vérifiable sans connaître le sens des clés, et l'écran dit « destination inconnue de cette version », jamais zéro. Corollaire pour le moteur : ne jamais réutiliser une clé existante pour un sens nouveau — c'est le seul cas qu'aucun client ne peut détecter.

R4`Σ targetW == allocatedW` — une identité, pas un écart ✔ tranché

Corrigé le 2026-08-29 : notre prémisse était fausse. allocatedW publie le décidé, pas le commandé — buildTelemetry() publie le plan, applyActionsToAdapters() reçoit le slot en const, et un test attend allocatedW == 3000 sur une borne dont le courant commandé donne 2 990 W. Les niveaux et allocatedW sont donc la même monnaie, et leur somme est une identité exacte — c'est ce qui rend levels[] vérifiable contre un champ qui existe déjà. L'app traitera toute violation comme une incohérence de la box, pas comme un arrondi.

Ce qui reste demandé : ne pas attribuer l'appliqué à un niveau. L'écart vit entre allocatedW et la charge utile de mécanisme (stageW, setpointW, currentA) ; l'adaptateur arrondit une consigne unique et ne sait pas de quel besoin elle venait. Toute répartition serait une fiction — le principe n'a pas bougé, seulement l'endroit où l'écart se trouve.

Et les compteurs de budget comptent le décidé, parce que c'est la valeur qui détermine ce que reçoit la charge suivante. Conséquence d'écran, assumée : le budget d'un cycle peut annoncer 1 400 W pendant que l'installation en tire 1 000 — d'où le bloc « trois nombres » de l'écran 3, qui empêche de lire cet écart comme une erreur de comptage.

R5Le régime est porté par le NIVEAU — ✔ en ligne

Vérifié à la sonde le 2026-09-01 : progress et decision descendent au niveau, et deliveredWh est bien absent sous unmeasurable.

Et le motif publie remainingWh, pas deliveredWh — accepté. Ce n'est pas « une source par fait » qui tranche (on aurait pu retirer deliveredWh de progress) mais ceci : remainingWh n'est pas dérivable sous unmeasurable, et c'est exactement le régime où l'on achète. Un champ qui n'existe que là où on peut le calculer ferait taire l'écran dans le cas qui coûte de l'argent. Sous unmeasurable, remainingWh == targetWh : « 4 000 sur 4 000 » se lit « rien de mesurable », jamais « rien livré ».

progress.regime ∈ measured | estimated | unmeasurable, et deliveredWh absent sous unmeasurable — jamais 0. C'est la même règle que measurement.source = "none", qui nous a déjà servis : un régime publié sépare « pas mesurable » de « rien reçu », et c'est lui qui autorise la barre hachurée plutôt qu'une barre vide.

R6`ECO_FLOOR_MET` interdit sous le régime `unmeasurable`

Une obligation non mesurable peut être servie, jamais annoncée tenue (LM-1009 C1). C'est une garde testable côté moteur — et côté app, la combinaison sera traitée comme une incohérence de la box, affichée comme telle, pas rendue. Le cas est réel dès aujourd'hui : la V2C Trydan ne publie pas sessionEnergy.

R7`decision` legacy conservé, avec le niveau qu'il reflète

Ajoutez decision.level. Sans lui, chaque client réinvente sa propre règle de fusion (« le motif du dernier niveau servi ? du premier refusé ? ») et deux écrans affichent deux motifs différents pour le même cycle. Une clé de plus, et la règle cesse d'être devinée.

R8`DRAW_CAP` publie sa source, et l'app en fait trois phrases

Déjà prévu au DESIGN_10.md §6, on le confirme comme condition d'écran : c'est la source qui décide du texte, et les trois textes appellent trois gestes différents. Le point de rupture de l'écran 2 est lu sur ce motif, jamais déduit d'un solde tombé à zéro.

Ce dont nous n'avons PAS besoin — et qu'il ne faut pas fabriquer

La précédence des motifs — tranchée (Patrick, 2026-08-29)

Autorisation résiduelle non nulle mais inférieure au plus petit palier du mécanisme : BELOW_MIN_POWER. Les deux motifs sont vrais, mais pas au même niveau — DRAW_CAP dit « il n'y a plus d'autorisation », or ici il en reste, simplement pas au bon format. C'est exactement la distinction posée en +etm19 entre SURPLUS_INSUFFICIENT (« il n'y a rien ») et BELOW_MIN_POWER (« il y en a, mais pas au bon format »), transposée telle quelle au soutirage. Le geste utile est de lire la fiche technique du mécanisme, pas de revoir le plafond.

DRAW_CAP reste réservé à l'autorisation résiduelle nulle. Le point de rupture de l'écran 2 (« autorisation épuisée ici ») est donc bien un DRAW_CAP ; une charge refusée après lui pour cause de palier porterait BELOW_MIN_POWER et ne déplacerait pas le point de rupture. La règle est écrite par le moteur, pas établie de chaque côté.