Skip to content

ci: set measured timeouts and cancel superseded PR runs (W1-7) - #479

Merged
cdeust merged 11 commits into
mainfrom
ci/green-timeouts-concurrency
Sep 6, 2026
Merged

cdeust merged 11 commits into
mainfrom
ci/green-timeouts-concurrency

Conversation

@cdeust

@cdeust cdeust commented Sep 6, 2026

Copy link
Copy Markdown
Owner

Symptôme

W1-7 / H10-H11 : des jobs héritaient du timeout GitHub de 360 minutes et les
runs PR remplacés de Fuzz/HOL/Upstream continuaient en parallèle.
PR empilée sur #478.

Cause racine

Délais non définis par job et absence de groupe de concurrence par PR.

Changement

Chaque nouveau délai est ceil(2 × maximum observé / 60) minutes, avec run,
date, durée et formule dans un commentaire source. Les quatre jambes Python
conservent leur nom et reçoivent un délai propre via matrix.include.

Fuzz, HOL et Upstream regroupent les runs par workflow/ref et annulent ceux
remplacés seulement sur pull_request. Les runs planifiés ne sont pas annulés
par cette politique. Déclencheurs, matrices et validations restent présents.

Preuve

Les quatre runs CI prescrits sont
33990473565 (74,33 min),
33951959734 (78,25 min),
33951905125 (78,50 min),
33806380625 (99,98 min).
Ces totaux sont les durées cumulées des jobs exécutés, hors file d'attente.

Job CI Maximum observé (s) Timeout (min)
Python 3.10 / 3.11 / 3.12 / 3.13 545 / 1931 / 1143 / 577 19 / 65 / 39 / 20
SQLite / Windows 292 / 426 10 / 15
Runtime / devcontainer / smoke 514 / 349 / 369 18 / 12 / 13
MCP hosts / release dependencies / typecheck 61 / 109 / 94 3 / 4 / 4
Lint / craftsmanship / build 17 / 9 / 19 1 / 1 / 1
CI Green / release gate 4 / 12 1 / 1
Changed paths (nouveau job, run34035713474) 9 1

Les autres workflows sont sourcés sur quatre runs par workflow (Fuzz inclut
quatre runs planifiés) : 41 runs archivés dans
/private/tmp/cortex-green-w1-7-other-sources.json et maxima dans
/private/tmp/cortex-green-w1-7-other-maxima.json. Les quatre CI et leurs jobs
sont dans /private/tmp/cortex-green-w1-timeout-sources.json.

Actionlint sur tous les workflows, agrégateur statique et vérification de chaque
formule passent. Gates locaux ordonnés verts : Ruff 1 416 fichiers, craftsmanship et Pyright
zéro diagnostic ; couche scripts 830 passed, 5 skipped, 292 subtests ; suite
complète 7 577 passed, 221 skipped, 292 subtests en 151,26 s. Skips PostgreSQL
locaux explicites (localhost:1 indisponible), charge initiale 3,78 / 10 cœurs,
65 GiB libres avant/après. Les 31 formules numériques ajoutées sont vérifiées.

uv sync --locked --no-default-groups --extra dev --extra sqlite --group lint
.venv/bin/ruff check
.venv/bin/ruff format --check
.venv/bin/python scripts/check_craftsmanship.py
uv sync --locked --no-default-groups --extra dev --extra postgresql --extra sqlite --extra codebase --extra otel --group typecheck --group lint
.venv/bin/python -m pyright mcp_server/
export CORTEX_TEST_DATABASE_URL=postgresql://localhost:1/cortex_green_isolated
export CORTEX_MEMORY_STORE_BACKEND=sqlite DATABASE_URL=
export HF_HUB_OFFLINE=1 TRANSFORMERS_OFFLINE=1 CORTEX_RERANKER_OFFLINE=1
.venv/bin/python -m pytest tests_py/scripts/ -q --tb=short
.venv/bin/python -m pytest -q --tb=short

actionlint .github/workflows/*.yml
.venv/bin/python scripts/check_ci_gate_complete.py

Log local : /private/tmp/cortex-green-w1-7-gates.log.
Acceptation externe prouvée par la PR temporaire #480
ciblant main : premier run Fuzz 34039387321
constaté en cours avant le second push, puis annulé automatiquement ; second
run 34039414743 vert.
Aucune annulation manuelle. Les deux révisions avaient passé tous les gates
avant leurs pushs rapprochés. La PR temporaire est fermée sans fusion.
La CI de cette PR est également verte, run34038906477.

Conformité

Huit workflows, constantes toutes reliées aux mesures, aucune baseline ajoutée,
aucun import mémoire modifié. Tests sur données isolées. Pas de fusion/issue,
pas de déclenchement des jobs de publication pour fabriquer une mesure.

Candidats issues

publish-ccplugins et sync-ccplugins-fork restent sans nouveau timeout : leurs
runs verts observables n'exécutent que la garde « PAT absent » (4 s), pas le
chemin de publication/synchronisation. Historique inspecté : 28 runs publish,
100 runs sync récents et sondes plus anciennes ; aucun maximum actif fiable.
Appliquer 1 minute à partir de cette garde serait une constante non justifiée.
Preuve : /private/tmp/cortex-green-w1-7-guard-history.json.
Ces deux délais restent donc une acceptation partielle explicite.

Runbook

Le propriétaire décide de la fusion et pourra relever un vrai run actif des
deux jobs non mesurables pour fixer leur délai selon la même formule.
Aucune publication externe ou synchronisation de dépôt n'est exécutée ici.

Validation complémentaire du 7 septembre : le run PR 34061028434 a atteint 98 % de la suite Python 3.10 avant annulation à la limite de 19 minutes, sans test en échec dans le journal. Recalibrage selon la règle existante ceil(2 × maximum observé / 60) : Python 3.10 = 33 minutes, à partir du run réussi 34047249647 (980 s) ; Python 3.12 = 40 minutes, à partir de 34046091095 (1 197 s). Aucun changement de test ni assouplissement du gate. actionlint, Ruff, craftsmanship et Pyright passent ; 830 tests ciblés et 7 577 tests complets passent (221 ignorés, 292 sous-tests). Les contrôles distants sont relancés sur le nouveau commit.

Le run lent Python 3.13 déjà cité par le workflow initial est également conservé : 33688337476, terminé avec succès en 1 637 s le 2 septembre, donc ceil(2 × 1 637 / 60) = 55 minutes. Limites finales 3.10/3.11/3.12/3.13 : 33/65/40/55 minutes. Dernière validation complète : 7 577 tests réussis, 221 ignorés, 292 sous-tests, 130,90 s ; actionlint et tous les gates statiques passent.

@cdeust
cdeust merged commit 7565f84 into main Sep 6, 2026
29 checks passed
@cdeust
cdeust deleted the ci/green-timeouts-concurrency branch September 8, 2026 16:01
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant