[39] Recommandations : les trois règles du #153 #154
No reviewers
Labels
No labels
Compat/Breaking
EC01
EC02
EC03
EC04
EC05
EC06
Kind/BDD
Kind/Back
Kind/Bug
Kind/CICD
Kind/Cloud
Kind/Contenu
Kind/Data
Kind/Documentation
Kind/Enhancement
Kind/Feature
Kind/Front
Kind/IA
Kind/Infra
Kind/Monitoring
Kind/Security
Kind/Testing
Portée/Post-jury
Priority
Critical
Priority
High
Priority
Low
Priority
Medium
Reviewed
Confirmed
Reviewed
Duplicate
Reviewed
Invalid
Reviewed
Won't Fix
Status
Abandoned
Status
Blocked
Status
Need More Info
ops/alerte
No milestone
No project
No assignees
2 participants
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
g2/enervision!154
Loading…
Reference in a new issue
No description provided.
Delete branch "lenaic/39-regles-recommandations"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Ferme #39, et applique le #153.
Gabriel a écrit le ticket de spécification pendant que j'écrivais la mécanique :
pour chacune des trois règles, l'observation, la fenêtre, la condition exacte, la
phrase rendue et l'action. Rien n'est inventé ici.
Le contrat d'entrée colle au schéma, pas à mon idée du schéma
Les champs reprennent les colonnes réelles des migrations :
valeur_prevue_kwdeprevision(0011),moyenne_kwdemesure_horaire(0016),taux_disponibilitede
qualite_jour(0013),capacite_kwdu référentiel (0008). Le #153 restreintles sources à la zone or, ni argent ni bronze.
Les règles ne vont pas chercher leurs données, on les leur apporte. Sans ça,
trois règles liraient la même grandeur de trois façons.
Trois verdicts, et non deux
Une règle rend un déclenchement, un silence, ou une indécision en nommant ce
qui lui a manqué.
Sans le troisième, « je n'ai pas les données » et « tout va bien » rendent la
même chose, et un site muet passe pour un site sain. R2 en est l'exemple :
deux heures de mesure ne permettent pas de juger d'une persistance sur trois, et
se taire laisserait croire que la charge est normale.
Le cycle de vie, et la décision qui le gouverne
cycle.rapprocherconfronte les recommandations actives à ce qu'une passe vientde produire, et dit quoi ouvrir, quoi garder, quoi résoudre. L'état ne vit pas
ici, la persistance appartient à l'appelant.
On ne résout que sur un silence, jamais sur une indécision. Une règle qui n'a
pas pu juger ne prouve pas que le problème a disparu ; résoudre annoncerait
« c'est réglé » alors qu'on n'a pas regardé. Le moteur enregistre donc les
silences, distincts des indécisions.
L'identité d'une recommandation active est le couple site et règle, pas la
version : recaler un seuil ne doit ni fermer ni rouvrir ce qui est en cours.
Les seuils se changent sans toucher à la mécanique
Chacun vit dans une constante
SEUILen tête de son module. Le #153 les annoncecomme des valeurs de départ à recaler après 24 à 48 h de données réelles : les
changer coûte un nombre et un incrément de correctif de version.
Éprouvé
90 cas, couverture à 100 % sur 269 instructions, pour un palier exigé à 85 %.
ruffetmypystrict propres.Dont la preuve que demande le #153 : un parc de quatre sites produit exactement
trois recommandations, une par règle, le quatrième site restant muet. Et un site
sans zone or rend trois indécisions au lieu de passer pour sain.
Les bornes sont éprouvées des deux côtés : 90 % pile déclenche R1 (« >= » dans le
ticket), 80 % pile ne déclenche pas R3 (« < » dans le ticket).
Deux écarts entre la spécification et le schéma existant
À trancher, et je ne les ai pas tranchés seul. Détail en commentaire du #153.
qualite_jour(migration 0013) n'a pas de colonnereleves_imputes: elle portereleves_manquantset unrepartition_methodeen jsonb. Le contrat expose lechamp, la requête qui l'alimente devra le tirer du jsonb.
La table
recommandation(migration 0014) n'a ni colonne de statut, niresolved_at, ni champ d'action : seulementlibelle. Et sa contrainted'unicité,
(site_id, horodatage, regle_id, regle_version), décrit un rejeuidempotent par horodatage, ce qui n'est pas le même modèle qu'une recommandation
qui s'ouvre une fois et se referme plus tard. Le rapprochement est prêt côté
code ; la persistance demande une décision de schéma.
Un choix d'emplacement à valider
La chaîne attendait ces règles dans
services/api/enervision_api/rules, déclaréen zone sensible depuis le #40. Le module vit ailleurs : les règles n'ont besoin
de rien de l'API, et les y enfermer obligerait à monter l'API pour les éprouver.
Le #39 met de toute façon l'affichage hors périmètre.
Les tests, eux, sont bien dans
tests/unit/rules/, chemin que le #153 nomme.Si l'équipe préfère l'autre emplacement pour le module, le déplacement coûte un
git mv.[39] Recommandations : la mécanique des règles, sans les règlesto [39] Recommandations : les trois règles du #153Relu #154 en entier — mécanique, règles et cycle de vie sont solides, rien à redire sur le fond. Prêt à merger côté code.
Le point bloquant (schéma
recommandation) est réglé sur #153 : Olivier a validé, ticket de suivi #164 ouvert pour la migration.cycle.rapprochern'en dépend pas pour merger, il est déjà écrit et éprouvé pour recevoir la persistance une fois #164 fermé.Deux points encore ouverts, non bloquants :
services/recommendationsvsservices/api/enervision_api/rules(zone sensible depuis #40). La PR propose ungit mvsi l'équipe préfère l'autre emplacement : à trancher.valeursde R1/R2 utilise la clécapacity_kw(anglais) alors que R3 et le reste du contrat (Observation, motifs) utilisentcapacite_kw(français). Sans impact fonctionnel, mais maintenant figé dans les tests : à corriger avant que #38 (API) ne s'appuie sur ce contrat, sinon l'incohérence se propage.New commits pushed, approval review dismissed automatically according to repository settings