[37] Ajout prévision et branchement front #185
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!185
Loading…
Reference in a new issue
No description provided.
Delete branch "justine/37-inference-prevision-servie"
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?
Ce que ça change
Le job horaire d'inférence charge le modèle promu depuis MLflow, écrit une ligne par site dans public.prevision et signale un dépassement de capacité avant l'heure concernée. Le tableau de bord lit cette table au lieu d'une
prévision inventée dans fixtures.py, par une lecture unique dont les cinq sorties dérivent.
Closes #37
Preuve
Ce que la chaîne ne joue pas : les cas d'intégration, et le comportement du job hors test. L'antériorité de l'EF-08 se démontre sans base ni registre — le refus tombe avant toute lecture.
$ sh -n services/inference/bin/prevoir.sh
lanceur : syntaxe valide
$ python -m inference.job --pour 2026-09-08T05:00:00+00:00
2026-09-08 10:49:28 ERROR inference.job émission refusée : instant visé
2026-09-08T05:00:00+00:00 déjà passé à l'émission (2026-09-08T08:49:28+00:00) :
rien n'est écrit. Une prévision qui ne précède pas l'heure qu'elle vise ne
signale aucun dépassement à temps (EF-08). Pour reconstituer une heure passée,
c'est --rattrapage.
echo?4
$ python -m inference.job --pour 2026-09-08T16:32:00+00:00
inference: --pour hors grain horaire : 2026-09-08T16:32:00+00:00 ne correspond
à aucun seau de public.mesure_horaire
echo?2
$ pytest tests/integration/inference -q
sssssss [100%]
7 skipped in 0.14s
Ce qui n'est PAS prouvé, et reste à faire sur le serveur. Les sept cas se
sautent faute de base. La preuve que le ticket demande — un dépassement sur
données réelles avec l'horodatage du signal, et le relevé de latence sur la
route — se produit là-bas :
ENERVISION_ETL_DATABASE_URL='postgresql://enervision_preprod@127.0.0.1:5433/enervision_preprod' \
pytest tests/integration/inference -v -s
Il faut aussi une passe réelle contre MLflow : c'est le seul maillon que les
doubles ne couvrent pas. Le job sort en code 3 si l'alias production n'est pas
posé.
Relecture
Ce qui suit le code
(Pas de runbook : les gestes d'exploitation sont dans services/inference/README.md, avec le lanceur. Pas de variable dans .env.example : ENERVISION_INFERENCE_* est composée par le lanceur depuis /etc/enervision/postgres.env,
comme ENERVISION_MODEL_* du #36.)
Où regarder en priorité
La nullité de prevision_kw, et ses effets en cascade. C'est le choix qui coûte le plus. Une prévision absente vaut null, jamais zéro — règle du glossaire §2 appliquée à la prévision. D'où marge_kw nullable,
depassement_prevu faux sans prévision, sites_prevus sur la synthèse, et la courbe qui s'arrête au dernier point mesuré. Les écrans afficheront — tant que la passe n'aura pas tourné sur le serveur : il faut la jouer avant le
jury.
Le périmètre est plus large que le ticket. #38 a été fermé sans faire la convergence de l'API ; ce travail n'ayant plus de ticket, il est repris ici. fixtures.py n'invente plus de prévision, et SiteEtat porte la ligne lue.
Marvin devrait voir ce diff : services/api/ et services/dashboard/ sont son terrain.
repository.sites lit la base. Ce module ne le faisait pas. La connexion sert désormais, FakeConn a gagné un curseur, et test_auth_http.py passait la classe en dépendance FastAPI — corrigé en lambda: FakeConn(). Un test
compte les appels au curseur pour garantir une seule lecture par requête.
Deux modifications dans le paquet model (#36). Extraction de donnees.vecteur et protocole PorteurDeRetards dans reference.py. Aucun appelant ni test de #36 ne change. But : une seule définition du vecteur et de la
persistance pour les deux paquets.
L'API n'importe pas PrevisionH1, et c'est délibéré. Le contrat rend reference_kw obligatoire pour arrêter un producteur ; l'opposer à une ligne lue ferait refuser de servir toute ligne antérieure à ce ticket. Le préambule
de packages/contracts affirmait l'inverse — corrigé.
Un trou connu, documenté et figé par un test. Un rattrapage qui prévoit finalement sous la capacité ne retire pas l'alerte déjà écrite. La retirer demanderait d'ouvrir le cycle de vie que la migration 0018 a délibérément
différé. Dites-moi si vous préférez que je le bouche.
Je valide la pr, rien n'ajouter