[37] Ajout prévision et branchement front #185

Merged
marvin merged 6 commits from justine/37-inference-prevision-servie into develop 2026-09-08 09:17:33 +00:00
Member

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

  • Un pair a relu et laissé un commentaire, même court
  • Ses remarques sont traitées, ou une réponse explique pourquoi elles ne le sont pas

Ce qui suit le code

  • docs/adr/ complété — l'ADR 0013 laissait trois points « au #37 » : le journal qui fait foi, où vit l'antériorité, le seuil du signal. Ils y sont inscrits. La fiche reste proposée, à accepter par Justine et Olivier.

(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é

  1. 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.

  2. 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.

  3. 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.

  4. 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.

  5. 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é.

  6. 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.

### 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 - [x] Un pair a relu et laissé un commentaire, même court - [x] Ses remarques sont traitées, ou une réponse explique pourquoi elles ne le sont pas Ce qui suit le code - [x] docs/adr/ complété — l'ADR 0013 laissait trois points « au #37 » : le journal qui fait foi, où vit l'antériorité, le seuil du signal. Ils y sont inscrits. La fiche reste proposée, à accepter par Justine et Olivier. (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é 1. 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. 2. 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. 3. 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. 4. 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. 5. 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é. 6. 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.
[37] Ajout prévision et branchement front
All checks were successful
Intégration / Contrôles statiques du dépôt (pull_request) Successful in 6s
Intégration / Workflows — lint et audit de sécurité (pull_request) Successful in 24s
Intégration / Tableau de bord — dépendances, tests et construction (pull_request) Successful in 38s
Infra Ansible / Playbooks Ansible valides (pull_request) Successful in 1m7s
Intégration / Python — qualité, tests et dépendances (pull_request) Successful in 6m10s
52d16f8376
justine self-assigned this 2026-09-08 08:53:02 +00:00
Merge branch 'develop' into justine/37-inference-prevision-servie
All checks were successful
Intégration / Tableau de bord — dépendances, tests et construction (pull_request) Successful in 39s
Intégration / Contrôles statiques du dépôt (pull_request) Successful in 7s
Intégration / Workflows — lint et audit de sécurité (pull_request) Successful in 18s
Infra Ansible / Playbooks Ansible valides (pull_request) Successful in 1m4s
Intégration / Python — qualité, tests et dépendances (pull_request) Successful in 5m57s
cbe04ac43f
[37] fix path packages/contract
Some checks failed
Intégration / Tableau de bord — dépendances, tests et construction (pull_request) Successful in 40s
Intégration / Contrôles statiques du dépôt (pull_request) Successful in 7s
Intégration / Workflows — lint et audit de sécurité (pull_request) Successful in 18s
Intégration / Python — qualité, tests et dépendances (pull_request) Has been cancelled
Infra Ansible / Playbooks Ansible valides (pull_request) Has been cancelled
96e0a8c71a
Merge remote-tracking branch 'origin/develop' into justine/37-inference-prevision-servie
Some checks failed
Intégration / Python — qualité, tests et dépendances (pull_request) Has been cancelled
Intégration / Tableau de bord — dépendances, tests et construction (pull_request) Has been cancelled
Intégration / Contrôles statiques du dépôt (pull_request) Has been cancelled
Intégration / Workflows — lint et audit de sécurité (pull_request) Has been cancelled
Infra Ansible / Playbooks Ansible valides (pull_request) Has been cancelled
661d8c1451
# Conflicts:
#	infra/ansible/group_vars/all/vars.yml
Merge branch 'develop' into justine/37-inference-prevision-servie
All checks were successful
Intégration / Contrôles statiques du dépôt (pull_request) Successful in 9s
Intégration / Tableau de bord — dépendances, tests et construction (pull_request) Successful in 36s
Intégration / Workflows — lint et audit de sécurité (pull_request) Successful in 18s
Infra Ansible / Playbooks Ansible valides (pull_request) Successful in 1m31s
Intégration / Python — qualité, tests et dépendances (pull_request) Successful in 6m2s
557fce3554
Merge branch 'develop' into justine/37-inference-prevision-servie
All checks were successful
Intégration / Tableau de bord — dépendances, tests et construction (pull_request) Successful in 38s
Intégration / Contrôles statiques du dépôt (pull_request) Successful in 9s
Intégration / Workflows — lint et audit de sécurité (pull_request) Successful in 20s
Infra Ansible / Playbooks Ansible valides (pull_request) Successful in 1m37s
Intégration / Python — qualité, tests et dépendances (pull_request) Successful in 5m38s
1c8a967bb6
marvin approved these changes 2026-09-08 09:17:20 +00:00
marvin left a comment

Je valide la pr, rien n'ajouter

Je valide la pr, rien n'ajouter
marvin merged commit 5c8a3b752c into develop 2026-09-08 09:17:33 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
2 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
g2/enervision!185
No description provided.