Constat
notebook-plan-loss-gate.yml fait de la modification du body de PR son canal de justification. Le detecteur lit le body via l'env var PLAN_LOSS_PR_BODY (l.97), et son message d'echec instruit explicitement l'auteur d'ajouter un marqueur :
add a per-section marker in the PR body: plan-loss: section assumee -- <notebook> section: <titre_normalise> : <raison>
Or son declencheur ne se re-evalue pas sur une edition de body :
pull_request:
branches: [ main ]
types: [ opened, synchronize, reopened ] # <- pas d'`edited`
Consequence : le remede que la garde prescrit elle-meme ne peut pas la lever. Un auteur qui n'ajoute le marqueur qu'apres le dernier push laisse le check rouge jusqu'a un push sans rapport — qui re-arme au passage le plancher DWELL de 120 min.
Mesure (2026-10-10, PR #20252)
| Fait |
Valeur |
push de bc196cc009 |
11:27:48Z |
run declenche (pull_request) |
11:28:09Z — donc avant l'edition du body |
| verdict du check-run |
failure (LOST_SECTION) |
reproduction locale, canal CI exact (PLAN_LOSS_PR_BODY + --base origin/main) |
rc=0, LOST_SECTION_JUSTIFIED_BY_BODY x2 |
La reproduction locale montre que le marqueur fonctionne : seule la garde ne l'a jamais relu.
Convention soeur deja etablie dans le depot
always-on-guards.yml, qui consomme lui aussi les bodies de PR, inclut edited :
types: [ opened, synchronize, edited, reopened ]
Le fichier plan-loss est donc une deviation, pas un choix.
Le paradoxe est d'autant plus net que l'en-tete de notebook-plan-loss-gate.yml affirme la discipline inverse :
PAS de paths: ici : un seul evenement manquant = la garde ne protege rien.
Correctif
Ajouter edited a types: (un mot). Les corps de PR sont deja lus par la garde : c'est le declencheur qui manque, pas le canal.
Portee
Toute PR dont la justification d'une suppression de section passe par un marqueur de body — c'est-a-dire la seule voie prevue pour une suppression intentionnelle. #14532 a concu ce canal ; ce correctif le rend utilisable.
Sans parent : le tracker de conception #14532 est CLOSED, ce finding est un correctif de declencheur sans suite de scope.
Constat
notebook-plan-loss-gate.ymlfait de la modification du body de PR son canal de justification. Le detecteur lit le body via l'env varPLAN_LOSS_PR_BODY(l.97), et son message d'echec instruit explicitement l'auteur d'ajouter un marqueur :Or son declencheur ne se re-evalue pas sur une edition de body :
Consequence : le remede que la garde prescrit elle-meme ne peut pas la lever. Un auteur qui n'ajoute le marqueur qu'apres le dernier push laisse le check rouge jusqu'a un push sans rapport — qui re-arme au passage le plancher DWELL de 120 min.
Mesure (2026-10-10, PR #20252)
bc196cc009pull_request)failure(LOST_SECTION)PLAN_LOSS_PR_BODY+--base origin/main)LOST_SECTION_JUSTIFIED_BY_BODYx2La reproduction locale montre que le marqueur fonctionne : seule la garde ne l'a jamais relu.
Convention soeur deja etablie dans le depot
always-on-guards.yml, qui consomme lui aussi les bodies de PR, inclutedited:Le fichier plan-loss est donc une deviation, pas un choix.
Le paradoxe est d'autant plus net que l'en-tete de
notebook-plan-loss-gate.ymlaffirme la discipline inverse :Correctif
Ajouter
editedatypes:(un mot). Les corps de PR sont deja lus par la garde : c'est le declencheur qui manque, pas le canal.Portee
Toute PR dont la justification d'une suppression de section passe par un marqueur de body — c'est-a-dire la seule voie prevue pour une suppression intentionnelle. #14532 a concu ce canal ; ce correctif le rend utilisable.
Sans parent : le tracker de conception #14532 est CLOSED, ce finding est un correctif de declencheur sans suite de scope.