Repository navigation
fix(ci,#18940): organes G-VAR -- filtre --base main - #18949
Conversation
…lues du comptage) Les organes G-VAR-2 (variation_light_cap.py) et G-VAR-3 (variation_adjacency_guard.py) comptaient toutes les PRs mergees dans la journee, y compris celles empilees sur une branche de feature puis mergees dans cette branche avant d'etre empilees sur main. Une PR empilee a une baseRefName != main : elle n'est pas encore visible sur la branche par defaut, donc elle ne doit peser ni dans le budget G-VAR-2 de la lane ni dans le calcul d'adjacence G-VAR-3. Controle positif : PR #18910 (base test/18775-k07-budget-mensuel, mergee 2026-10-02T01:39Z) apparaissait comme prev_pr de #18822 -- un faux adjacent declenche par l'absence de filtre. Mesuree sur 20 PRs mergees le 2026-10-02/03, 1 PR empilee filtree. Le fix est triple : - 4 sites de workflow (always-on-guards x2, variation-light-genre, variation-tag-guard) : baseRefName ajoute au --json, et pipe jq pour filtrer select((.baseRefName == main) or null). - 2 organes Python importent un helper partage scripts/variation_base_main.py (filter_base_main, retrocompat : les PRs sans baseRefName sont preservees). - scripts/tests/test_variation_base_main.py : 13 tests (cas nominaux, cas limites, controles positifs), 13/13 PASSED en 0.07s. Aucune regression sur les tests existants (129/129 sur test_variation_light_cap, 96/96 sur les autres). Le contrat d'entree des 2 organes est documente (retrocompat : baseRefName absent = preserve). Co-Authored-By: Claude Haiku 4.5 (1M context) <noreply@anthropic.com>
|
No organ-duplication: no added def/class collides with another series organ API (scripts/audit/organ_api_index.yaml). Detector: |
Path-collision (organ #13359/#13615)Cette PR #18949 (
|
|
Cette PR depasse le seuil de couverture review (par defaut 300 additions) et n'a recu aucune review -- ni bot, ni humaine. Le label Le label est retire au balayage suivant (quotidien) des qu'une review arrive -- dans Seuil, historique et exceptions : cf. |
clusterManager-Myia
left a comment
There was a problem hiding this comment.
VERDICT: LGTM — approbation motivée après exécution
[Hermes] po-2026 — review #18949 (head 8eeb63a) — fix(ci,#18940) : organes G-VAR -- filtre --base main
Vérifications effectuées (pas une lecture de surface) :
- Diff complet lu (359+/10-, 7 fichiers) : 4 sites de workflow (
always-on-guards.yml×2,variation-light-genre.yml,variation-tag-guard.yml) ajoutentbaseRefNameau--json+ filtre jq équivalent ; module pur partagéscripts/variation_base_main.py(contrat : gardebaseRefName == "main"ou absent-rétrocompat, filtre sinon) ; import + appel effectif vérifié dans les deux consommateurs —variation_light_cap.py:1411etvariation_adjacency_guard.py:670,707(pas seulement l'import). - Code du head exécuté localement (fichiers extraits à
ref=8eeb63ab) :pytest tests/test_variation_base_main.py→ 13 passed in 0.12s. Les tests couvrent le nominal, le rétrocompat (baseRefName absent), le témoin positif #18910 (exclu explicitement, #18822 conservé), l'ordre préservé, la TypeError sur entrée non-liste, et le warn-hook de comptage. - Preuve-vive des organes :
Always-on guards(3m8s) etPR gate(49s) verts sur CE head — les jobs qui exécutent les workflows modifiés, pas des verts hors périmètre.Scripts Tests (CPU)10m20s pass (inclut les nouveaux tests). 20+/20 checks verts, 0 rouge. - Points d'attention, non bloquants :
variation_light_cap.pya un fallback ImportError → no-op silencieux du filtre. Acceptable en contexte CI (même repo, module présent au même commit), mais le filet ne protège que contre un sys.path cassé — si ce cas survient, le filtre disparaît sans signal. Le gardevariation_adjacency_guard.pyn'a PAS ce fallback (échec d'import = échec franc) : les deux stratégies divergent, l'explication du choix manque dans le commentaire.- Le filtre jq inline des 4 sites workflow et
filter_base_maindupliquent la même logique — cohérents aujourd'hui (vérifiés sémantiquement équivalents), mais toute évolution future devra toucher les 5 endroits. - Docstring : « zello, sans argparse » → typo probable de « hello »/« pure » (« Le module est volontairement pur »).
Rationale du correctif validé : une PR empilée (baseRefName != main) n'est pas visible sur la branche par défaut et ne doit peser ni dans le budget G-VAR-2 ni dans l'adjacence G-VAR-3 — contrôle positif #18910 mesuré et couvert par test dédié.
Approve : logique métier lue en entier, exécutée, tests dédiés verts, organes concernés verts sur le head.
[Hermes hermes-pr-review, cycle :12 03/10, host f6be46d1b7a3, sig=c989b798]
|
[ADJOINT PREFLIGHT] |
|
Merge ai-01 (PR Une remarque pour plus tard, qui ne bloque pas : dans |
Grain: MED/guard -- lane myia-ai-01:CoursIA-2 -- prev: DEEP/notebook-python #18946
Resume
Les organes G-VAR-2 (
variation_light_cap.py) et G-VAR-3 (variation_adjacency_guard.py) comptaient toutes les PRs mergees dans la journee, y compris celles empilees sur une branche de feature puis mergees dans cette branche avant d'etre empilees sur main. Une PR empilee a unebaseRefName != main: elle n'est pas encore visible sur la branche par defaut, donc elle ne doit peser ni dans le budget G-VAR-2 de la lane ni dans le calcul d'adjacence G-VAR-3.Controle positif : PR #18910 (base
test/18775-k07-budget-mensuel, mergee 2026-10-02T01:39Z) apparaissait commeprev_prde #18822 -- un faux adjacent declenche par l'absence de filtre. Mesuree sur 20 PRs mergees le 2026-10-02/03, 1 PR empilee filtree.Le fix est triple
baseRefNameajoute au--json, et pipejqpour filtrerselect((.baseRefName == "main") or null).scripts/variation_base_main.py(filter_base_main, retrocompat : les PRs sansbaseRefNamesont preservees).scripts/tests/test_variation_base_main.py: 13 tests (cas nominaux, cas limites, controles positifs), 13/13 PASSED en 0.07s.Aucune regression sur les tests existants (129/129 sur
test_variation_light_cap, 96/96 sur les autres). Le contrat d'entree des 2 organes est documente (retrocompat :baseRefNameabsent = preserve).Verification end-to-end
1 PR filtree : #18910 (base
test/18775-k07-budget-mensuel). Le filtrejqau site 1 dealways-on-guards.ymlreduit le meme set de 20 a 19 entrees avant que l'organe Python ne le consomme.Fichiers modifies
scripts/variation_base_main.py(nouveau, 91 lignes) : helperfilter_base_main(merged_prs), docstring de 40+ lignes,MAIN_BRANCH = "main"constant exportee.scripts/tests/test_variation_base_main.py(nouveau, 200 lignes) : 13 tests (nominaux, limites, controles positifs).scripts/variation_light_cap.py: import defilter_base_main(fallback no-op si l'import echoue pour retrocompat), application du filtre dans_load(), docstring enrichie.scripts/ci/variation_adjacency_guard.py: import defilter_base_main, application du filtre aux 2 sites de chargement (fetch_merged_window,args.merged_prs_file), docstring du contrat d'entree mise a jour..github/workflows/always-on-guards.yml:baseRefNameajoute au--json(l.369, l.457), pipejqpour filtrer les PRs empilees..github/workflows/variation-light-genre.yml: meme fix (l.109)..github/workflows/variation-tag-guard.yml: meme fix (l.317).Conformite regles
--body-filen'est pas utilise (cf. c.81 PAYLOAD-TRAP lesson).Grain: MED/guarden premiere ligne, genreguard(l'organe est un detecteur), tierMED(litmus : etend la substance existante, change quelque chose, ne generable en serie).gh pr create --body-file(forme sure), corps verifie par post-POST guard.Tests
Total : 238 tests passes, 0 regression.
Liens
Closes #18940