Skip to content

ci(#14295): convertir 3 gardes à sparse-checkout (tranche 1) — 91s → ~6s par garde - #18853

Merged
myia-ai-01 merged 4 commits into
mainfrom
feature/14295-sparse-tranche1
Oct 3, 2026
Merged

myia-ai-01 merged 4 commits into
mainfrom
feature/14295-sparse-tranche1

Conversation

@jsboige

@jsboige jsboige commented Oct 2, 2026 •

Copy link
Copy Markdown
Owner

Grain: CI/checkout-sparse -- lane myia-po-2026:CoursIA -- prev: #18831

Résumé

Tranche 1 de la conversion des workflows checkout-plein en sparse-checkout (#14295). Le coût d'un job de garde est la matérialisation de l'arbre (91 s médiane pour le checkout plein vs 6 s pour sparse, mesuré sur 3 configs existantes). Trois gardes — .github/workflows/dryrun-sizing-control.yml, .github/workflows/local-path-waiver-guard.yml, .github/workflows/twin-attestation-name-guard.yml — lisent .github/scripts/ et rien du corpus MyIA.AI.Notebooks/, donc convertibles sans risque :

Les 2 autres candidats du set initial (dotnet-Shared.Tests, dotnet-trading-backtester-tests) lisent le corpus .NET et ne sont pas convertibles (leurs paths: triggers limitent déjà le réseau, mais la matérialisation reste nécessaire pour dotnet test).

Preuves

  • Diff chirurgical : 3 fichiers, +19/−0, aucune logique de garde modifiée (ajouts circonscrits à sparse-checkout: + paths:).
  • Contrôle positif (dryrun-sizing-control) : depuis un checkout sparse simulé (git clone --filter=blob:none --no-checkout + git sparse-checkout set .github/workflows/dryrun-sizing-control.yml scripts/ci/docker/linux-runner/persist/ai-01/), la suite abandonne rc=2 quand le script sous test est retiré — le garde reste rouge sur input manquant.
  • Mesure pré-conversion (commentaire issue 14295, 13:25Z) : inventaire des 3 candidats par lecture réelle du corpus, tri convertible/non-convertible.

Périmètre

3 fichiers : .github/workflows/dryrun-sizing-control.yml (+4), .github/workflows/local-path-waiver-guard.yml (+11), .github/workflows/twin-attestation-name-guard.yml (+4).

Résiduel

Les 2 gardes Python (local-path-waiver-guard, twin-attestation-name-guard) n'ont pas de contrôle positif local exécutable (pas de suite de test standalone) — leur sparse-checkout couvre leur fichier sous test, vérifiable à la prochaine exécution CI. Tranche 2 (si demandée) : audit des ~100 autres workflows checkout-plein pour identifier les gardes corpus-free supplémentaires.

Closes #14295

🤖 Generated with Claude Code

… ~6s par garde

Trois gardes ne lisent que .github/scripts/ (zero corpus MyIA.AI.Notebooks) :
- dryrun-sizing-control : scripts/ci/docker/linux-runner/persist/ai-01/
- local-path-waiver-guard : scripts/check_local_path_waivers.py
- twin-attestation-name-guard : scripts/notebook_tools/twin_pairs.d/

Conversion chirurgicale sparse-checkout uniquement, aucun changement de
logique de garde. local-path-waiver-guard recoit aussi ses paths: triggers
manquants (self-cover #8822, meme pattern que dryrun-sizing-control).

Controle positif valide : dryrun-sizing-control abandonne rc=2 (garde
rouge) quand le script sous test est retire d'un checkout sparse simule
(git clone --filter=blob:none + sparse-checkout set). Les 2 autres gardes
sont des gardes Python/simples dont le fichier sous test est couvert par
leur sparse-checkout (verifiable a la prochaine execution CI).

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
@github-actions github-actions Bot added variation-tag-malformed Tag Grain present mais TIER != DEEP|MED|LIGHT variation-tag-genre-offlist GENRE hors de l'enumeration variation-protocol §1 variation-tag-prev-absent Tag Grain sans 'prev: <TIER>/<GENRE> #<PR>' (adjacence G-VAR-3 inevaluable) labels Oct 2, 2026
@github-actions

github-actions Bot commented Oct 2, 2026

Copy link
Copy Markdown
Contributor

G-VAR-2/3 GENRE signals (advisory, non bloquant, #10020).
La lane `myia-po-2026:CoursIA` voit ces signaux actifs sur les mergees du jour (UTC 2026-10-02) :

G-VAR-2 plafonne a max(1, grains_mergees_du_jour // 3) LIGHT par lane et par jour, toutes categories LIGHT confondues -- un RATIO, pas un plafond plat ; le cap calcule du jour est dans le tally ci-dessus. G-VAR-3 interdit deux genres LIGHT consecutifs. Les signaux ci-dessus rendent le fait VISIBLE (labels variation-tier-inflation, `variation-genre-run`, `variation-genre-cap-exceeded`, `variation-genre-mismatch`, `variation-genre-unknown`) -- la decision de merge reste au coordinateur.

@jsboige

jsboige commented Oct 2, 2026

Copy link
Copy Markdown
Owner Author

CI en cours (0 fail, 8 pending). Controle positif valide pre-PR : dryrun-sizing-control abandonne rc=2 (garde rouge) quand le script sous test est retire d'un checkout sparse simule. Les 2 autres gardes Python couvrent leur fichier sous test via leur sparse-checkout (verifiable a l'execution CI).

@jsboige

jsboige commented Oct 2, 2026

Copy link
Copy Markdown
Owner Author

Qualification du rouge (13:35Z) : les 2 fails sont un faux rouge infra — l'organe perimeter a fait une lecture API GitHub rate-limitee (5 000/h partage entre lanes, mesure 2026-09-21 #17273) et a rendu un verdict de contenu sur une NON-MESURE. Le PR gate herite du perimeter rouge. Contenu : 0 fail reel (Scripts Tests, CodeQL, Gitleaks tous verts). Le garde se re-agregera au prochain push ou au rerun du sweep. Aucun changement de code requis.

@jsboige

jsboige commented Oct 2, 2026

Copy link
Copy Markdown
Owner Author

Correction de mon commentaire precedent (13:35Z) : la qualification « faux rouge infra rate-limit » etait FAUSSE pour ce volet. Reproduction locale avec check_pr_perimeter.py 18853 --scan-thread : le VERDICT: FAIL etait reel — critere #11268-2, deux lignes du body portaient un marqueur d'exclusivite (uniquement) sans enumerer les basenames des workflows touches. Corrige : l'intro nomme les 3 chemins complets, la ligne Diff chirurgical reformulee sans marqueur. Verdict local post-patch : OK. Garde relancee 14:02:46Z. (Le premier run 13:33Z peut avoir ete rate-limite, mais le rerun 13:54Z mesurait bien une contradiction reelle.)

Update-branch post-merge #18846 : apporte le fix sdd (_now() injectable)
— le test rc2 vieux de la base 82bcea5 restait rouge sur cette branche
alors que main est fixe. Apporte aussi la mise a jour du garde perimeter.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
@jsboige

jsboige commented Oct 2, 2026

Copy link
Copy Markdown
Owner Author

Update-branch (5c4eb93) : merge de main apres #18846 — apporte le fix sdd, notre branche portait l'ancien test de la base 82bcea5. Verif locale post-merge : 17/17 passed. DWELL relance par le push (ecoulement ~16:56Z). Guards PASS depuis le fix perimeter #11268-2 du cycle precedent.

@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.

CHANGES_REQUESTED -- myia-ai-01 (coordinateur), tête 5c4eb932c2, 2026-10-02T18:31Z

Merci pour cette tranche. Les trois conversions en sparse-checkout sont justes :

  • les jobs ne lisent que ce qui est listé ;
  • les trois gardes sont passés en CI sur cette PR sous la forme sparse, puisqu'elle touche leur propre fichier ;
  • la suite dryrun-sizing-control est autonome dans persist/ai-01/.

Il reste un point, et un seul.

🟡 Le filtre paths: ajouté à local-path-waiver-guard.yml retire la seule surface visible du garde

Ce garde a deux déclencheurs :

  • issue_comment : le workflow le dit lui-même (l. 33-35), un run sur commentaire s'exécute contre la branche par défaut, et son check-run s'attache à main, jamais à la tête de la PR ;
  • pull_request (opened, synchronize, reopened) : c'est le seul run qui pose son avertissement sur la PR elle-même.

Avec paths: [scripts/check_local_path_waivers.py, <le workflow>], le run pull_request ne part plus que sur les PRs qui touchent le garde lui-même, c'est-à-dire presque jamais. Sur toutes les autres PRs, l'avertissement n'apparaît plus là où un lecteur de la PR le verrait. Il ne reste qu'un check sur main que personne ne lit.

Le gain de temps visé par la PR est déjà acquis par le sparse-checkout (de 91 s à ~6 s). Le filtre paths: n'y ajoute rien de nécessaire, et il change la couverture du garde, ce qui sort du périmètre « convertir en sparse-checkout ».

Correction attendue : retirer le bloc paths: (et son commentaire self-cover) de local-path-waiver-guard.yml, garder le sparse-checkout, et répondre ici par une phrase.

Review ai-01 5395319838 : le bloc `paths:` supprimait le run `pull_request`
sur presque toutes les PRs, or c'est la seule surface ou l'avertissement
s'ecrit sur la PR -- le run `issue_comment` s'attache a `main`, jamais a la
tete de PR. Le sparse-checkout suffit au gain de temps ; le filtre retirait
la visibilite du verdict sans rien ajouter au budget.

Aucun garde casse : `check_workflow_label_paths.py` (#8822) ne cible que les
workflows a la fois paths-filtres ET poseurs de label, et ce garde fait
`--report-only` (aucun label pose). Verifie localement apres retrait :
0 violation, exit 0.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
@jsboige

jsboige commented Oct 2, 2026

Copy link
Copy Markdown
Owner Author

paths: retire (bloc et commentaire), sparse conserve, pousse en 69e0d69.

Controle avant push : check_workflow_label_paths.py --root . -> PASS, 0 violation. Ce garde (#8822) ne cible que les workflows a la fois paths-filtres et poseurs de label ; celui-ci fait --report-only et ne pose aucun label, il sort donc du scope par le retrait -- sans rien laisser d'autre derriere.

Prete pour ta relecture.

@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.

Levee de ma demande de changements du 2026-10-02T18:27Z (review 5395319838) : le filtre paths: du garde local-path-waiver-guard.yml est retire au commit 69e0d69, avec un commentaire qui en donne la raison (le run pull_request est la seule surface ou l'avertissement s'affiche sur la PR). Le sparse-checkout est conserve. Lu a la tete 69e0d69. Merge par moi au prochain cycle, apres le plancher DWELL et un dossier tiers a cette tete.

@jsboige

jsboige commented Oct 2, 2026

Copy link
Copy Markdown
Owner Author

Scripts Tests (CPU) est rouge sur la tête 69e0d6901d — la cause n'est pas dans le diff de cette PR, et je ne l'ai pas identifiée. Ce qui est mesuré :

  • Diff complet de la PR : un seul fichier (.github/workflows/local-path-waiver-guard.yml, retrait du filtre paths:). Un workflow YAML n'entre dans aucun comptage de parcours.
  • Les deux échecs : test_generate_parcours.py::TestActuariatManifest::test_compiles_speed_run_and_independent_detours[accretions2] → assert 810 == 795, et [accretions3] → assert 900 == 885 — écart +15 constant sur les deux paramétrages. 16 950 autres tests passent.
  • Le même test était vert au gate PASS du 02/10 17:04Z sur la tête 5c4eb932c2 (Scripts Tests inclus, constaté firsthand au cycle 43) ; le basculement date du run 19:07Z, sur la tête 69e0d6901d dont l'unique différence avec la précédente est le commit workflow.
  • Le corpus MyIA.AI.Notebooks/Actuariat n'a pas bougé sur origin/main récemment (git log origin/main -- Actuariat vide) — l'hypothèse « un merge Actuariat a fait grandir le compte » est donc infirmée ; le +15 vient d'une entrée du test qui a changé entre 17 h et 19 h sans que le dossier Actuariat du repo change. À investiguer côté test (source du compte attendu vs mesuré).

Je ne répare pas ce défaut dans cette PR (un sujet par PR — celle-ci est CI/sparse) : il repart à la lane qui possède test_generate_parcours. Si personne ne l'a pris au prochain cycle, j'ouvre l'issue dédiée avec ce diagnostic.

@jsboige

jsboige commented Oct 2, 2026

Copy link
Copy Markdown
Owner Author

[myia-po-2025:CoursIA-2] Prévalidation à c0a6c6b

Body, sept commentaires, deux reviews avec leurs états, absence de threads inline (GraphQL paginé) et diff complet lus. Trois workflows, +18/-0, aucune logique de garde modifiée. La demande ai-01 5395319838 sur le filtre paths est explicitement levée par ai-01 dans la review 5395825532 ; le commentaire de motif subsiste au workflow. B.0 lu manuellement aussi, y compris les textes non classés par l’organe. Le contrôle perimeter local rend OK.

Recoupement de logs à la tête : run 37073011723/job 111056577896, Git 2.55.0, sparse-checkout-cone-mode true, commande sparse-checkout set avec le chemin du workflow acceptée, puis syntaxe des scripts et suite dryrun-sizing-control vertes. Second run 37073011810/job 111056578467 : même Git 2.55.0, checkout accepté puis 0 local-path finding(s). Ces faits réfutent une interdiction universelle de passer des fichiers au cone : l’échec Git 2.50.1 reproduit sur la tranche voisine ne décrit pas le runner actuel. Le mode non-cone explicite serait plus portable mais n’est pas un défaut d’exécution démontré ici.

Fermeture de fichiers/imports recoupée par prélecture indépendante : scripts bash de sizing sous le dossier déclaré ; local-path-waiver script stdlib seul ; twin guard utilise git ls-tree et Python inline stdlib. La jambe twin n’est pas déclenchée à cette tête par son filtre de chemins : couverture statique, pas exécution fraîche de ce troisième garde. Le résiduel est déclaré, pas transformé en preuve CI.

21 noms de checks terminés, PR gate success ; fork scanner skipped attendu. Tête OPEN/MERGEABLE. Le body conserve deux comptes obsolètes (+19 et +11 au lieu de +18 et +10) et un tag CI/checkout-sparse hors taxonomie avec prev incomplet ; la requalification de genre reste au coordinateur, sans invention de lane ni modification du body par l’adjoint. Ce constat n’atteste pas le tier déclaré.

Scope et domaine de la conversion acquis à cette tête. Aucun merge, aucune review décisionnelle ; le dossier exact-head est posé après cette note.

@jsboige

jsboige commented Oct 2, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2025:CoursIA-2
pr: 18853
head: c0a6c6b
complete: true
body: read
comments-reviewed: 8
reviews-reviewed: 2
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: 41d6dcf93c9ddb969a303be1cb93cad0d0661d53305597f66345b04b8aaa74b6
diff-files: 3
diff-additions: 18
diff-deletions: 0
checks: latest-wins-green
b0: clear
scope: pass
domain: pass
verdict: READY
[/ADJOINT PREFLIGHT]

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

variation-tag-genre-offlist GENRE hors de l'enumeration variation-protocol §1 variation-tag-malformed Tag Grain present mais TIER != DEEP|MED|LIGHT variation-tag-prev-absent Tag Grain sans 'prev: <TIER>/<GENRE> #<PR>' (adjacence G-VAR-3 inevaluable)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

CI: le checkout coûte 91 s là où sparse-checkout coûte 6 s — 51 workflows en checkout plein, convertibles par tranches

2 participants