[37] Correctif job prevision #192

Merged
lenaic merged 3 commits from justine/37-correctif-fenetre-entree into develop 2026-09-08 10:34:44 +00:00
Member

##Ce que ça change

La passe d'inférence exigeait ses 24 retards jusqu'à cible − 1 h, une heure que mesure_horaire ne matérialise jamais à temps (end_offset => 1 hour, dernier seau à 3 h 46 sur le serveur) : 7 sites écartés, 0 ligne, à chaque
passe. La fenêtre d'entrée se borne maintenant sur ce que l'agrégat rend vraiment — elle recule jusqu'à 6 h pour trouver 24 heures consécutives, même chiffre et même cause que FRAICHEUR_MAX de R2 — et journalise le décalage
retenu, par site dans la trace et en maximum dans le résumé.

Closes #37

##Preuve

La zone or telle que le serveur la rend (dernier seau matérialisé à 12:00 pour une cible 16:00), passée dans construire_entrees avec l'ancienne tolérance puis la nouvelle :

site SITE001 non prévu — retard manquant : aucune suite de 24 heures consécutives
avant 2026-09-08T16:00:00+00:00, même en reculant de 0 h — l'heure
2026-09-08T15:00:00+00:00 manque
site SITE002 non prévu — retard manquant : (idem)

tolerance 0 h -> 0 prévisibles, 2 écartés | décalages [] | dernière heure connue []
tolerance 6 h -> 2 prévisibles, 0 écartés | décalages [3, 3] | dernière heure connue
['2026-09-08T12:00:00+00:00', ...]

Le résumé de passe correspondant : … 2 sites prévisibles, 0 écartés, décalage max 3 h (toléré 6 h).

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/runbooks/ mis à jour, un geste d'exploitation a changé
  • docs/adr/ complété, une décision structurante a été prise
  • docs/journal.md complété, un incident a été rencontré
  • Une nouvelle variable d'environnement est apparue, elle est dans .env.example

Où regarder en priorité

Le décalage renomme implicitement les colonnes du modèle. À décalage 3, le modèle reçoit t−4 … t−27 sous les noms retard_1h_kw … retard_24h_kw qu'il a appris. J'ai gardé Entree.retards nominal — le changer ferait lever
model.reference.persistance, qui va chercher le retard 1, et renommerait des colonnes que le modèle enregistré attend. Le décalage vit dans son propre champ et part dans la trace. C'est le compromis du ticket : le modèle est
servi sur des entrées plus vieilles que celles qu'il a apprises, et le seul garde-fou est qu'on le voit.
Deux autres points : tolerance_h est un mot-clé sans défaut (la valeur qui allait de soi était zéro, et c'est elle qui a causé la panne) ; et le décalage se cherche site par site, pour qu'un collecteur muet sur un site ne
vieillisse pas les entrées de tous les autres.

##Ce que ça change La passe d'inférence exigeait ses 24 retards jusqu'à cible − 1 h, une heure que mesure_horaire ne matérialise jamais à temps (end_offset => 1 hour, dernier seau à 3 h 46 sur le serveur) : 7 sites écartés, 0 ligne, à chaque passe. La fenêtre d'entrée se borne maintenant sur ce que l'agrégat rend vraiment — elle recule jusqu'à 6 h pour trouver 24 heures consécutives, même chiffre et même cause que FRAICHEUR_MAX de R2 — et journalise le décalage retenu, par site dans la trace et en maximum dans le résumé. Closes #37 ##Preuve La zone or telle que le serveur la rend (dernier seau matérialisé à 12:00 pour une cible 16:00), passée dans construire_entrees avec l'ancienne tolérance puis la nouvelle : site SITE001 non prévu — retard manquant : aucune suite de 24 heures consécutives avant 2026-09-08T16:00:00+00:00, même en reculant de 0 h — l'heure 2026-09-08T15:00:00+00:00 manque site SITE002 non prévu — retard manquant : (idem) tolerance 0 h -> 0 prévisibles, 2 écartés | décalages [] | dernière heure connue [] tolerance 6 h -> 2 prévisibles, 0 écartés | décalages [3, 3] | dernière heure connue ['2026-09-08T12:00:00+00:00', ...] Le résumé de passe correspondant : … 2 sites prévisibles, 0 écartés, décalage max 3 h (toléré 6 h). ## 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 <!-- Ne cocher que ce qui s'applique, supprimer le reste. --> - [ ] `docs/runbooks/` mis à jour, un geste d'exploitation a changé - [ ] `docs/adr/` complété, une décision structurante a été prise - [ ] `docs/journal.md` complété, un incident a été rencontré - [ ] Une nouvelle variable d'environnement est apparue, elle est dans `.env.example` ## Où regarder en priorité Le décalage renomme implicitement les colonnes du modèle. À décalage 3, le modèle reçoit t−4 … t−27 sous les noms retard_1h_kw … retard_24h_kw qu'il a appris. J'ai gardé Entree.retards nominal — le changer ferait lever model.reference.persistance, qui va chercher le retard 1, et renommerait des colonnes que le modèle enregistré attend. Le décalage vit dans son propre champ et part dans la trace. C'est le compromis du ticket : le modèle est servi sur des entrées plus vieilles que celles qu'il a apprises, et le seul garde-fou est qu'on le voit. Deux autres points : tolerance_h est un mot-clé sans défaut (la valeur qui allait de soi était zéro, et c'est elle qui a causé la panne) ; et le décalage se cherche site par site, pour qu'un collecteur muet sur un site ne vieillisse pas les entrées de tous les autres.
[37] Correctif job prevision
All checks were successful
Intégration / Contrôles statiques du dépôt (pull_request) Successful in 8s
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 39s
Infra Ansible / Playbooks Ansible valides (pull_request) Successful in 1m40s
Intégration / Python — qualité, tests et dépendances (pull_request) Successful in 5m57s
6dbb996768
justine self-assigned this 2026-09-08 10:15:06 +00:00
justine requested review from lenaic 2026-09-08 10:15:15 +00:00
Merge branch 'develop' into justine/37-correctif-fenetre-entree
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 7s
Intégration / Workflows — lint et audit de sécurité (pull_request) Successful in 20s
Intégration / Python — qualité, tests et dépendances (pull_request) Successful in 5m55s
5fae8072ad
Merge branch 'develop' into justine/37-correctif-fenetre-entree
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 8s
Intégration / Workflows — lint et audit de sécurité (pull_request) Successful in 18s
Intégration / Python — qualité, tests et dépendances (pull_request) Successful in 5m27s
c971c8a134
lenaic approved these changes 2026-09-08 10:28:34 +00:00
lenaic left a comment

Approuvée. J'ai éprouvé le correctif contre enervision_prod, à l'instant, plutôt que de relire le raisonnement :

instant visé : 2026-09-08 11:00:00+00:00

SITE001   dernier seau 07:00   décalage utilisable : 3
SITE002   dernier seau 07:00   décalage utilisable : 3
SITE003   dernier seau 07:00   décalage utilisable : 3
SITE004   dernier seau 07:00   décalage utilisable : 3
SITE005   dernier seau 07:00   décalage utilisable : 3
SITE006   dernier seau 07:00   décalage utilisable : 3
SITE007   dernier seau 07:00   décalage utilisable : 3

Les sept sites trouvent leurs vingt-quatre heures consécutives à décalage 3, sur une tolérance de 6. La passe écrira, et il reste trois heures de marge pour absorber un cycle de rafraîchissement manqué. À décalage 0, aucun site ne passait : c'est bien la panne structurelle que tu décris, pas un aléa.

Ce qui fait la qualité de ce correctif

retards reste la liste nominale. C'est le point où je m'attendais à trouver le défaut, et il est traité : y écrire les retards effectifs aurait renommé les colonnes que le modèle enregistré attend, et fait lever reference.persistance qui va chercher le retard 1. Le décalage vit à côté, dans son propre champ.

tolerance_h n'a pas de valeur par défaut. C'est la meilleure décision du lot : la valeur qui allait de soi était zéro, et c'est précisément elle qui rendait la passe muette sans que rien dans la signature ne le dise. Chaque appelant nomme maintenant ce qu'il tolère.

Le décalage est tracé, par site et en maximum. Un modèle servi sur t−5t−29 alors qu'il a appris t−1t−24 se dégrade en silence. Le silence est ce que tu refuses, pas le décalage, et c'est la bonne façon de poser le compromis.

Le décalage se cherche site par site. Un site à jour n'est pas puni du retard d'un autre. Ça n'a l'air de rien et ça évite qu'un seul site en panne fasse taire les six autres.

Une chose à surveiller après la mise en production

R1 juge la fraîcheur de la prévision sur l'instant visé, pas sur ses entrées, avec deux heures de tolérance. Une prévision produite à décalage 5 ou 6 restera donc acceptable pour R1 alors qu'elle repose sur des heures nettement plus vieilles. Ce n'est pas un défaut de ce correctif, c'est la limite du découpage, et ta note de config le dit déjà. À regarder si le décalage observé grimpe au-delà de 3.

Rien ne bloque. Dès que la chaîne est verte, elle part en production avec le reste : c'est le dernier point qui empêchait public.prevision de se remplir, et donc EF-07 et EF-08 d'être tenues sur le serveur.

Approuvée. J'ai éprouvé le correctif contre `enervision_prod`, à l'instant, plutôt que de relire le raisonnement : ``` instant visé : 2026-09-08 11:00:00+00:00 SITE001 dernier seau 07:00 décalage utilisable : 3 SITE002 dernier seau 07:00 décalage utilisable : 3 SITE003 dernier seau 07:00 décalage utilisable : 3 SITE004 dernier seau 07:00 décalage utilisable : 3 SITE005 dernier seau 07:00 décalage utilisable : 3 SITE006 dernier seau 07:00 décalage utilisable : 3 SITE007 dernier seau 07:00 décalage utilisable : 3 ``` Les sept sites trouvent leurs vingt-quatre heures consécutives à décalage 3, sur une tolérance de 6. **La passe écrira**, et il reste trois heures de marge pour absorber un cycle de rafraîchissement manqué. À décalage 0, aucun site ne passait : c'est bien la panne structurelle que tu décris, pas un aléa. ## Ce qui fait la qualité de ce correctif **`retards` reste la liste nominale.** C'est le point où je m'attendais à trouver le défaut, et il est traité : y écrire les retards effectifs aurait renommé les colonnes que le modèle enregistré attend, et fait lever `reference.persistance` qui va chercher le retard 1. Le décalage vit à côté, dans son propre champ. **`tolerance_h` n'a pas de valeur par défaut.** C'est la meilleure décision du lot : la valeur qui allait de soi était zéro, et c'est précisément elle qui rendait la passe muette sans que rien dans la signature ne le dise. Chaque appelant nomme maintenant ce qu'il tolère. **Le décalage est tracé, par site et en maximum.** Un modèle servi sur `t−5` … `t−29` alors qu'il a appris `t−1` … `t−24` se dégrade en silence. Le silence est ce que tu refuses, pas le décalage, et c'est la bonne façon de poser le compromis. **Le décalage se cherche site par site.** Un site à jour n'est pas puni du retard d'un autre. Ça n'a l'air de rien et ça évite qu'un seul site en panne fasse taire les six autres. ## Une chose à surveiller après la mise en production R1 juge la fraîcheur de la prévision sur l'instant visé, pas sur ses entrées, avec deux heures de tolérance. Une prévision produite à décalage 5 ou 6 restera donc acceptable pour R1 alors qu'elle repose sur des heures nettement plus vieilles. Ce n'est pas un défaut de ce correctif, c'est la limite du découpage, et ta note de config le dit déjà. À regarder si le décalage observé grimpe au-delà de 3. Rien ne bloque. Dès que la chaîne est verte, elle part en production avec le reste : c'est le dernier point qui empêchait `public.prevision` de se remplir, et donc EF-07 et EF-08 d'être tenues sur le serveur.
lenaic merged commit d395799b31 into develop 2026-09-08 10:34:44 +00:00
lenaic deleted branch justine/37-correctif-fenetre-entree 2026-09-08 10:34:44 +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!192
No description provided.