Skip to content

feat(ci,#12856): slow-lane tranche 1 — pilote ICT-Series asynchrone hebdo sur main - #13189

Merged
myia-ai-01 merged 3 commits into
mainfrom
feature/12856-slow-lane-tranche1
Aug 27, 2026
Merged

myia-ai-01 merged 3 commits into
mainfrom
feature/12856-slow-lane-tranche1

Conversation

@jsboige

@jsboige jsboige commented Aug 27, 2026 •

Copy link
Copy Markdown
Owner

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.yml avec un seul job (ict-tests-pilot). Aucun workflow d'origine n'est modifié. La tranche 2+ déplacera les triggers pull_request sous condition d'observation préalable ≥ 1 semaine.

Le pilote sert de preuve d'infrastructure :

  • le schedule hebdomadaire déclenche un run réel,
  • le verdict est publié (::notice PASS / ::error rouge délibéré),
  • la mesure avant/après est reproductible (scripts/ci/measure_runner_demand.py).

Acceptance #12856 — état tranche 1

# Critère État
1 slow-lane.yml existe, sur schedule, publie un verdict ✅ job ict-tests-pilot (mardi 02:30 UTC)
2 Chaque workflow déplacé perd son trigger pull_request dans le même commit N/A (aucun mouvement en tranche 1)
3 Mesure avant/après documentée ✅ baseline = docs/ci/slow-lane.md §Mesure baseline
4 Contrôle positif obligatoire (≥1 PR témoin où slow-lane rougit) À mesurer en tranche 2
5 git revert d'un commit restaure le régime actuel ✅ aucun fichier d'origine modifié

Pé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) :

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-level started_at → completed_at, pas run_started_at → updated_at qui inclut l'attente en file — piège consigné dans le body de #12856) :

Workflow Runner min mesurés Déplacé en tranche 2 ?
ict-tests.yml à mesurer cible initiale
quarto-pages-deploy.yml à mesurer candidat
lean-build.yml + 30 lakes à mesurer candidat

Vérification locale

Leçon candidate

gate-fix-body-only-no-commit (c.543 ★★★) confirmée applicable : si la présente PR échoue sur des gates body-only (genre diversity, close-keyword), le fix sera une modification API du body via gh pr edit --body-file, pas un nouveau commit.

See #12856 — Closes partiel (tranche 1) ; tranche 2 dans une PR ultérieure.

…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 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 #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'extra dev ([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.yml fait explicitement pip install pytest après pip 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).

@github-actions

Copy link
Copy Markdown
Contributor

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 [G-VAR-3 OVERRIDE] lane myia-po-2024:CoursIA-2 -- next: <genre> (section 3), il ne laisse pas vieillir.

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 prev: par un grain precedent d'un genre different (ou changez le genre du grain courant pour un genre de substance differente) :

Grain: <TIER>/<genre> -- lane <machine:workspace> -- prev: <TIER>/<genre-different> #<PR>

1 similar comment
@github-actions

Copy link
Copy Markdown
Contributor

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 [G-VAR-3 OVERRIDE] lane myia-po-2024:CoursIA-2 -- next: <genre> (section 3), il ne laisse pas vieillir.

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 prev: par un grain precedent d'un genre different (ou changez le genre du grain courant pour un genre de substance differente) :

Grain: <TIER>/<genre> -- lane <machine:workspace> -- prev: <TIER>/<genre-different> #<PR>

@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 27, 2026
@github-actions

Copy link
Copy Markdown
Contributor

G-VAR-2 light cap reached (advisory, non bloquant).
La lane myia-po-2024:CoursIA-2 a deja consomme son budget LIGHT du jour (#? (merge a ?)).
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.

@myia-ai-01
myia-ai-01 merged commit 15e899d into main Aug 27, 2026
35 checks passed
@jsboige
jsboige deleted the feature/12856-slow-lane-tranche1 branch September 2, 2026 13:11
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

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.

2 participants