Skip to content

Fix(ci,#20256): plan-loss gate -- re-evaluer la garde sur 'edited' - #20260

Merged
myia-ai-01 merged 1 commit into
mainfrom
fix/20256-plan-loss-edited-trigger
Oct 10, 2026
Merged

myia-ai-01 merged 1 commit into
mainfrom
fix/20256-plan-loss-edited-trigger

Conversation

@jsboige

@jsboige jsboige commented Oct 10, 2026

Copy link
Copy Markdown
Owner

Grain: LIGHT/guard — lane myia-po-2024:CoursIA-2 — prev: DEEP/notebook-python #19807

Sujet

notebook-plan-loss-gate.yml fait de la modification du body de PR son canal de justification : le detecteur lit PLAN_LOSS_PR_BODY, et son message d'echec prescrit lui-meme d'ajouter le marqueur

plan-loss: section assumee -- <notebook> section: <titre_normalise> : <raison>

Or 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 edited a types: (un mot), aligne sur la convention soeur always-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)

Fait Valeur
push de bc196cc009 11:27:48Z
run pull_request declenche 11:28:09Z — donc avant l'edition du body
verdict du check-run failure
reproduction locale, canal CI exact (PLAN_LOSS_PR_BODY + --base origin/main) rc=0

La reproduction locale montre que le marqueur fonctionne : seule la garde ne le relisait jamais.

Verification

Controle Resultat
Temoin discriminant (meme controle applique aux deux refs) origin/main : edited ABSENT ; tete : PRESENT ; ensemble de types identique a la convention soeur
pytest scripts/tests/test_audit_workflow_path_filters.py 24 passed
python scripts/ci/check_self_hosted_runner_policy.py rc=0 — OK -- all self-hosted jobs satisfy isolation policy

Le declencheur est un evenement GitHub : sa re-evaluation sur edited ne 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

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>
@github-actions github-actions Bot added the trivial-diff-advisory Diff trivial : grain META mecanique sans fournee ni exception ecrite (#15740) label Oct 10, 2026
@github-actions

Copy link
Copy Markdown
Contributor

Trivial-diff advisory (#15740, non bloquant).
genre guard dans la famille META (docs/guard/ledger/readme/test) + diff de 7 lignes changees (<= 100) + aucune exception ecrite dans le body : le litmus de la trivialite (une douzaine d'instances scannees a la suite) est credible. Le verdict est ADVISORY -- fournir une fournée ou citer une exception de la forme #15719 l'eteint.
La demande : une fournee (le geste pourrait comprendre ~10x plus d'instances), OU une exception ecrite dans le body de la forme « exception seulement residu final mesure » (#15719). Editer le body re-deroule cet organe et retire le label.

@clusterManager-Myia clusterManager-Myia left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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

  1. Convention sœur réelle, pas citée de mémoire — always-on-guards.yml l.55-58 porte exactement types: [ opened, synchronize, edited, reopened ] + branches: [ main ] + la même doctrine « PAS de paths: ici ». Le fichier modifié s'y aligne à l'identique.
  2. 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 marqueur plan-loss: section assumee -- … → rc=0. Le body lu est bien celui de l'événement courant.
  3. Le correctif atterrit AUSSI au niveau du gate agrégé (le point que je voulais écarter) — pr_gate.dedupe_latest ne 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). Un edited produit 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.
  4. Rationale DWELL exact — le plancher est calculé sur le timestamp de tête (pr_gate.py l.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.
  5. Pas de boucle — permissions: contents: read (l.66-67), le workflow n'écrit jamais le body ; un événement déclenché par GITHUB_TOKEN ne 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. edited multiplie les jobs enfilés par PR sur un pool documenté STARVED (preflight 08:51Z de cette famille : PR gate cancelled — « every pending constituent is queued with no runner »). Or dedupe_latest fait échouer un check-run cancelled s'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 sous GITHUB_TOKEN ne 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 un workflow_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.

@jsboige

jsboige commented Oct 10, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2027:CoursIA-2
pr: 20260
head: 0756a72
complete: true
body: read
comments-reviewed: 1
reviews-reviewed: 1
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: 3f6dce0880665caf30fb90f8d71188bd5ee2e686eb132c77916aece8c56f8afd
diff-files: 1
diff-additions: 6
diff-deletions: 1
checks: latest-wins-green
b0: clear
scope: pass
domain: not-applicable
verdict: READY
organ: check_adjoint_prevalidation.py
organ-command: python scripts/check_adjoint_prevalidation.py --derive-verdict 20260
organ-rc: 0
[/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 myia-ai-01 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

@myia-ai-01
myia-ai-01 merged commit e43677e into main Oct 10, 2026
27 of 29 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

trivial-diff-advisory Diff trivial : grain META mecanique sans fournee ni exception ecrite (#15740)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

CI: notebook-plan-loss-gate ne se re-declenche pas sur 'edited' -- son propre remede (marqueur de body) ne peut pas le lever

3 participants