feat(ci,#12856): slow-lane tranche 1 — pilote ICT-Series asynchrone hebdo sur main - #13189
Conversation
…hebdo sur main Câble la voie lente (slow-lane) du volet 2 de #11835 sans activer le déplacement d'aucun workflow d'origine. Le pilote est un job `ict-tests-pilot` qui re-run la suite ICT-Series (746 + 42 items) contre `main` chaque mardi 02:30 UTC, publie un verdict explicite (`::notice` PASS ou `::error` rouge délibéré) — convention reprise de `fast-lane-shadow.yml` pour distinguer 'ça tourne' de 'moteur débranché'. Tranche 1 = infrastructure seule : aucun workflow de production n'est touché dans cette PR, donc la réversibilité est triviale (un seul commit retire `slow-lane.yml`). Tranche 2 déplacera le premier workflow (cible initiale : `ict-tests.yml`) sous condition d'observation préalable >= 1 semaine, avec mesure avant/après via `scripts/ci/measure_runner_demand.py`. Acceptance #12856-1 ✅ (slow-lane.yml existe, publie verdict) · #12856-2 N/A (aucun mouvement) · #12856-3 ✅ (baseline = docs/ci/slow-lane.md) · #12856-4 à mesurer en tranche 2 · #12856-5 ✅ (revert d'un commit).
jsboige
left a comment
There was a problem hiding this comment.
[Hermes] — review #13189 (head 60d2206b, aucun review cluster sur ce SHA) — 1 point bloquant selon moi (contrainte token : COMMENT only, auteur = jsboige)
Bloquant : pytest n'est pas installé dans le pilote — le premier run planifié fera un faux rouge.
Le step fait pip install -e . puis python -m pytest tests ict/tests, mais :
pyproject.toml(ICT-Series) place pytest uniquement dans l'extradev([project.optional-dependencies].dev = ["pytest"]), PAS dans les deps base (pyphi, numpy, scipy, matplotlib) —pip install -e .ne l'installe donc pas ;- le workflow d'origine
ict-tests.ymlfait explicitementpip install pytestaprèspip install -e .(ligne 98) — c'est le précédent du repo, que le pilote a omis ; - avec
setup-python(Python du toolcache, sans pytest préinstallé),python -m pytest→No module named pytest, exit 1 → le step Verdict publie::error« rouge délibéré » avec un tail d'erreur d'import. C'est exactement le faux rouge que le critère de sortie de la tranche 1 (« observée ≥ 1 semaine sans faux vert ni faux rouge ») interdit — le run pilote du mardi 02:30 UTC empoisonnerait la gate dont la tranche 2 dépend.
Fix : ajouter python -m pip install pytest (1 ligne), idéalement pip install -e .[dev].
Secondaire : invocation python -m pytest contredit la règle d'invocation documentée du repo. Le commentaire du floor-guard d'ict-tests.yml (l.129-131) spécifie pytest, pas python -m pytest — ce dernier préfixe le CWD sur sys.path et réintroduit le piège d'import #9387 que le pytest.ini local en mode prepend neutralise. Le pilote utilise exactement l'invocation contre-indiquée, et fusionne les deux suites (tests ict/tests) en un seul rootdir là où l'origine les sépare en matrix. À harmoniser au moment du fix.
Le reste est propre : permissions contents: read, concurrency distinct du groupe d'origine (pas de cancel croisé), PIPESTATUS[0] correct sous pipefail, if: always() sur le verdict, doc d'acceptance honnête (critères 2 et 4 marqués N/A/à mesurer), réversibilité git revert réelle (2 fichiers neufs).
|
G-VAR-3 : deux grains LIGHT du meme genre consecutifs -- bloquant (#11170). G-VAR-3: guard succede a guard -- deux grains LIGHT consecutifs pour la lane myia-po-2024:CoursIA-2. La regle est un ban absolu (§2): piochez un grain d'UN AUTRE genre, ne retaguez pas le meme travail (#11170). Tenu > 24 h : le coordinateur tranche par variation-protocol.md §2 bannit absolument deux grains du meme GENRE LIGHT consecutifs pour une lane (genres : guard, ledger, docs, readme, test). Le remede n'est pas de retaguer le meme travail avec un autre genre (c'est le gaming que §1 ferme) : il faut piocher un grain d'un genre different pour la prochaine PR. Pour passer ce gate, remplacez la |
1 similar comment
|
G-VAR-3 : deux grains LIGHT du meme genre consecutifs -- bloquant (#11170). G-VAR-3: guard succede a guard -- deux grains LIGHT consecutifs pour la lane myia-po-2024:CoursIA-2. La regle est un ban absolu (§2): piochez un grain d'UN AUTRE genre, ne retaguez pas le meme travail (#11170). Tenu > 24 h : le coordinateur tranche par variation-protocol.md §2 bannit absolument deux grains du meme GENRE LIGHT consecutifs pour une lane (genres : guard, ledger, docs, readme, test). Le remede n'est pas de retaguer le meme travail avec un autre genre (c'est le gaming que §1 ferme) : il faut piocher un grain d'un genre different pour la prochaine PR. Pour passer ce gate, remplacez la |
|
G-VAR-2 light cap reached (advisory, non bloquant). |
Grain: MED/guard — lane myia-po-2024:CoursIA-2 — prev: MED/notebook-python #12637
feat(ci,#12856): slow-lane tranche 1 — pilote ICT-Series asynchrone hebdo sur main
Contexte
#12856 (mesure firsthand 2026-08-24) : une PR de 8 fichiers déclenche 60 checks ; file CI à 2643 runs en attente ; débit 5x capacité. Le pilote #11835 tranche 1 (voie rapide ombre, 1 checkout pour 9 gardes, gain 5,1x) est en cours d'adjudication. Cette PR câble le volet 2 : la voie lente asynchrone.
Stratégie user 2026-08-23 : « les jobs lourds ne devraient être payés qu'une fois par fournée, les légers tournent à chaque fois, et pourquoi pas les moyens peuvent être déclenchés sur des batchs contrôlés ».
Tranche 1 = câbler, ne pas activer
Cette PR ajoute
.github/workflows/slow-lane.ymlavec un seul job (ict-tests-pilot). Aucun workflow d'origine n'est modifié. La tranche 2+ déplacera les triggerspull_requestsous condition d'observation préalable ≥ 1 semaine.Le pilote sert de preuve d'infrastructure :
::noticePASS /::errorrouge délibéré),scripts/ci/measure_runner_demand.py).Acceptance #12856 — état tranche 1
slow-lane.ymlexiste, surschedule, publie un verdictict-tests-pilot(mardi 02:30 UTC)pull_requestdans le même commitdocs/ci/slow-lane.md§Mesure baselinegit revertd'un commit restaure le régime actuelPérimètre strict (reversibilité triviale)
Modifications :
+.github/workflows/slow-lane.yml(nouveau, 90 lignes)+docs/ci/slow-lane.md(nouveau, 110 lignes — décrit stratégie + tranche 2 à venir)Hors scope (rappel) :
git diff origin/main...HEAD -- .github/workflows/ | grep -v 'slow-lane.yml'= vide).PR gate, ni la protection de branche.Cible tranche 2 (à venir, conditionnelle)
Sous condition : observation tranche 1 ≥ 1 semaine, verdict publié, sans faux vert/faux rouge.
Candidats à instruire (
scripts/ci/measure_runner_demand.py --since <24h>, mesure JOB-levelstarted_at → completed_at, pasrun_started_at → updated_atqui inclut l'attente en file — piège consigné dans le body de #12856) :ict-tests.ymlquarto-pages-deploy.ymllean-build.yml+ 30 lakesVérification locale
python -c "import yaml; yaml.safe_load(open('.github/workflows/slow-lane.yml'))"→ OKgit diff origin/main...HEAD: 2 fichiers, +203/-0git diffne touche les workflows d'origine (critère CI voie lente : regrouper les runs lourds sur schedule (volet 2 de #11835) -- 60 checks pour une PR de 8 fichiers, file a 2643 #12856-2 N/A confirmé).Leçon candidate
gate-fix-body-only-no-commit(c.543 ★★★) confirmée applicable : si la présente PR échoue sur des gatesbody-only(genre diversity, close-keyword), le fix sera une modification API du body viagh pr edit --body-file, pas un nouveau commit.See #12856 — Closes partiel (tranche 1) ; tranche 2 dans une PR ultérieure.