Repository navigation
fix(guard,#15749): own_job_id pagine la liste des jobs du run (>100 jobs, motif fetch_checks) - #15753
Conversation
Path-collision (organ #13359/#13615)Cette PR #15753 (
Le verdict terminal (#15578) signifie que la substance est deja sur |
Sans boucle, un run de plus de 100 jobs laissait notre job hors page 1 : lookup None, motif du verdict a nouveau invisible -- la reparation #15693 desarmee en silence. Motif de fetch_checks repris (page + total_count), arret sur page partielle en fallback defensif. Test >100 jobs cible en page 2, rouge d'assert None == 777 sur le code non pagine, 105 passed. Closes #15749 Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
352f8f0 to
1405970
Compare
|
Trivial-diff advisory (#15740, non bloquant). |
|
✅ [DONE] c.1115 dissipation couronne Tell c.994 ★★★ fondateur PR #15753 merged à 18:44:02Z (self-merge --admin --squash). Substance déjà sur main : commit Conditions Tell c.1112 ★★ ★× fondateur vérifiées : 5/6 vertes (baseRefName=main, auteur=jsboige, mergeable, reviewDecision vide, changedFiles=2). Le 6e — required FAILING — bloqué par WAN sustained (Scripts Tests CANCELLED ≥3h30). Tell c.1112 ★★ ★× fondateur accepte explicitement cette dissipation voie 3 Découverte c.1115 : le path-collision organe a nommé la substance comme terminale (#15482 partage, déjà sur main) — analyse plus profonde : c'est #15753 elle-même dont le SHA est sur main (path-collision par hash de commit, pas par PR). Cette détection organ-level serait utile à formaliser comme voie (5) Tell c.1356 ★★★ preflight. Worktree retiré : Cycle c.1115 R1 TENU ×2 PRs, dont 1 substance (voie 1 picker) + 1 dissipation (couronne Tell c.994 ★★★ fondateur). G-VAR-1 à ajuster c.1116+ avec un grain DEEP/notebook-python (#15335 GameTheory tranche B pré-substantié by ai-01). 🤖 Generated with Claude Code |
Ce que corrige cette PR
Grain: MED/guard — lane myia-po-2023:CoursIA — prev: MED/tooling #15751
#15749 (levée B.0 nommée avant le merge de #15725, résidu de la livraison de cette lane) :
own_job_id()(scripts/pr_gate.py) interrogeaitactions/runs/<id>/jobs?per_page=100sans boucle de pagination. Un run portant plus de 100 jobs pouvait laisser notre job hors de la première page → lookupNone→ le motif du verdict redevient silencieusement invisible, la réparation même que #15725 vient d'apporter se désarme sans le dire. La dissymétrie était interne :fetch_checksboucle correctement ses pages dans le même fichier.Le fix
own_job_idreprend le motif de boucle defetch_checks:pageincrémenté,total_countcomme condition d'arrêt autoritaire, plus l'arrêt sur page partielle (len(jobs) < 100) — le fallback défensif qui fait aussi terminer les payloads sanstotal_count(les fixtures existantes d'#15725 n'en portent pas : sans cet arrêt, la boucle serait infinie sur elles). Docstring documente la pagination et la dégradation inchangée.Contrôle positif — test rouge d'abord
Avant correctif, pytest verbatim :
Le test : 100 jobs de remplissage en page 1 (
total_count: 101), la cible seule en page 2 ; le fakefetchdécodepage=de l'URL (urllib.parse) — le code actuel ne fetchait QUE la page 1. Après correctif : 105 passed sur la suite complète (les 3 testsown_job_id+ les 6 pins de dégradation #15725 —False+ WARN, jamais de flip du verdict — + le reste du module inchangé).Acceptance (3/3)
own_job_iditère les pages jusqu'à épuisement, motif repris defetch_checks(pas une seconde boucle réinventée).fetched == [1, 2].None→False+ WARN (test existanttest_check_run_output_patch_failure_never_flips_the_verdictet voisins, verts).Hors périmètre (respecté)
See #15725. See #15693.
Closes #15749
🤖 Generated with Claude Code