Repository navigation
fix(ci,#13861): document workflow_dispatch on notebook-validation + validation-matrix - #13917
Conversation
…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.
|
G-VAR-2 light cap reached (advisory, non bloquant). |
Bash Syntax Advisory — shebang / executable-bit warningsSee the |
jsboige
left a comment
There was a problem hiding this comment.
[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) et33450772677(Validation Matrix) tous deux completed/success — la claim « en attente de completion » est maintenant résolue, les dispatches ont réussi. - Claim
cancel-in-progressvérifiée : les 2 workflows portent biencancel-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.
[HOLD G-VAR-2] budget LIGHT epuise — la PR n'est pas en cause, le cycle l'estMesure par l'organe, arguments identiques a la CI ( Et pour cette PR le plafond est franchi aussi par genre : Le travail est bon et il n'est pas jete : le HOLD porte sur la date de merge, pas sur Le remplacement, nomme (un HOLD sans remplacement serait un echec coordinateur)
Huit d'entre elles sont sur un requis rouge ( Ces PRs ne peuvent etre reparees que par cette lane : je ne peux ni rebaser, ni corriger, ni |
…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>
Summary
Issue #13861 releve qu'un lot de merges rapproches laisse l'arbre final moins valide que chaque PR prise isolement (
cancel-in-progressannule chaque run sur le push suivant). Le seul remede possible estworkflow_dispatch, qui permet de revalider l'arbre final sans commit vide disproportionne.Mesure firsthand sur
origin/main8ad3435 (2026-09-01) :on: workflow_dispatchpresentif:filtrant.github/workflows/notebook-validation.ymlgithub.event_name.github/workflows/validation-matrix.ymlgithub.event_nameAC1 et AC2 du ticket sont deja satisfaits sur main. Cette PR ajoute : (a) un commentaire
whysur chaque declencheurworkflow_dispatchpour 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-> run33450767984(Notebook Validation)gh workflow run 282085961-> run33450772677(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=successsort 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) :Aucun
if:au niveau job, donc un runworkflow_dispatchexecute le jobvalidate-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
Meme commentaire dans
validation-matrix.yml(avant le blocinputs:).Cliquet (test)
scripts/tests/test_workflow_dispatch_revalidate.py(60 LOC, 2 tests) :test_revalidate_workflows_expose_workflow_dispatch: verifie que les 2 workflows declarentworkflow_dispatchdans leurs triggers. Si un futur refactor retire le trigger, ce test rouge avec un message explicite.test_revalidate_workflows_no_job_level_pull_request_filter: verifie que le blocjobs:ne contient pas deif: github.event_name != 'pull_request'qui ferait skip un runworkflow_dispatch. Tolerant : si le workflow declare explicitementworkflow_dispatchdans son bloc jobs (defense en profondeur), le test passe.Ce qui ne repare pas — et pourquoi
revalidatequi tourne surworkflow_runapres un mergeworkflow_runne declenche pas sur les merges (uniquement sur workflow termine) ; complexite disproportionnee vs le besoin (un simple trigger manual suffit)concurrency.cancel-in-progress: falsesur les workflows de validationAcceptance issue #13861
workflow_dispatchajoute anotebook-validation.ymletvalidation-matrix.yml(deja present sur main HEAD8ad343570; commentaire why ajoute dans cette PR).33450767984+33450772677, conclusion a confirmer hors cycle worker par saturation de la file GH Actions).if:de job n'exclutworkflow_dispatch(verifie verbatim, pin par le cliquet test).Perimetre (3 fichiers, +89/-0)
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
9675409f31).Closes #13861
Grain: LIGHT/guard - lane myia-po-2026:CoursIA - prev: MED/docs #13845 cycle 40.
🤖 Generated with Claude Code