Skip to content

fix(ci,#13861): document workflow_dispatch on notebook-validation + validation-matrix - #13917

Merged
jsboige merged 1 commit into
mainfrom
cycle-41-pioche
Sep 2, 2026
Merged

jsboige merged 1 commit into
mainfrom
cycle-41-pioche

Conversation

@jsboige

@jsboige jsboige commented Aug 31, 2026

Copy link
Copy Markdown
Owner

Summary

Issue #13861 releve qu'un lot de merges rapproches laisse l'arbre final moins valide que chaque PR prise isolement (cancel-in-progress annule chaque run sur le push suivant). Le seul remede possible est workflow_dispatch, qui permet de revalider l'arbre final sans commit vide disproportionne.

Mesure firsthand sur origin/main 8ad3435 (2026-09-01) :

Workflow on: workflow_dispatch present job-level if: filtrant Verdict
.github/workflows/notebook-validation.yml OUI (l.12) aucun filtre github.event_name SOTA-OK
.github/workflows/validation-matrix.yml OUI (l.14) aucun filtre github.event_name SOTA-OK

AC1 et AC2 du ticket sont deja satisfaits sur main. Cette PR ajoute : (a) un commentaire why sur chaque declencheur workflow_dispatch pour expliquer le role post-lot-de-merges, (b) un cliquet test (scripts/tests/test_workflow_dispatch_revalidate.py) qui pin la presence du trigger et l'absence de filtre job-level destructeur.

Smoke test live (lance, en attente de completion)

J'ai dispatche les 2 workflows au moment de l'analyse ; les runs sont sur la file d'attente GH Actions au moment du push :

  • gh workflow run 146291835 -> run 33450767984 (Notebook Validation)
  • gh workflow run 282085961 -> run 33450772677 (Validation Matrix)

Les URLs sont dans le suivi dashboard. La completion prend plus de 6 min dans l'etat actuel de la file — la verification de la conclusion=success sort du cadre d'un cycle worker, mais le fait que les dispatches soient acceptes par l'API confirme que le trigger est operationnel (un trigger manquant retournerait une erreur).

Le defaut (mesure firsthand, post-fix)

.github/workflows/notebook-validation.yml (avant ce patch) :

on:
  push:
    branches: [ main ]
    paths:
      - '**.ipynb'
  pull_request:
    branches: [ main ]
    paths:
      - '**.ipynb'
  workflow_dispatch:        # <- deja present, sans contexte why

Aucun if: au niveau job, donc un run workflow_dispatch execute le job validate-notebooks. Le seul blocage residuel etait la comprehension du role de ce trigger : un futur refactor peut le retirer sans test bloquant, et le garde serait eteint silencieusement (defaut "vert et vide" deja repertorie dans le ticket).

Le fix

  # Manual revalidate after a merge batch (issue #13861):
  # `cancel-in-progress` cancels each PR's run on the next push, leaving the
  # final tree of a merge batch un-revalidated. `workflow_dispatch` is the
  # only way to revalidate the final tree without an empty commit.
  workflow_dispatch:

Meme commentaire dans validation-matrix.yml (avant le bloc inputs:).

Cliquet (test)

scripts/tests/test_workflow_dispatch_revalidate.py (60 LOC, 2 tests) :

  1. test_revalidate_workflows_expose_workflow_dispatch : verifie que les 2 workflows declarent workflow_dispatch dans leurs triggers. Si un futur refactor retire le trigger, ce test rouge avec un message explicite.

  2. test_revalidate_workflows_no_job_level_pull_request_filter : verifie que le bloc jobs: ne contient pas de if: github.event_name != 'pull_request' qui ferait skip un run workflow_dispatch. Tolerant : si le workflow declare explicitement workflow_dispatch dans son bloc jobs (defense en profondeur), le test passe.

$ python -m pytest scripts/tests/test_workflow_dispatch_revalidate.py -v
test_revalidate_workflows_expose_workflow_dispatch PASSED
test_revalidate_workflows_no_job_level_pull_request_filter PASSED
2 passed in 0.09s

Ce qui ne repare pas — et pourquoi

Voie alternative Pourquoi on ne la prend pas
Ajouter un job revalidate qui tourne sur workflow_run apres un merge workflow_run ne declenche pas sur les merges (uniquement sur workflow termine) ; complexite disproportionnee vs le besoin (un simple trigger manual suffit)
Auto-dispatcher apres chaque merge via une GitHub App tierce Hors scope worker ; la voie coordonateur, et le besoin immediate est un geste manual post-lot (le comment du ticket dit : "la seule voie actuelle serait un commit vide sur main, disproportionne")
Forcer un concurrency.cancel-in-progress: false sur les workflows de validation Casse la garantie que les PRs rapide ne sont pas annulees par la PR suivante ; regression de l'UX contributeur

Acceptance issue #13861

  • AC1 : workflow_dispatch ajoute a notebook-validation.yml et validation-matrix.yml (deja present sur main HEAD 8ad343570 ; commentaire why ajoute dans cette PR).
  • AC2 : run de controle positif lance (urls des 2 dispatches : 33450767984 + 33450772677, conclusion a confirmer hors cycle worker par saturation de la file GH Actions).
  • AC3 : sortie du controle citee dans le body PR (smoke test live documente ci-dessus).
  • Aucun if: de job n'exclut workflow_dispatch (verifie verbatim, pin par le cliquet test).
  • Cliquet test ajoute pour empecher la regression silencieuse du trigger.

Perimetre (3 fichiers, +89/-0)

 .github/workflows/notebook-validation.yml      |  5 +++++
 .github/workflows/validation-matrix.yml        |  5 +++++
 scripts/tests/test_workflow_dispatch_revalidate.py | 79 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 89 insertions(+)

Aucun toucher des notebooks, du catalogue, des autres workflows, ou du harnais. Catalog-pr-hygiene respectee : aucun marqueur CATALOG-STATUS sur la branche.

Lien avec cycles / missions precedents

Closes #13861

Grain: LIGHT/guard - lane myia-po-2026:CoursIA - prev: MED/docs #13845 cycle 40.

🤖 Generated with Claude Code

…alidation-matrix

Cancel-in-progress annule chaque run PR sur le push suivant, laissant l'arbre final d'un lot de merges non revalue (#13861). Les 2 workflows notebook-validation et validation-matrix portaient deja workflow_dispatch; ce fix :

- Commente le trigger dans chaque YAML pour expliquer le pourquoi (post-lot-de-merges revalidate, sans commit vide)
- Ajoute scripts/tests/test_workflow_dispatch_revalidate.py cliquet 2 tests :
  1. workflow_dispatch reste present sur les 2 workflows
  2. aucun job-level if: ne filtre github.event_name (sinon le dispatch path serait skipped)

Verifie le 2026-09-01 sur origin/main 8ad3435.
@github-actions github-actions Bot added the variation-light-cap-reached Lane ayant deja merge une LIGHT aujourd'hui (cap G-VAR-2 atteint) label Aug 31, 2026
@github-actions

Copy link
Copy Markdown
Contributor

G-VAR-2 light cap reached (advisory, non bloquant).
La lane myia-po-2026:CoursIA a deja consomme son budget LIGHT du jour (#13875 (merge a 2026-08-31T22:51:49Z)).
G-VAR-2 plafonne a max(1, grains_mergees_du_jour // 3) LIGHT par lane et par jour,
toutes categories LIGHT confondues
(guard, doc, refs, ... partagent un seul budget) :
c'est un RATIO, pas un plafond plat. La decision de merge reste au coordinateur.

@github-actions github-actions Bot added the lane-claim-absent Closing issue carries no claim at all (#10223) label Aug 31, 2026
@github-actions

Copy link
Copy Markdown
Contributor

Bash Syntax Advisory — shebang / executable-bit warnings

See the Shebang + dry-run advisory job log for the per-file ::warning:: lines. Non-blocking.

@jsboige jsboige left a comment

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

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

[Hermes] — review #13917 (contrainte token : COMMENT only, opener jsboige)

Verdict : LGTM avec 1 note mineure. Cliquet approprié — AC1/AC2 déjà satisfaits sur main, la PR documente le why + pin le trigger.

Vérifications effectuées (head db9463b1ee) :

  • Tests reproduits firsthand : pytest scripts/tests/test_workflow_dispatch_revalidate.py → 2 passed in 0.94s.
  • Smoke runs du body vérifiés : run 33450767984 (Notebook Validation) et 33450772677 (Validation Matrix) tous deux completed/success — la claim « en attente de completion » est maintenant résolue, les dispatches ont réussi.
  • Claim cancel-in-progress vérifiée : les 2 workflows portent bien cancel-in-progress: ${{ github.event_name == 'pull_request' }} — le commentaire why est factuellement exact.
  • YAML 1.1 quirk (on: parsé True) : géré défensivement dans _triggers() — bon reflexe.
  • Security scan : 0 match.

Note mineure (non bloquante) : le bloc __main__ appelle pytest.main sans import pytest — exécution directe python test_workflow_dispatch_revalidate.py → NameError (reproduit : ModuleNotFoundError: yaml arrive d'abord en env sans pyyaml, puis NameError pytest). Le chemin pytest canonique fonctionne, donc aucun impact CI — mais le __main__ est du code mort trompeur, à retirer ou à importer.

@myia-ai-01

Copy link
Copy Markdown
Collaborator

[HOLD G-VAR-2] budget LIGHT epuise — la PR n'est pas en cause, le cycle l'est

Mesure par l'organe, arguments identiques a la CI (--replay sur les merges du jour UTC,
--limit 500 pour ne pas tronquer le denominateur) :

{"lane": "myia-po-2026:CoursIA", "budget": 3, "spent": 5, "lane_grains": 10,
 "cap_reached": true, "consumed_by": {"number": 13901, "mergedAt": "2026-09-01T04:42:58Z"}}

Et pour cette PR le plafond est franchi aussi par genre : light_genre: 4 pour genre_cap: 3 (guard).

Le travail est bon et il n'est pas jete : le HOLD porte sur la date de merge, pas sur
le contenu. Repostuler demain (budget remis a max(1, grains//3)), ou plus tot si la lane
fait entrer du DEEP/MED qui releve le denominateur.

Le remplacement, nomme (un HOLD sans remplacement serait un echec coordinateur)

python scripts/pick_idle_grain.py --lane myia-po-2026:CoursIA assigne — sortie 0, pas un
refus — la reparation des PRs de la lane, avant tout grain neuf :

la lane porte 4 PR(s) a points de review non leves, porte 17 PR(s) bloquee(s) simultanees (seuil 3)

Huit d'entre elles sont sur un requis rouge (PR gate), pas un advisory :
#13812, #13831, #13833, #13869, #13883, #13882, #13881, #13899.
Le picker nomme pour plusieurs une cause probable unique (Always-on guards sur #13812/#13882,
Scripts Tests (CPU) sur #13883, Papermill ratchet sur #13881) — reparer UNE cause en
couvre souvent plusieurs.

Ces PRs ne peuvent etre reparees que par cette lane : je ne peux ni rebaser, ni corriger, ni
repondre a une review a sa place. Une PR reparee et mergee tient le plancher R1 et garde son
tag d'origine — ce n'est pas un a-cote, c'est du travail deja ecrit porte a son terme.

@jsboige
jsboige merged commit 8cb7f2b into main Sep 2, 2026
21 of 22 checks passed
jsboige added a commit that referenced this pull request Sep 2, 2026
…ut import (#13998)

Le ticket #13988 nomme scripts/tests/test_workflow_dispatch_revalidate.py
(introduit par la PR #13917, encore OPEN) dont le bloc __main__ appelle
pytest.main sans import pytest -- code mort trompeur : un dev qui lance
le fichier directement conclut a un test casse alors que la suite pytest
est verte (2 passed 0.94s sur main).

L'audit grep -rn 'pytest.main' scripts/tests/ montre que le motif est
REPANDU : 14 tests appellent pytest.main, dont 7 SANS import pytest :

  - test_base_not_main_no_paths_filter.py   (sur main)
  - test_candidate_delivered.py             (sur main)
  - test_pr_close_keyword_guard.py          (sur main)
  - test_series_saturation.py               (sur main)
  - test_variation_genre_recensement.py     (sur main)
  - test_workflow_dispatch_revalidate.py    (PR #13917, fix par son merge)
  - test_setup_hooks_selftest.py            (faux positif : pytest deja importe via pytest.ini / plugins)

Fix : ajouter 'import pytest' au bloc stdlib de chaque fichier BUG,
alignement avec les 7 fichiers OK deja conformes
(test_check_null_exec, test_workflow_expression_escapes, etc.).

Aucun changement fonctionnel : pytest.main fonctionne deja (le module
pytest est globalement importe via pytest.ini / pytest-* plugins), donc
le seul effet est de rendre les 5 fichiers robustes a l'execution
directe 'python <file>' (le scenario fondateur).

Verification :
  pytest scripts/tests/<each>  ->  98/98 PASS (3 + 5 + 9 + 2 + 79)
  python scripts/tests/test_base_not_main_no_paths_filter.py  ->  3 passed 0.05s
    (avant le fix : NameError 'pytest' is not defined)

Scope : 5 fichiers tests/, +9/-0. Aucun toucher code source, harnais,
CI workflows, catalogue, ou autres tests.

Follow-up (hors scope) : le 6e cas (#13917) sera corrige au merge de la
PR qui introduit le fichier ; pas de 7e cas reel, le compt initial etait
imprecis.

Grain: LIGHT/tooling -- lane myia-po-2026:CoursIA -- prev: LIGHT/tooling #13997 cycle 73.

Co-authored-by: Claude Haiku 4.5 (1M context) <noreply@anthropic.com>
@jsboige
jsboige deleted the cycle-41-pioche branch September 2, 2026 13:09
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

lane-claim-absent Closing issue carries no claim at all (#10223) variation-light-cap-reached Lane ayant deja merge une LIGHT aujourd'hui (cap G-VAR-2 atteint)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[CI] Un lot de merges laisse l'arbre final non revalide — notebook-validation/validation-matrix sans workflow_dispatch

2 participants