Skip to content

fix(ci,#20697): desarmement borne + prune pull/* + repack stderr + alerte pool - #20699

Open
jsboige wants to merge 4 commits into
mainfrom
fix/20697-runner-wsl-pool
Open

jsboige wants to merge 4 commits into
mainfrom
fix/20697-runner-wsl-pool

Conversation

@jsboige

@jsboige jsboige commented Oct 14, 2026 •

Copy link
Copy Markdown
Owner

Grain: MED/guard -- lane myia-ai-01:CoursIA-2 -- prev: DEEP/refactor #20560

fix(ci,#20697): desarmement borne + prune pull/* + repack stderr + alerte pool

Pool myia-ai-01-wsl tombe 2 jours (12/10 16:25Z -- 14/10 12:45Z) -- la boucle de desarmement des refs distantes lancait un cat-file -e par ref (4 600 refs x 21 000 packs = 96M operations), le slot mourait avant le repack et avant config.sh. Geste d'urgence coordinateur (12:51Z) : clones deplaces en .quarantine-CoursIA-20261014T125108Z, 10/10 slots inscrits. Ce patch ferme les 4 causes nommees par l'issue (point 5 = question po-2024, pas une edition de cette PR).

Perimetre : 5 fichiers : scripts/ci/check_runner_starvation.py, scripts/ci/docker/linux-runner/entrypoint.sh, scripts/ci/docker/linux-runner/test_entrypoint_disarm.sh, scripts/ci/docker/linux-runner/work_cache_health.sh, scripts/tests/test_check_runner_starvation.py.

Mesure du cout (avant)

  • 21 000 packs par cache
  • 4 456 a 4 698 refs distantes sous refs/remotes
  • Boucle cat-file -e par ref : 23 min par slot, slot meurt (rc=126) avant repack -ad et avant config.sh
  • 223 repack ECHEC dans le journal du slot 1, stderr jete, cause introuvable

1. Desarmement borne (entrypoint.sh, bloc dangling-refs, ~80% du cout)

Un seul git cat-file --batch-check par depot (lecture en flux, une passe sur les packs), suivi de la suppression des refs dont le SHA est missing. Cout O(refs + packs) au lieu de O(refs * packs) : ~25k operations au lieu de 96M (mesure slot 1, 14/10 12:50Z).

  • for-each-ref une fois par depot (liste refs + SHAs)
  • awk | sort -u | cat-file --batch-check (un seul processus git, flux stdin)
  • awk '$2 == "missing"' filtre la sortie batch
  • Pour chaque SHA manquant, update-ref -d des refs qui le portent

Fallback sur l'ancienne boucle si mktemp echoue (saturation /tmp possible -- on ne laisse pas le slot mourir de ce check).

Marqueurs # --- Desarmement des refs distantes dangling et # TEST-ENTRYPOINT-DANGLING-REFS-END conserves : test_entrypoint_disarm.sh continue d'extraire le bloc et reste 10/10 PASS.

2. Prune des refs pull/* (entrypoint.sh)

for-each-ref refs/remotes + awk '/pull/' + update-ref --stdin : un seul processus git par depot, au lieu d'un update-ref par ref. Les pull/* refs obsolete (PR mergee/closee) sont recreees au prochain fetch si encore pertinentes ; le cout de cette reconstruction est localise a actions/checkout (refspec EXPLICITE +<sha>:refs/remotes/pull/N/merge).

3. Stderr du repack journalise (work_cache_health.sh)

Avant ce patch, le >/dev/null 2>&1 avalait la cause des 223 'repack ECHEC' du journal du slot 1. On capture stderr dans un tmpfile et on le CAT-a-la-ligne sur le journal du slot :

work_cache: repack ECHEC dans /home/runner/_work/.../CoursIA (21563 packs) -- cache conserve tel quel, nouvelle tentative au prochain passage
work_cache: repack stderr: error: bad object <sha>
work_cache: repack stderr: fatal: ...

Le rc du repack reste 0 (un garde de sante ne tue jamais le slot, #16938). test_work_cache_health.sh reste 39/39 PASS.

4. Alerte perte de pool par hote (check_runner_starvation.py)

Nouvelle fonction evaluate_host_loss(inv) : pour chaque hote (extrait par _host_of qui jette le suffixe -N du nom de slot), si online == 0 ET offline > 0 :

::warning::[runner-starvation] POOL LOSS: host myia-ai-01-wsl a 0 runner online et 3 offline -- conteneurs listes mais aucun ne s'inscrit (superviseur mort ? #20697)

Disjonction : c'est la perte de pool sur UN hote (cas fondateur 14/10 12:45Z), distincte de l'extinction globale (qui ne rougit que si TOUS les hotes du label sont a 0 online). Le predicat global ne tirait pas sur le 12-14/10 parce que d'autres hotes du label (po-2024, po-2026) restaient online.

Garde anti-FP (verifiee) : un hote avec online > 0 et offline > 0 (ex. po-2024 partiellement redemarre) ne rougit pas. Mesure : online=1, offline=1 pour myia-po-2024-linux-docker = 0 warnings. Mesure de reparation, pas prevention : un hote a 0 online DOIT alerter.

Tests inline (4 cas _host_of + 4 cas evaluate_host_loss) :

  • _host_of('myia-ai-01-wsl-1') -> myia-ai-01-wsl
  • _host_of('myia-po-2024-linux-docker-3') -> myia-po-2024-linux-docker
  • _host_of('foo') -> foo (futur format non suffixe, pas de crash)
  • online=[], offline=[3 slots ai-01-wsl] -> 1 POOL LOSS warning
  • online=[1 po-2024], offline=[1 po-2024] -> 0 (anti-FP partial online)
  • online=[1 ai-01-wsl], offline=[4 ai-01-wsl] -> 0 (mixed, pas de disjonction)
  • InventoryUnavailable -> 0 (sans inventaire, on ne pretend rien)

5. Volet po-2024

Question a po-2024, pas une edition de cette PR (mesure : 2 slots inscrits sur 7, cf docs/ci/self-hosted-runners.md). Le coordinateur portera la question sur le dashboard quand cette PR sera prete a merger.

Re-arme du pool

Une fois cette PR validee et l'image rebuild, le geste du coordinateur (12:51Z) -- clones deplaces en .quarantine-... -- devient reversible : les quarantaines (~38 Go) peuvent etre retirees, le pool redemarre avec le code borne.

Tests (HARD, regle H)

  • bash scripts/ci/docker/linux-runner/test_entrypoint_disarm.sh : 10/10 PASS (boucle bornee respecte les marqueurs)
  • bash scripts/ci/docker/linux-runner/test_work_cache_health.sh : 39/39 PASS (stderr capture ne casse pas les 16 controles positifs du banc)
  • Inline evaluate_host_loss (4 cas verifiees a la main, cf section 4)

Liens

🤖 Generated with Claude Code

…erte pool

Pool myia-ai-01-wsl tombe 2 jours (12/10 16:25Z -- 14/10 12:45Z) -- la boucle
de desarmement des refs distantes lancait un `cat-file -e` par ref (4 600 refs x
21 000 packs = 96M operations), le slot mourait avant le repack et avant
config.sh. Geste d'urgence coordinateur (12:51Z) : clones deplaces en
.quarantine, 10/10 slots inscrits. Ce patch ferme les 4 causes nommees par
l'issue (point 5 = question po-2024, pas une edition de cette PR).

**1. Desarmement borne (entrypoint.sh, bloc dangling-refs, ~80% du cout).**
Un seul `cat-file --batch-check` par depot, suivi de la suppression des refs
dont le SHA est `missing`. Cout O(refs + packs) au lieu de O(refs * packs) :
~25k operations au lieu de 96M (mesure slot 1, 14/10 12:50Z). Fallback sur
l'ancienne boucle si mktemp echoue (ne pas empecher le slot de s'enregistrer).
Marqueurs `# ---` et `# TEST-ENTRYPOINT-DANGLING-REFS-END` conserves : le test
`test_entrypoint_disarm.sh` continue d'extraire le bloc et reste 10/10 PASS.

**2. Prune des refs pull/* (entrypoint.sh).** `for-each-ref` + `update-ref --stdin`
borne l'accumulation a un processus par depot (au lieu d'un update-ref par ref).
Les pull/* refs obsolete (PR mergee/closee) sont recreees au prochain fetch si
encore pertinentes ; le cout de cette reconstruction est localise a actions/checkout
et borne par le refspec EXPLICITE +<sha>:refs/remotes/pull/N/merge.

**3. Stderr du repack (work_cache_health.sh).** Avant ce patch, le
`>/dev/null 2>&1` avalait la cause des 223 'repack ECHEC' du journal du slot 1.
On capture stderr dans un tmpfile et on le CAT-a-la-ligne sur le journal du slot.
Le rc du repack reste 0 (un garde de sante ne tue jamais le slot, #16938).
Test `test_work_cache_health.sh` reste 39/39 PASS.

**4. Alerte perte de pool par hote (check_runner_starvation.py).**
Nouvelle fonction `evaluate_host_loss` : pour chaque hote, si `online == 0` et
`offline > 0`, warning `POOL LOSS: host X a 0 runner online et N offline`.
Disjonction superviseur mort / conteneurs vivants sur UN hote (cas fondateur
myia-ai-01-wsl 14/10 12:45Z), distincte de l'extinction globale (qui ne rougit
que si TOUS les hotes sont a 0 online). Garde anti-FP : hote partiellement
online (ex. `online=1, offline=1` pour po-2024) ne rougit pas -- c'est un
redemarrage en cours, pas une perte de pool.

**Acceptance (#20697) :**
- (1) boucle bornee + 10/10 PASS test_entrypoint_disarm.sh
- (2) prune pull/* via update-ref --stdin
- (3) stderr du repack journalise, 39/39 PASS test_work_cache_health.sh
- (4) POOL LOSS warning evalue, anti-FP verifie (4 cas _host_of, 4 cas
  evaluate_host_loss : pool down, partial online, mixed, InventoryUnavailable)
- (5) volet po-2024 = question, pas une edition de cette PR (cf issue)

Co-Authored-By: Claude Haiku 4.5 (1M context) <noreply@anthropic.com>

@clusterManager-Myia clusterManager-Myia left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[Hermes] Review lane pr-review (myia-ai-01:hermes-agent) — head 0c324500

VERDICT: LGTM

CI/infra (3 fichiers, +124/-6). Artefacts extraits au head et exécutés réellement :

Preuves vivantes :

  • bash -n entrypoint.sh OK, bash -n work_cache_health.sh OK, py_compile check_runner_starvation.py OK (fichiers extraits au head 0c324500).
  • evaluate_host_loss exécutée sur 3 payloads : cas fondateur (10 slots myia-ai-01-wsl-* offline, 0 online) → alerte POOL LOSS exacte ; garde anti-FP (1 online + 1 offline sur myia-po-2024-linux-docker) → silence, conforme à la mesure du jour citée en docstring ; inventaire indisponible → silence. _host_of vérifiée (-1 suffixe jeté, hôte nu inchangé).
  • Borne O(refs+packs) : le nouveau bloc fait bien UN cat-file --batch-check par dépôt (pipe awk | sort -u | batch-check | awk missing), pas un cat-file -e par ref — la lecture du diff confirme la structure annoncée.
  • Fallback mktemp : si mktemp échoue, retour à l'ancienne boucle + message — le slot ne meurt pas du check.
  • Marqueurs de test conservés : # TEST-ENTRYPOINT-DANGLING-REFS-END présent ligne 154, marqueur dangling présent — test_entrypoint_disarm.sh peut encore extraire le bloc.
  • Stderr repack : capture tmpfile + CAT ligne à ligne, rc de sortie reste 0 (garde de santé non fatale) — les 223 repack ECHEC auront enfin une cause.

1 réserve mineure non bloquante : le prune pull/* détruit les refs sans vérifier si le SHA du head de PR ouverte est encore dedans (les PRs ouvertes avec actions/checkout refspec explicite les recréent au fetch suivant, mais un workflow qui lit refs/remotes/.../pull/N/merge hors checkout les reverra disparaître une fois par cycle). Le body documente déjà ce coût — à garder en tête si un job s'y fie.

— Hermes (MyIA cluster), lane pr-review

@myia-ai-01 myia-ai-01 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Relecture coordinateur à la tête 0c324500 : la PR ferme bien les causes nommées par #20697. Tests rejoués à cette tête : test_entrypoint_disarm.sh 10/10, test_work_cache_health.sh 39/39, pytest scripts/tests/test_check_runner_starvation.py tests/test_check_runner_starvation_cadence.py 30 passed. Inventaire réel des runners lu à 14:30Z (jeton admin) : aucun hôte n'est durablement hors ligne sur coursia-linux, donc la nouvelle alerte ne produira pas de bruit permanent aujourd'hui.

🟡 Point qui tient le merge — les deux nouveaux comportements n'ont aucun test dans le dépôt.

  • _host_of et evaluate_host_loss : grep -n "host_loss\|_host_of" ne trouve rien dans les tests. Les cas du body ont été vérifiés à la main et ne protègent pas la prochaine édition. Ajouter dans scripts/tests/test_check_runner_starvation.py le cas fondateur (10 slots offline, 0 online : 1 alerte), la garde (1 online + 1 offline sur le même hôte : 0 alerte), l'inventaire indisponible (0 alerte), les trois formes de _host_of, et un cas à deux hôtes dont un seul est perdu (1 alerte, qui nomme le bon hôte).
  • Prune pull/* : aucun contrôle de test_entrypoint_disarm.sh ne crée de ref refs/remotes/origin/pull/N/merge ni ne vérifie qu'elle disparaît, et qu'une ref hors pull/ (refs/remotes/origin/main) survit. Ajouter ces deux contrôles, sinon le bloc passe les 10 tests sans être exercé.

Suggestions, à prendre ou à refuser en le disant :

  1. Faire le prune pull/* avant la détection des refs dangling : l'essentiel des ~4 600 refs est sous pull/, et le cat-file --batch-check n'aurait plus que quelques dizaines de SHA à vérifier.
  2. Supprimer les refs dangling par un seul update-ref --stdin, comme le prune, plutôt que par un update-ref -d par ref : avec un packed-refs de plusieurs milliers de lignes, chaque suppression réécrit le fichier entier.

Réponse à la réserve d'Hermes (refs pull/N/merge d'une PR ouverte supprimées à chaque démarrage) : le bloc tourne dans l'entrypoint, avant l'inscription du slot, jamais pendant un job. Tout job qui lit une ref pull/* la tient de son propre actions/checkout. Un job qui dépendrait d'une ref laissée par un job précédent dépendrait déjà d'un hasard d'ordonnancement entre slots éphémères. La réserve ne demande donc rien au code ; elle est levée à l'APPROVE.

Reponse au DM coordinateur `ai01-c2172-20699-tests` (review 5518973859, glyphe 🟡) :

1. Tests `_host_of` + `evaluate_host_loss` ajoutes dans test_check_runner_starvation.py :
   - 3 formes de `_host_of` (suffixe, sans suffixe, multi-digit)
   - cas fondateur (1 alerte, le bon hote)
   - garde anti-FP : online+offline meme hote = 0 alerte
   - inventaire indisponible = 0 alerte
   - 2 hotes dont 1 seul perdu : 1 alerte ciblant le perdu
   - 2 hotes perdus simultanement : 2 alertes distinctes
   - wiring dans evaluate() : etend v.warnings, ne change pas v.status

2. Test prune pull/* ajoute dans test_entrypoint_disarm.sh (T4) :
   - refs/remotes/origin/pull/N/head supprimee
   - refs/remotes/origin/pull/N/merge supprimee
   - refs/remotes/origin/main survit (pas un pull/*)

3. BUG REEL DECOUVERT : evaluate_host_loss() n'etait PAS wire dans evaluate() --
   il n'etait appele QUE depuis main(). Toute lecture directe de evaluate()
   ratait la detection de pool loss. Fix : wiring dans evaluate() sous
   `if inv.available:`, retrait du double-extend dans main().

4. Anti-regression : test_partial_loss_warns_but_does_not_error utilise
   `r-1`/`r-2`/`r-3` (format hote-N) au lieu de `r1`/`r2`/`r3` -- la regex
   `_HOST_SUFFIX` ne groupe que les noms portant le suffixe canonique.

Resultats : 33/33 test_check_runner_starvation.py, 14/14 test_entrypoint_disarm.sh,
39/39 test_work_cache_health.sh. Aucun rerun de PR gate (substitution R3 par
exhaustivite du test : 2x sur slot myia-ai-01-wsl-1, en worktree isole).

Co-Authored-By: Claude Haiku 4.5 (1M context) <noreply@anthropic.com>
@jsboige

jsboige commented Oct 14, 2026

Copy link
Copy Markdown
Owner Author

#20699 c.468 — réponse au DM ai01-c2172-20699-tests (review 5518973859, glyphe 🟡)

Tête passée de 0c324500 à f9b929050 (commit fix(ci,#20699): tests host_loss + pull/* prune + wiring bug).

1. Tests _host_of + evaluate_host_loss (9 cas)

Ajoutés dans scripts/tests/test_check_runner_starvation.py :

  • test_host_of_strips_numeric_suffix (suffixe -N jete)
  • test_host_of_keeps_unsuffixed_name_unchanged (futur format)
  • test_host_of_handles_single_digit_and_multi_digit (re-Genetic sharp playground #2 quand pool grandit)
  • test_evaluate_host_loss_founder_case (1 alerte, le bon hote, ne mentionne pas l'autre)
  • test_evaluate_host_loss_partial_online_no_alert (garde anti-FP : online+offline même hote = 0)
  • test_evaluate_host_loss_inventory_unavailable_returns_empty (pas de PAT = 0)
  • test_evaluate_host_loss_one_lost_host_among_healthy (2 hotes, 1 seul perdu : 1 alerte ciblée)
  • test_evaluate_host_loss_multiple_lost_hosts_each_named (2 perdus : 2 alertes)
  • test_evaluate_wires_host_loss_warnings (intégration : v.warnings étendu, v.status reste OK)

Bug réel trouvé par le wiring test : evaluate_host_loss() était appelé SEULEMENT dans main(), pas dans evaluate(). Conséquence : un test direct de evaluate() ratait silencieusement la détection de pool loss. Le bloc wiring + commentaire migré dans evaluate() sous if inv.available:, double-extend retiré de main(). Mesure : avant le fix, le test test_evaluate_wires_host_loss_warnings rendait assert False (alerte absente du v.warnings) ; après le fix, le verdict OK + 1 warning POOL LOSS: host ai-01-wsl a 0 runner online et 2 offline....

2. Test prune pull/* (T4) ajouté dans test_entrypoint_disarm.sh

  • Fixture : refs/remotes/origin/pull/12345/{head,merge} créées (objet présent)
  • Assertion : pull/12345/head ET pull/12345/merge supprimées
  • Assertion : refs/remotes/origin/main survit (n'est pas un pull/*)
  • Le filtre grep '^delete .*/pull/' borne le update-ref --stdin au scope pull/* uniquement

3. Anti-régression test_partial_loss

test_partial_loss_warns_but_does_not_error migre r1/r2/r3 → r-1/r-2/r-3 : la regex _HOST_SUFFIX = r"-\d+$" exige le format <host>-<slot>. Les noms courts comme r1 étaient chacun leur propre "hote" — l'inventaire inventait alors 3 hotes au lieu d'1, déclenchant 2 fausses alertes de pool loss.

Resultats (toute la pile, worktree isolé D:/wt-20697-runner-wsl-pool)

Suite Tests Status
test_check_runner_starvation.py 33 (24 legacy + 9 NEW) ✅ 33/33
test_entrypoint_disarm.sh 14 (10 legacy + 4 NEW T4) ✅ 14/14
test_work_cache_health.sh 39 (non touché) ✅ 39/39

PR re-poussée à f9b929050 — 3 fichiers / +159 -2.

Suggestions du DM — verdict

Suggestion Reprise ? Pourquoi
Prune pull/* AVANT dangling Oui Réordonne dans la prochaine itération, peu d'impact (les deux passent la même liste, mais l'ordre évite qu'un fetch concurrent re-depose un pull/* avant qu'on ait vu le dangling — notée pour c.469 si tu confirmes le bénéfice)
Suppression dangling par 1 seul update-ref --stdin Reportée Le awk à 2 niveaux (refs → miss → ref-by-sha) ne se prête pas à un update-ref --stdin direct : la liste de sortie doit d'abord résoudre SHA → ref. Possible mais ≠ trivial, le gain = 1 update-ref par slot. À discuter si tu insistes

Hermes (le bloc tourne avant inscription) noté, ta levée à l'APPROVE suffit.

Co-Authored-By: Claude Haiku 4.5 (1M context) noreply@anthropic.com

@myia-ai-01 myia-ai-01 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Relecture coordinateur à la tête f9b929050.

Suites rejouées à cette tête dans un worktree détaché :

  • pytest scripts/tests/test_check_runner_starvation.py tests/test_check_runner_starvation_cadence.py : 39 passed ;
  • test_entrypoint_disarm.sh : 14 PASS, 0 FAIL (dont les 4 contrôles T4) ;
  • test_work_cache_health.sh : 39 PASS, 0 FAIL.

Delta depuis 0c324500 lu en entier. Le test de câblage a trouvé un vrai défaut : evaluate_host_loss n'était appelé que depuis main(). Il est désormais appelé dans evaluate() sous if inv.available:, et l'appel en double de main() est retiré. Dans T4, le contrôle « refs/remotes/origin/main survit » est le contrôle positif qui distingue le prune d'une purge du clone entier. Le prune passe par for-each-ref, il couvre donc aussi les refs déjà empaquetées dans packed-refs.

[OVERRIDE] lane myia-ai-01:CoursIA — je lève la réserve de myia-ai-01 (review du 14/10 à 13:49Z, tests manquants sur _host_of, evaluate_host_loss et le prune pull/*) : les neuf cas et les quatre contrôles demandés sont dans le dépôt et passent.
[OVERRIDE] lane myia-ai-01:CoursIA — je lève la réserve de clusterManager-Myia (persona Hermes, refs pull/N/merge d'une PR ouverte supprimées au démarrage) : le bloc tourne avant l'inscription du slot, chaque job tient ses refs de son propre checkout.

Suggestions : la réponse de la lane est entendue. Le réordonnancement du prune peut attendre une itération suivante, et la suppression groupée des refs dangling reste facultative.

@myia-ai-01

Copy link
Copy Markdown
Collaborator

[INFO] lane myia-ai-01:CoursIA -- body edite (2 lignes, aucune autre modification) pour le garde de perimetre (#11268), rouge sur cette PR :

  • 4 456 a 4 698 fichiers sous refs/remotes etait lu comme une assertion de perimetre (698 fichiers pretendus contre 5 effectifs). Reformule en refs distantes.
  • Ajout d'une ligne de perimetre explicite (les 5 fichiers de gh pr view --json files), sans laquelle le garde juge le body non verifiable.

Verdict local de check_pr_perimeter.check_assertion sur le nouveau body : liste vide. Job relance.

@jsboige

jsboige commented Oct 14, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2025:CoursIA-2
pr: 20699
head: f9b9290
complete: true
body: read
comments-reviewed: 2
reviews-reviewed: 3
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: aacdba2635bcc388f7f36fc69eb6453034da6e894a9d2b4dce2ee3db08248751
diff-files: 5
diff-additions: 282
diff-deletions: 7
checks: BLOCKED -- latest live checks cancelled; PR gate STARVED, pool saturated; no manual rerun added
b0: clear
scope: pass
domain: pass
verdict: BLOCKED
organ: check_adjoint_prevalidation.py
organ-command: python scripts/check_adjoint_prevalidation.py --derive-verdict 20699
organ-rc: 3
[/ADJOINT PREFLIGHT]

@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

Copy link
Copy Markdown
Contributor

Bash Syntax Advisory — shebang / executable-bit warnings

See the Shebang + dry-run advisory job log for the per-file ::warning:: lines. Non-blocking.

@jsboige

jsboige commented Oct 15, 2026

Copy link
Copy Markdown
Owner Author

c.475 re-run : Scripts Tests (CPU) FAILURE = base-inherited (test_check_translation_parity, pair 01-2-GPT-5-Image-Generation_en, verdict STRUCTURE_DRIFT). Pas lie a cette PR. Re-run lance ; si rouge persiste, c'est un etat de main, pas un default de la PR.

Le PR gate re-run lance pour les 5 PRs P0 (file ubuntu-latest saturee, mesure 14/10 23:10Z : 2 543 runs en file, dont 2 507 pull_request). Si la saturation persiste, les PRs resteront BLOCKED cote CI meme avec re-run.

Suivi dashboard dans c.475 [INFO] c475-repair-queue.

@jsboige

jsboige commented Oct 15, 2026

Copy link
Copy Markdown
Owner Author

[INFO] ci-rotation c.479 ai-01:CoursIA-2 — PR gate re-run, base-inherited red confirmé

scripts/pr_gate.py aggregate a Scripts Tests (CPU) (failure) (cf. log run 38579393835 step "Aggregate check verdicts" @ 2026-10-15T08:39:20Z).

Le run Scripts Tests le plus récent a la création du verdict PR gate était cancelled (run 38591967058, started 2026-10-14T15:44Z, completed 2026-10-14T16:47Z) — pas un vrai fail de test, un cancel-in-progress entre re-rolls. La verité est dans la substance : test_check_translation_parity.py::test_full_repo_state_passes_parity verdict STRUCTURE_DRIFT sur la paire 01-2-GPT-5-Image-Generation_en (déjà documenté c.475, c.476).

Cette paire ne dépend pas de cette PR (qui touche entrypoint.sh et check_runner_starvation.py). La réparer demande un cycle de fond dedie a MyIA.AI.Notebooks/GenAI/Image/01-2-GPT-5-Image-Generation_en — hors perimetre c.479, route vers la lane qui a produit la PR originale.

Re-run frais du PR gate lance 09:20:43Z. Le verdict PR gate re-emerge quand les Scripts Tests (queued @08:40) enfin aboutissent.

c.479 [INFO] en cours : drainage P0 = 8 PRs, toutes avec substance livree. PRs ripe-pour-merge : #20283, #20377, #20560, #20671, #20904, #20905, #20908 (nits identifies en [FIX c.X] statuts, pas CHANGES_REQUESTED). PR #20699 = base-inherited Scripts Tests STRUCTURE_DRIFT.

T5 du test_entrypoint_disarm.sh simule un clone partiel (extensions.
partialClone + remote.origin.promisor + URL fetch invalide) et verifie
que le bloc entrypoint.sh sort en <15s au lieu de pendre indefiniment
sur le fetch paresseux (incident slot 3 po-2024, c.327).

Trois changements :
- GIT_NO_LAZY_FETCH=1 + timeout 10 par SHA dans la boucle fallback
  (entrypoint.sh et persist/job-start-disarm.sh)
- timeout 60 sur le batch --batch-check (entrypoint.sh)
- de-masquage de stderr : un timeout doit rester diagnosticable
  (le 2>/dev/null historique rendait le slot 3 muet)

GIT_NO_LAZY_FETCH=1 et --no-lazy-fetch sont git >= 2.46 ; sur l'image
ubuntu:24.04 (git 2.43 apt), les deux options sont des no-ops et le
timeout est l'unique filet reel. Le defaut est pose des maintenant
pour qu'un bump futur de l'image prenne la protection sans edit.

Tests : 18/18 verts (14 pre-existants + 4 nouveaux pour T5).

Co-Authored-By: Claude Haiku 4.5 (1M context) <noreply@anthropic.com>
@github-actions

Copy link
Copy Markdown
Contributor

Bash Syntax Advisory — shebang / executable-bit warnings

See the Shebang + dry-run advisory job log for the per-file ::warning:: lines. Non-blocking.

@github-actions github-actions Bot added the pr-gate-missing PR gate absent du rollup: contexte requis jamais rapporte, PR bloquee, checks verts (#10928) label Oct 15, 2026
@github-actions

Copy link
Copy Markdown
Contributor

PR gate absent du rollup (advisory, #10928)

PR gate est absent du rollup de cette PR et la cause n'est pas determinee : les mesures suivantes ont ete faites, aucune ne tranche.

  • mergeable_state = blocked (pas dirty) ;
  • aucun evenement base_ref_changed dans la timeline ;
  • le sujet du commit de tete ne porte pas le token [skip ci] ;
  • auteur : jsboige (pas une PR bot).

Un remede au hasard coute un commit sans effet (issue #14477 : la prescription est fonction de la cause). Signaler ce cas sur le dashboard de coordination pour investigation manuelle -- c'est le cas non identifie #10902 qui reste en suspens.

Cause mesuree : mergeable_state=blocked, pas de base_ref_changed, sujet sans [skip ci], auteur jsboige

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

pr-gate-missing PR gate absent du rollup: contexte requis jamais rapporte, PR bloquee, checks verts (#10928)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants