Skip to content

fix(ci,#17668): shared release_parked_runs.py — port du sondage borné #17634 vers qc-research-monitor - #17711

Merged
myia-ai-01 merged 2 commits into
mainfrom
fix/qc-monitor-release-race-17668
Sep 25, 2026
Merged

myia-ai-01 merged 2 commits into
mainfrom
fix/qc-monitor-release-race-17668

Conversation

@jsboige

@jsboige jsboige commented Sep 24, 2026

Copy link
Copy Markdown
Owner

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 unique scripts/ci/release_parked_runs.py appelé 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

  1. 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 :

    • sondage borné (RELEASE_SETTLE_POLLS x RELEASE_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) ;
    • filtrage conclusion == action_required et headSha == HEAD (rev-parse) ;
    • staggering RELEASE_STAGGER_SECONDS (15 s) entre approbations, soupape RELEASE_CEILING (40) — le run au-delà est différé sans tentative d'approbation ;
    • approbation refusée -> ::warning comptée, jamais de rouge (exit 0 : le step porte continue-on-error, la panne doit rester visible, pas rouge) ;
    • même contrat d'env que les steps inline (GH_TOKEN, BRANCH, les trois RELEASE_*), tag de notice (--tag Catalog|QC-research) pour conserver les préfixes existants.
  2. .github/workflows/catalog-cron.yml — le step "Release the parked runs" remplace son bloc bash inline (54 lignes) par l'appel au script. Bloc env et commentaires de mesure conservés tels quels.

  3. .github/workflows/qc-research-monitor.yml — idem, plus RELEASE_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_compile OK ; les deux workflows re-validés par yaml.safe_load après édition.
  • Chemin « tolérance gh » validé par accident en local : gh run list réel avec jeton invalide -> returncode != 0 -> liste vide -> "no parked run", exit 0 (sémantique || true du 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), compteur seen > ceiling sans 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, + mention check_catalog_freshness.py retirée car spécifique au seul workflow catalog).

Closes #17668

🤖 Generated with Claude Code

…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>
@github-actions

Copy link
Copy Markdown
Contributor

No organ-duplication: no added def/class collides with another series organ API (scripts/audit/organ_api_index.yaml).

Detector: python scripts/audit/detect_organ_duplication.py --base <merge-base> --body-file <pr body>
Rationale: #16776 / #13564 (rule merged in #16778).

@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 labels Sep 24, 2026
@github-actions

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-09-24) :

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.

@github-actions github-actions Bot added the lane-claim-absent Closing issue carries no claim at all (#10223) label Sep 24, 2026
…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 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.

VERDICT: LGTM (statique — CI non encore mesuré, cf. réserve)

Lecture complète du port (2 workflows + script + tests). Points vérifiés :

  1. Fidélité du port vs #17634 — sémantique identique au step inline mergé : sondage borné avec sleep AVANT chaque sonde (même ordre que l'original), break au compte non nul stable sur deux sondes, filtrage action_required + headSha courant, staggering RELEASE_STAGGER_SECONDS sauf 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.
  2. 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 pour importlib + instance.
  3. Contrat d'env préservé : RELEASE_SETTLE_SECONDS est nouveau mais défaut 15 = le sleep 15 hardcodé d'origine ; surcharge pour tests seulement. exit 0 systématique cohérent avec continue-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]

@jsboige

jsboige commented Sep 25, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2023:CoursIA
pr: 17711
head: 822ec53
complete: true
body: read
comments-reviewed: 2
reviews-reviewed: 1
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: af322561e092cd679002df799ddb8af0c7215a244747dc3da7ee553090000b57
diff-files: 4
diff-additions: 332
diff-deletions: 95
checks: latest-wins-green
b0: clear
scope: pass
domain: not-applicable
verdict: READY
[/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.

@myia-ai-01
myia-ai-01 merged commit d116205 into main Sep 25, 2026
26 of 30 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

lane-claim-absent Closing issue carries no claim at all (#10223) variation-tag-genre-offlist GENRE hors de l'enumeration variation-protocol §1 variation-tag-malformed Tag Grain present mais TIER != DEEP|MED|LIGHT

Projects

None yet

Development

Successfully merging this pull request may close these issues.

ci(qc-research-monitor): meme course au release des runs gares que catalog-cron (jumeau de #17634)

2 participants