Question de l'agent app, relayant Patrick : « si je veux que l'énergie aille
d'abord dans l'eau chaude, et seulement ensuite dans la batterie, je fais
comment ? » Réponse : aujourd'hui il ne peut pas, et la réponse est OUI.
Les quatre constats de l'app sont exacts, revérifiés indépendamment. Et le
contrat attendait déjà cette charge : OPTIMIZER_PROTOCOL décrit
adapter:"battery" dans loads[], LoadAction porte le kind Constraint avec
Permission{Allow,Forbid} et Source{Solar,GridSource}, et SurplusBattery déclare
reserveSocPercent / maxChargeW / maxDischargeW — trois champs qu'aucun code ne
lit. domain:"battery" accepté sans effet n'est donc pas une question effleurée,
c'est le reliquat visible d'une place réservée. La note dit sous quelle forme 3f
la remplit.
Les quatre points, tranchés :
(a) Le double commandeur ne se devine pas : il se MESURE. Le plugin SunSpec
écrit, relit et compare, et son commentaire nomme le cas exact — « another
controller overwriting the setpoints ». Le résultat sort dans controlHealthy,
déjà déclaré par la classe du banc. Trois exigences en découlent, dont
celle-ci : controlHealthy == false doit SORTIR de l'arbitrage comme
available == false le fait déjà, sinon c'est le trou de pluggedIn à nouveau.
(b) batteryLevelConsideration et le rang ne sont pas concurrents par nature —
ils le sont par accident d'implémentation. Le seuil agit aujourd'hui comme
un rang absolu ; quand la batterie sera rangée, il perd ce rôle et ne garde
que celui de plancher. Le mouvement a commencé en 3g-1 avec le défaut passé
de 0,9 à 0,2, précisément parce que 0,9 confondait cible et réserve.
(c) La sûreté : « ne pas charger » et « décharger » sont deux gestes que le mot
unique cachait. Le premier ne vide rien et c'est la demande de Patrick ; le
second est déjà refusé par le budget, quel que soit le niveau. Un rang ne
fait jamais descendre un SOC, il décide de ce qui le fait monter.
(d) Le signe : l'inquiétude tombe. Charger une batterie, c'est consommer — au
compteur c'est indistinguable d'un chauffe-eau, donc allocatedW se
réconcilie sans traitement particulier. Le sens opposé n'apparaît qu'à la
décharge, et une décharge n'est pas une allocation : c'est une source, elle
appartient au revenu du budget. Règle : allocatedW d'une batterie est
toujours ≥ 0.
La règle Rules.* écartée par l'app l'est pour la bonne raison, et la note le
confirme : ce serait un second commandeur sans arbitre, pire que celui de 3g-2
puisqu'il vivrait hors du moteur, donc hors du journal.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017TVywtayEeoRJ2yWUW4iZj