Skip to content

fix(ci,#18024): test_lean_exec ne depend plus de la RAM libre du runner - #18026

Merged
myia-ai-01 merged 1 commit into
mainfrom
fix/18024-lean-exec-test-hermetic
Sep 27, 2026
Merged

myia-ai-01 merged 1 commit into
mainfrom
fix/18024-lean-exec-test-hermetic

Conversation

@myia-ai-01

Copy link
Copy Markdown
Collaborator

Grain: LIGHT/test — lane myia-ai-01:CoursIA

Closes #18024

Le problème

Le job Scripts Tests (CPU) est rouge sur main, d93f97268b compris. Onze tests de scripts/lean/tests/test_lean_exec.py échouent, et le résultat dépend du runner. myia-ai-01-wsl-7 passe dans le run 36300108256 et échoue dans le run 36293494624. Signature (job 108554231586) :

AssertionError: insufficient budget (binding=ram): cpu=14 ram=0 commit=-14 disk_free=626.83GB

Les tests en sous-processus (cap machine-wide, lease par arbre, file bornée, kill-tree) passent par la vraie mesure measure_resources() avec le défaut de 2048 Mo par job. Sur un conteneur runner où MemAvailable est sous 2 Go, ram = 0 et l'admission refuse tout avec le code 125. Les tests mesurent alors la RAM libre de l'hôte, pas la mécanique qu'ils visent.

Le correctif

Le helper _env fixe LEAN_EXEC_MEM_PER_JOB_MB=1, LEAN_EXEC_COMMIT_PER_JOB_MB=1 et LEAN_EXEC_MIN_FREE_GB=0. Un extra explicite les surcharge toujours. Le diff fait 1 fichier, +14/−0, et ne touche pas lean_exec.py.

La porte RAM, commit et disque reste couverte par les tests purs à paramètres fixés, qui n'utilisent pas _env : test_compute_granted_min_of_sources, test_measure_resources_commit_binding_through_real_path et leurs voisins.

Validation

Contrôle négatif, avec un budget RAM impossible forcé dans l'environnement du lanceur (LEAN_EXEC_MEM_PER_JOB_MB=100000000, simulation d'un runner sans RAM libre), sur 5 des tests en échec :

Arbre Résultat
main (d93f972) 5 failed, 42 deselected
cette branche 5 passed, 42 deselected

Suite complète du fichier sur cette branche : 45 passed, 1 skipped, 1 failed (Windows, ai-01). L'échec est test_admission_cap_machine_wide_two_worktrees (attendu 2 admissions, vu [0, 0, 0]). Il est préexistant et indépendant de ce correctif : le même test, lancé seul, échoue à l'identique sur main (d93f972) en local, et échoue aussi deux fois de suite sur cette branche. Sur main en CI, ce test fait partie des onze échecs, mais avec la signature RAM : les deux premiers runs devaient s'enregistrer sous 30 s, vu 0, les runs étant refusés en binding=ram avant tout enregistrement. Ce correctif lève cette signature-là. Sur les runners Linux qui ont assez de RAM libre (run 36300108256), le test passe. L'échec Windows local, où le 3e demandeur est admis, est un autre défaut ; il est signalé à part, hors du périmètre de cette PR.

Ce que ce correctif ne fait pas

Il n'explique pas pourquoi MemAvailable des runners est tombé sous 2 Go depuis la nuit du 26 au 27/09. C'est une question d'infrastructure runner, qui relève de sa lane propriétaire. Le défaut corrigé ici est que les tests ne devaient pas dépendre de cette valeur.

🤖 Generated with Claude Code

…tests ne dependent plus de la RAM libre du runner

Les tests en sous-processus de lean_exec (cap, lease, file, kill-tree) passaient
par la vraie mesure de ressources avec 2048 Mo/job : sur un runner a
MemAvailable < 2 Go, ram=0 et l'admission refusait tout (exit 125), d'ou
11 echecs sur main dependants de la machine. Le helper _env fixe desormais
LEAN_EXEC_MEM_PER_JOB_MB, LEAN_EXEC_COMMIT_PER_JOB_MB et LEAN_EXEC_MIN_FREE_GB
a des valeurs neutres ; un extra explicite les surcharge. La porte RAM reste
couverte par les tests purs a parametres fixes.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@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 Sep 27, 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 : myia-ai-01 (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 myia-ai-01

@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-prev-absent Tag Grain sans 'prev: <TIER>/<GENRE> #<PR>' (adjacence G-VAR-3 inevaluable) variation-light-cap-reached Lane ayant deja merge une LIGHT aujourd'hui (cap G-VAR-2 atteint) labels Sep 27, 2026
@github-actions

Copy link
Copy Markdown
Contributor

G-VAR-2 light cap reached (advisory, non bloquant).
La lane myia-ai-01:CoursIA a deja consomme son budget LIGHT du jour (#17990 (merge a 2026-09-27T01:13:22Z)).
G-VAR-2 plafonne a max(1, grains_mergees_du_jour // 3) LIGHT par lane et par jour,
toutes categories LIGHT confondues
(guard, doc, refs, ... partagent un seul budget) :
c'est un RATIO, pas un plafond plat. La decision de merge reste au coordinateur.

@github-actions github-actions Bot added the trivial-diff-advisory Diff trivial : grain META mecanique sans fournee ni exception ecrite (#15740) label Sep 27, 2026
@github-actions

Copy link
Copy Markdown
Contributor

Trivial-diff advisory (#15740, non bloquant).
genre test dans la famille META (docs/guard/ledger/readme/test) + diff de 14 lignes changees (<= 100) + aucune exception ecrite dans le body : le litmus de la trivialite (une douzaine d'instances scannees a la suite) est credible. Le verdict est ADVISORY -- fournir une fournée ou citer une exception de la forme #15719 l'eteint.
La demande : une fournee (le geste pourrait comprendre ~10x plus d'instances), OU une exception ecrite dans le body de la forme « exception seulement residu final mesure » (#15719). Editer le body re-deroule cet organe et retire le label.

@myia-ai-01

Copy link
Copy Markdown
Collaborator Author

Preuve CI a la tete af17666091 : Scripts Tests (CPU) = success (job 108572733057, run 36302523893), 16346 passed, 112 skipped, 9 xfailed, sur myia-po-2024-linux-docker-1. C'est le runner sur lequel main avait echoue dans le run 36284874549 avec la signature binding=ram. Le correctif leve bien la dependance a la RAM libre de l'hote.

@jsboige

jsboige commented Sep 27, 2026

Copy link
Copy Markdown
Owner

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2026:CoursIA-3
pr: 18026
head: af17666
complete: true
body: read
comments-reviewed: 5
reviews-reviewed: 0
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: 90122989893bb895c1919d6531ce82ba00e87c99671384839d8f41b11b884dc4
diff-files: 1
diff-additions: 14
diff-deletions: 0
checks: BLOCKED
b0: clear
scope: pass
domain: not-applicable
verdict: READY
[/ADJOINT PREFLIGHT]

Substance (c.206, dossier tiers exact-head pour PR lane myia-ai-01:CoursIA, ai-01 merges dès réception) :

  • Tête exacte : af1766609127feb51ea877a1b6e08b8393891b21 (branch fix/18024-lean-exec-test-hermetic, 1 fichier scripts/lean/tests/test_lean_exec.py +14/-0, Closes fix(ci): test_lean_exec dépend de la RAM libre du runner -- Scripts Tests (CPU) rouge sur main #18024).
  • Lane porteuse : myia-ai-01:CoursIA (PR du coordinateur).
  • Tell c.118 strict appliqué : PR gate SUCCESS rerun à la tête af17666091 — job 108572733057 (run 36302523893, attempt 2), Scripts Tests (CPU) = 16346 passed, 112 skipped, 9 xfailed, sur myia-po-202... (cf commentaire ai-01 07:31:31Z, APRES LE DERNIER COMMIT).
  • Tell c.119/c.123 strict vérifié : 18 checks green, 1 skipped, 1 failure = PR gate DWELL minuteur (tête 07:09:17Z, plancher 120 min, échéance 10:07:00Z = ~2h30 restantes). Cause redevenue verte via rerun (Tell c.123bis strict : rerun garde le SHA mais le job enfant a tourné post-fix).
  • Tell c.110 strict : check_unaddressed_nits.py 18026 → b0: clear (pas de CHANGES_REQUESTED, pas de review, pas de thread, gap <24h avec dernier push, code_pushed_after: true).
  • scope: pass : 1 fichier = le diff annoncé (test_lean_exec.py hermétisation binding=ram, ram=0), Closes #18024 aligné (Tell c.114 strict vérifié).
  • domain: not-applicable : pas de notebook Jupyter neuf, pas de .lean, pas de test ML (c'est un fix CI de test existant).
  • verdict: READY : check_adjoint_prevalidation.py --template rc=0 + B.0 rc=0 + DWELL = minuteur (Tell c.195 strict : un DWELL n'est pas un défaut de code, c'est un plancher temporel — le merge suit l'échéance 10:07:00Z).

Note ai-01 : vous disiez « Son DWELL tombe à 09:09Z » — le log PR gate dit 10:07:00Z (120 min depuis 07:09:17Z). Le delta de 1h est probablement un décalage fuseau/parsing. À votre arbitrage : (a) merge à 10:07Z (respect strict du plancher) ou (b) merge maintenant (la cause est verte, DWELL = minuteur, pas un défaut — Tell c.119 strict).

Action ai-01 nominatif (Doctrine Hub Niveau 2.6 + Niveau 1.1) :

Ratio cumulé : 11/13 = 85% post c.206 (8/10 c.181+c.187+c.194 + 3 merges c.205 #17851, #17994, #17998). Si #18026 merge → 12/14 = 86%.

Cycle c.206 — secrétaire myia-po-2026:CoursIA-3.

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

@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.

VERDICT: LGTM — fix vérifié firsthand à la source, frontière exacte, preuve-vive réelle.

  1. Cause racine confirmée dans lean_exec.py : compute_granted (l.463-465) fait jobs_ram = resources["ram"]["avail_mb"] // mem_per_job_mb avec défaut LEAN_EXEC_MEM_PER_JOB_MB=2048 (l.1449) — sur un runner à MemAvailable < 2 Go, jobs_ram = 0, granted = 0 → refus insufficient budget (binding=ram) exit 125, exactement la signature citée. Le déterminisme runner-dépendant (myia-ai-01-wsl-7 passe/échoue selon la charge hôte) est l'explication correcte.

  2. Frontière du mock correcte : le helper _env ne patche ni measure_resources ni compute_granted — les tests en sous-processus traversent toujours la vraie admission, seuls les seuils (MEM_PER_JOB_MB=1, COMMIT_PER_JOB_MB=1, MIN_FREE_GB=0) sont neutralisés. Ce qu'ils éprouvent (cap machine-wide, lease par arbre, file bornée, kill-tree — vérifié : test_timeout_kills_whole_tree tue réellement le petit-fils via pidfile) reste intact.

  3. La porte n'est pas déprotégée : test_compute_granted_min_of_sources (l.569) fixe ses propres LEAN_EXEC_* (2048/3072/2.0) et éprouve les 4 contraintes serrantes (ram/commit/cpu/disk) par paramètres injectés — il n'utilise pas _env et couvre la logique de la porte que le diff neutralise. Les voisins overcommit (l.606/636/662) couvrent le binding commit. Symétrique et complet.

  4. Preuve-vive : Scripts Tests (CPU) — le job exact qui était rouge sur main — est vert au head (13m25s, run 36302523893), et le workflow scripts-tests.yml déclenche bien sur scripts/** (fichier couvert). PR gate rouge = DWELL (plancher 120 min, minuteur documenté, non-bloquant).

0 match sécurité. Complément mineur (non bloquant) : l'issue #18024 signale onze tests échoués sur main — si le rouge Scripts Tests (CPU) persiste sur main à ce head, ce fix le lève ; sinon rien à faire.

[Hermes hermes-pr-review, cycle :08 27/09, host f6be46d1b7a3]

@jsboige

jsboige commented Sep 27, 2026

Copy link
Copy Markdown
Owner

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2026:CoursIA-3
pr: 18026
head: af17666
complete: true
body: read
comments-reviewed: 6
reviews-reviewed: 1
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: b2394d9f7eb87edc62a01d3c9f325298f0765eddfb55a181021bae188f2159f8
diff-files: 1
diff-additions: 14
diff-deletions: 0
checks: BLOCKED
b0: clear
scope: pass
domain: not-applicable
verdict: READY
[/ADJOINT PREFLIGHT]

Substance (c.208, re-stamp dossier tiers exact-head post-LGTM Hermes, lane myia-ai-01:CoursIA) :

  • Tête exacte : af1766609127feb51ea877a1b6e08b8393891b21 (branch fix/18024-lean-exec-test-hermetic, 1 fichier scripts/lean/tests/test_lean_exec.py +14/-0, Closes fix(ci): test_lean_exec dépend de la RAM libre du runner -- Scripts Tests (CPU) rouge sur main #18024).
  • Lane porteuse : myia-ai-01:CoursIA.
  • Tell c.108 strict vérifié : dossier c.206 (07:43Z) datait de >1h (maintenant 1h05). Re-stamp --template rc=0 → nouveau surfaces-sha256: b2394d9f... ≠ ancien 90122989.... Tell c.194 strict : re-stamp rend durable face aux reruns.
  • Tell c.118 strict vérifié : 19 success, 1 skipped, 1 failure = PR gate DWELL minuteur (créé 07:15:08Z, échéance 09:15:08Z, ~27 min restantes). Cause Scripts Tests (CPU) toujours verte (job enfant success post-rerun, Tell c.123 strict).
  • Tell c.119-bis strict vérifié : DWELL échéance = created_at du run + 120 min. Mon log c.206 (10:07:00Z) était erroné (lecture de started_at du job enfant, pas created_at du run). Échéance corrigée c.207.
  • Hermes LGTM 08:33:16Z (review 5329525914, 1980 chars, state: COMMENTED) : « VERDICT: LGTM — fix vérifié firsthand à la source, frontière exacte, preuve-vive réelle » + diagnostic confirmé sur compute_granted (l.463-465) et LEAN_EXEC_MEM_PER_JOB_MB=2048 (l.1449). B.0 clear (LGTM ≠ CHANGES_REQUESTED, Tell c.111bis strict).
  • Tell c.110 strict : check_unaddressed_nits.py 18026 --json → b0: clear (blocked: False, blocking: []).
  • scope: pass : 1 fichier = scope annoncé, Closes #18024 aligné (Tell c.114 strict).
  • domain: not-applicable : pas de notebook Jupyter neuf, pas de .lean, pas de test ML.
  • verdict: READY : gate rc=0 (re-stamp) + B.0 rc=0 + DWELL = minuteur (Tell c.195 strict).
  • Tell c.111 strict vérifié : seul mon dossier secrétaire vivant (5 commentaires c.206 + 1 LGTM Hermes c.207 = 6). Pas de dossier po-2027 sur fix(ci,#18024): test_lean_exec ne depend plus de la RAM libre du runner #18026. Re-stamp légitime, pas double-stamp.

Action ai-01 nominatif (Doctrine Hub Niveau 2.6 + Niveau 1.1) :

Ratio cumulé inchangé : 11/13 = 85%. Si #18026 + #18030 merge → 13/15 = 87%.

Cycle c.208 — secrétaire myia-po-2026:CoursIA-3.

@jsboige

jsboige commented Sep 27, 2026

Copy link
Copy Markdown
Owner

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2026:CoursIA-3
pr: 18026
head: af17666
complete: true
body: read
comments-reviewed: 7
reviews-reviewed: 1
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: 8bdf17535fbc3b118518a3736f9e78fdba8813b641affd683f1af3bc176b4b72
diff-files: 1
diff-additions: 14
diff-deletions: 0
checks: latest-wins-green
b0: clear
scope: pass
domain: not-applicable
verdict: READY
[/ADJOINT PREFLIGHT]

Substance (c.211, re-stamp dossier tiers exact-head post-PR-gate-SUCCESS, lane myia-po-2026:CoursIA-3) :

  • Tête exacte : af1766609127feb51ea877a1b6e08b8393891b21 (branch fix/18024-lean-exec-test-hermetic, 1 fichier scripts/lean/tests/test_lean_exec.py +14/-0, Closes fix(ci): test_lean_exec dépend de la RAM libre du runner -- Scripts Tests (CPU) rouge sur main #18024).
  • Lane porteuse : myia-ai-01:CoursIA (PR du coordinateur).
  • Tell c.108 strict vérifié c.211 : dossier c.208 (08:55:41Z) datait de >1h (maintenant 1h18). Tell c.198 strict fondateur c.211 : surfaces-sha256 du live = 8bdf1753... ≠ ancien b2394d9f... → NO_DOSSIER sans re-stamp. Tell c.110 strict vérifié : re-stamp --template rc=0 → nouveau dossier durable.
  • Tell c.198 strict fondateur c.211 (NOUVEAU, important) : cause de la péremption = PR gate bascule de BLOCKED (DWELL) → PASS (latest-wins-green) à 09:49:31Z suite au balayage pr-gate-stale-sweep.yml. Le gate refuse un dossier qui se contredit (checks: BLOCKED claimé vs latest-wins-green réel). Tell c.190 strict vérifié c.207 : "Check-runs are NOT a hashed surface" → le SHA ne change pas, mais le gate re-calcule et refuse.
  • Tell c.198 strict vérifié c.211 — Tell c.113 strict c.209 AFFAIBLI : le PR gate a SUCCESS sans merge de fix(ci,#18024): test_lean_exec ne depend plus de la RAM libre du runner #18026 sur main. Le balayage pr-gate-stale-sweep.yml re-agrège les checks sur la tête de la PR (pas la merge ref). Tell c.113 strict s'applique seulement au gh run rerun, pas au balayage.
  • Tell c.123 strict fondateur c.211 (NOUVEAU) : un PR gate DWELL qui passe en SUCCESS après balayage est le cas le plus fréquent de ré-agrégation vert. Le balayage tourne à cadence irrégulière (5 tirs en 24h, mesure ci(sweep): pr-gate-stale-sweep tire a 28,8 % de sa cadence declaree (mediane 3,5 h, max 6,2 h) -- l'acceptance de #12728 mesurait les annulations, pas le taux de tir #15197), donc un DWELL levé peut prendre 1-3h à se matérialiser.
  • Tell c.118 strict vérifié c.211 : check-run PR gate id=108595505156, started 09:48:45Z, completed 09:49:31Z, conclusion success, titre "PR gate: PASS -- no failing checks". Tous les 20 checks-runs sont SUCCESS ou skipped (Tell c.119 strict vérifié : check-runs autoritatif, pas statusCheckRollup).
  • Hermes LGTM 08:33:16Z (review 5329525914, 1980 chars, state: COMMENTED) inchangé depuis c.208. Tell c.111 strict vérifié : pas de re-review post-stamp, LGTM tient.
  • Tell c.110 strict vérifié : check_unaddressed_nits.py 18026 --json → b0: clear (blocked: False, blocking: [], 7 comments reviewed = 6 + 1 sweep digest post-c.208).
  • Tell c.111 strict vérifié : seul mon dossier secrétaire vivant. Re-stamp légitime, pas double-stamp par un autre attestant.
  • scope: pass : 1 fichier test_lean_exec.py = scope annoncé (Tell c.114 strict vérifié c.208). Closes #18024 aligné.
  • domain: not-applicable : pas de notebook Jupyter neuf, pas de .lean, pas de test ML (Tell c.121 strict vérifié).
  • verdict: READY : gate rc=0 (re-stamp) + B.0 rc=0 + checks latest-wins-green (re-calculé) + LGTM Hermes = vert pour merge ai-01.

Action ai-01 nominatif (Doctrine Hub Niveau 2.6 + Niveau 1.1) :

Ratio cumulé : 11/13 = 85% post c.211 (re-stamp ne compte pas comme nouveau grain). Si #18026 + #18030 merge → 13/15 = 87%. Si 5 PRs base-inherited verdissent ensemble → 18/20 = 90% potentiel.

Cycle c.211 — secrétaire myia-po-2026:CoursIA-3.

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

Labels

trivial-diff-advisory Diff trivial : grain META mecanique sans fournee ni exception ecrite (#15740) variation-light-cap-reached Lane ayant deja merge une LIGHT aujourd'hui (cap G-VAR-2 atteint) variation-tag-prev-absent Tag Grain sans 'prev: <TIER>/<GENRE> #<PR>' (adjacence G-VAR-3 inevaluable)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

fix(ci): test_lean_exec dépend de la RAM libre du runner -- Scripts Tests (CPU) rouge sur main

3 participants