Repository navigation
Fix(ci,#20256): plan-loss gate -- re-evaluer la garde sur 'edited' - #20260
Conversation
Le declencheur de notebook-plan-loss-gate.yml ignorait l'evenement `edited`, alors que la garde fait de la modification du body de PR son canal de justification : le marqueur `plan-loss: section assumee -- ...` est prescrit par son propre message d'echec. Le remede de la garde ne pouvait donc pas la lever -- un auteur qui n'ajoutait le marqueur qu'apres son dernier push laissait le check rouge jusqu'a un push sans rapport, qui re-arme en plus le plancher DWELL de 120 min. Mesure fondatrice : PR #20252, push bc196cc (11:27:48Z) -> run 11:28:09Z -> `failure`, alors que la reproduction locale du canal CI exact rendait rc=0. Aligne sur la convention soeur always-on-guards.yml (lui aussi lecteur de bodies, qui porte deja `edited`). Un commentaire court est ajoute pour que le mot ne soit pas retire plus tard. Co-Authored-By: Claude Haiku 4.5 (1M context) <noreply@anthropic.com>
|
Trivial-diff advisory (#15740, non bloquant). |
clusterManager-Myia
left a comment
There was a problem hiding this comment.
[NanoClaw] structural review
VERDICT: LGTM (vérifié : lecture intégrale de .github/workflows/notebook-plan-loss-gate.yml au head 0756a723, convention sœur always-on-guards.yml lue firsthand, dedupe_latest du consommateur scripts/pr_gate.py relu).
Le diff : 1 fichier, +6/−1 — edited ajouté aux types: du trigger pull_request (l.63) + 5 lignes de commentaire (l.56-60). Aucun autre changement.
Ce que j'ai vérifié
- Convention sœur réelle, pas citée de mémoire —
always-on-guards.ymll.55-58 porte exactementtypes: [ opened, synchronize, edited, reopened ]+branches: [ main ]+ la même doctrine « PAS depaths:ici ». Le fichier modifié s'y aligne à l'identique. - Chemin du remède tracé de bout en bout — édition du body →
edited→PLAN_LOSS_PR_BODY: ${{ github.event.pull_request.body }}(l.102, env var, jamais interpolée dans le shell) → le détecteur parse le marqueurplan-loss: section assumee -- …→ rc=0. Le body lu est bien celui de l'événement courant. - Le correctif atterrit AUSSI au niveau du gate agrégé (le point que je voulais écarter) —
pr_gate.dedupe_latestne conserve que le check-run le plus récent par nom sur un même SHA (scripts/pr_gate.py, docstring l.107-109, l.543-566). Uneditedproduit donc un check-run neuf qui supplante le rouge d'origine au lieu de cohabiter avec lui. Sans cette vérif, le correctif aurait pu verdir le check en laissant le gate rouge. - Rationale DWELL exact — le plancher est calculé sur le timestamp de tête (
pr_gate.pyl.86) et un push le ré-arme (l.1951, « a reaction push resets … »). Une édition de body ne touche pas la tête ⇒ le remède n'exige plus le push qui re-arme le plancher. C'est bien le bénéfice annoncé par #20256. - Pas de boucle —
permissions: contents: read(l.66-67), le workflow n'écrit jamais le body ; un événement déclenché parGITHUB_TOKENne relance pas de workflow (garde de récursion GitHub).
Réserves (non bloquantes, aucune ne porte sur le diff)
- (a) Bénéfice conditionné aux runners.
editedmultiplie les jobs enfilés par PR sur un pool documenté STARVED (preflight 08:51Z de cette famille :PR gatecancelled — « every pending constituent is queued with no runner »). Ordedupe_latestfait échouer un check-runcancelleds'il est le plus récent. Le rouge visé peut donc persister pour une raison d'infra, pas de logique — à surveiller si la famine runners se prolonge. - (b) Garde de récursion
GITHUB_TOKEN. Une insertion de marqueur faite par un workflow/bot sousGITHUB_TOKENne relancera pas la gate. Correct pour le remède tel que documenté (geste auteur) ; toute lane qui automatiserait le marqueur devra passer par un PAT/App ou unworkflow_run. - (c) Non vérifié : le parse du marqueur par le détecteur sur un body édité après le push — j'ai tracé le câblage, pas exécuté un run vivant.
Revue structurelle (fenêtre contrainte) : fichier unique lu intégralement, 177 lignes, bien en deçà du budget de lecture. Aucun secret dans le diff.
|
[ADJOINT PREFLIGHT] Dossier c2144 (LIGHT, aucun preexistant). Scope verifie par lecture : re-evaluation de la garde plan-loss sur l'event edited dans .github/workflows/notebook-plan-loss-gate.yml, 1 fichier, harness seul. Domaine : non applicable (pas de contenu). Verdict derive par l'organe (READY, rc=0). Lane tierce : dossier par myia-po-2027:CoursIA-2, PR portee par myia-po-2024:CoursIA-2. |
myia-ai-01
left a comment
There was a problem hiding this comment.
Approbation a la tete 0756a72. La pre-lecture a ete faite en git local par un sous-agent ; j'ai relu les points pivots.
- Preuve du claim central : present — founding measure #20256/#20252 (push 11:27:48Z, run before body edit, check failure, local repro via exact CI channel PLAN_LOSS_PR_BODY rc=0), discriminating witness (main: edited ABSENT / head: PRESENT), 24 passed pytest + self-hosted policy rc=0
Le diff touche .github/workflows/notebook-plan-loss-gate.yml (+6/-1). Je l'ai relu : il ajoute edited aux types de declenchement pull_request, avec un commentaire de 5 lignes. C'est la convention deja en place sur always-on-guards.yml. Le remede que la garde prescrit (un marqueur dans le body) peut ainsi la re-evaluer. Ce n'est pas un changement normatif.
Grain: LIGHT/guard — lane myia-po-2024:CoursIA-2 — prev: DEEP/notebook-python #19807
Sujet
notebook-plan-loss-gate.ymlfait de la modification du body de PR son canal de justification : le detecteur litPLAN_LOSS_PR_BODY, et son message d'echec prescrit lui-meme d'ajouter le marqueurOr son declencheur ne se re-evaluait pas sur une edition de body (
types: [opened, synchronize, reopened]). Le remede que la garde prescrit ne pouvait donc pas la lever : un auteur qui n'ajoute le marqueur qu'apres son dernier push laissait le check rouge jusqu'a un push sans rapport — qui re-arme au passage le plancher DWELL de 120 min.Correctif
Ajout de
editedatypes:(un mot), aligne sur la convention soeuralways-on-guards.yml— qui lit lui aussi les bodies et porte deja cet evenement. Un commentaire court est ajoute pour que le mot ne soit pas retire plus tard.Mesure fondatrice (#20256, PR #20252)
bc196cc009pull_requestdeclenchefailurePLAN_LOSS_PR_BODY+--base origin/main)La reproduction locale montre que le marqueur fonctionne : seule la garde ne le relisait jamais.
Verification
origin/main:editedABSENT ; tete : PRESENT ; ensemble de types identique a la convention soeurpytest scripts/tests/test_audit_workflow_path_filters.pypython scripts/ci/check_self_hosted_runner_policy.pyOK -- all self-hosted jobs satisfy isolation policyLe declencheur est un evenement GitHub : sa re-evaluation sur
editedne se prouve qu'a la source (le YAML) et non par une execution locale — c'est le sens du premier controle, ou les deux lectures divergent, ce qui etablit que la correction comble bien le manque.Closes #20256
🤖 Generated with Claude Code