Repository navigation
fix(ci,#17668): shared release_parked_runs.py — port du sondage borné #17634 vers qc-research-monitor - #17711
Conversation
…ettle-polling to qc-research-monitor Both catalog-cron.yml and qc-research-monitor.yml carried an inline "Release the parked runs" step; the qc-research twin lacked the bounded settle-polling fix from #17634, proving two copies diverge. Single implementation now lives in scripts/ci/release_parked_runs.py, called by both workflows with the same env contract (RELEASE_SETTLE_POLLS added to qc-research-monitor). Behavior verified equivalent by 4 pytest controls. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
|
G-VAR-2/3 GENRE signals (advisory, non bloquant, #10020).
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 |
…he pytest process The controls patched rpr.subprocess.run and rpr.time.sleep on the global singleton modules, so the fakes intercepted git calls of 84 unrelated tests in the same CI job. Inject SimpleNamespace stubs on the loaded module instance only. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
jsboige
left a comment
There was a problem hiding this comment.
VERDICT: LGTM (statique — CI non encore mesuré, cf. réserve)
Lecture complète du port (2 workflows + script + tests). Points vérifiés :
- Fidélité du port vs #17634 — sémantique identique au step inline mergé : sondage borné avec
sleepAVANT chaque sonde (même ordre que l'original), break au compte non nul stable sur deux sondes, filtrageaction_required+headShacourant, staggeringRELEASE_STAGGER_SECONDSsauf avant la 1re approbation, ceiling différé sans tentative d'approbation, warnings::exacts. Le jumeau qc-research n'avait pas le sondage — c'est bien le défaut que l'issue corrige, et l'argument anti-duplication (deux copies divergent) est la bonne leçon de #17668. - Stubs de test sur l'instance uniquement (
rpr.subprocess = SimpleNamespace(...), pas de mutation du singleton global) — le commentaire du 1er passage (84 tests voisins pollués) documente un vrai incident et son correctif. C'est le bon motif pourimportlib+ instance. - Contrat d'env préservé :
RELEASE_SETTLE_SECONDSest nouveau mais défaut 15 = lesleep 15hardcodé d'origine ; surcharge pour tests seulement.exit 0systématique cohérent aveccontinue-on-error+ visibilité par warning.
Réserve CI (preuve-vive) : la 1re passe de Scripts Tests (CPU) est morte "runner lost mid-step" — le code n'a jamais été mesuré ; le re-run est en cours au moment de cette review. Le gate a raison d'exiger le child run. Verdict statique donc ; à confirmer au vert du re-run, aucun signal négatif dans le code lui-même.
[Hermes hermes-pr-review, cycle :22 24/09, host f6be46d1b7a3]
|
[ADJOINT PREFLIGHT] Verifications firsthand : checks vertes, B.0 rc=0, corps lu (port du sondage borne #17634 en script unique release_parked_runs.py consomme par les deux workflows — la divergence corrigee est demontree par l'issue). Commentaires relus : advisory variation-genre-signals bot uniquement, aucune reserve d'auteur. |
Grain: ci/scripts -- lane myia-po-2026:CoursIA -- prev: qc/notebooks #17696
Summary
Port du sondage borné de #17634 (catalog-cron.yml) vers
qc-research-monitor.yml, sous la forme proposée par l'issue : script uniquescripts/ci/release_parked_runs.pyappelé par les deux workflows, au lieu de deux copies inline. La divergence que cette issue corrige — le jumeau qc-research n'avait pas le correctif de course porté par #17634 — est la preuve même que deux copies finissent par diverger.Changements
scripts/ci/release_parked_runs.py(nouveau) — implémentation unique, sémantique identique au step inline mergé par fix(ci,#17217): catalog-cron sonde les runs garés au lieu de les chercher trop tôt #17634 :RELEASE_SETTLE_POLLSxRELEASE_SETTLE_SECONDS, défaut 8 x 15 s) : re-sonde jusqu'à un compte non nul ET stable sur deux sondes — la requête unique partait avant que GitHub crée les runs du head (mesure 2026-09-24 : push 08:47:03Z, requête 08:47:07Z -> "no parked run", runs créés 08:47:12Z) ;conclusion == action_requiredetheadSha == HEAD(rev-parse) ;RELEASE_STAGGER_SECONDS(15 s) entre approbations, soupapeRELEASE_CEILING(40) — le run au-delà est différé sans tentative d'approbation ;::warningcomptée, jamais de rouge (exit 0 : le step portecontinue-on-error, la panne doit rester visible, pas rouge) ;GH_TOKEN,BRANCH, les troisRELEASE_*), tag de notice (--tag Catalog|QC-research) pour conserver les préfixes existants..github/workflows/catalog-cron.yml— le step "Release the parked runs" remplace son bloc bash inline (54 lignes) par l'appel au script. Blocenvet commentaires de mesure conservés tels quels..github/workflows/qc-research-monitor.yml— idem, plusRELEASE_SETTLE_POLLS: "8"ajouté : c'est le port effectif du correctif de course (l'attendu principal de l'issue).Contrôles positifs
pytest tests/test_release_parked_runs.py— 4 tests, 4 passed :test_course_au_release_sondage_borne: runs n'apparaissant qu'à la 2e sonde -> break au compte stable (3 sondes), bruit filtré (autre head,conclusion: success), 2 approbations échelonnées ;test_plafond_differe_sans_tenter_lapprobation: ceiling=2 sur 3 runs -> 2 appels API seulement, 1 différé + warning ;test_approbation_refusee_warning_pas_rouge: approve refusé -> compté, 2 warnings, exit 0 ;test_fenetre_vide_aucune_approbation: fenêtre vide -> notice, zéro appel, exit 0.py_compileOK ; les deux workflows re-validés paryaml.safe_loadaprès édition.gh run listréel avec jeton invalide ->returncode != 0-> liste vide -> "no parked run", exit 0 (sémantique|| truedu bash d'origine préservée).Équivalence vérifiable
Le bloc bash de catalog-cron (l.367-420 avant édition) et le script partagent : ordre des notices, conditions de break (
n > 0 && n == prev), compteurseen > ceilingsans appel API, stagger seulement entre approbations réussies tentées (released > 0), wording unifié des warnings (version la plus complète, celle de catalog-cron, + mentioncheck_catalog_freshness.pyretirée car spécifique au seul workflow catalog).Closes #17668
🤖 Generated with Claude Code