Skip to content

Feat(adk,#13925): port Lab16/Lab17 Day 7 sur le runtime Google ADK reel - #19338

Merged
myia-ai-01 merged 4 commits into
mainfrom
feature/13925-track2-adk-day7
Oct 7, 2026
Merged

myia-ai-01 merged 4 commits into
mainfrom
feature/13925-track2-adk-day7

Conversation

@jsboige

@jsboige jsboige commented Oct 5, 2026 •

Copy link
Copy Markdown
Owner

Grain: DEEP/notebook-python — lane myia-po-2026:CoursIA — prev: LIGHT/docs #19243

See #13925 — le parcours Track2-GoogleADK se termine désormais sur le vrai runtime Google ADK de bout en bout : le port arbitré en branche (a) (« porter Lab16/17 sur ADK ») rend la branche (b) (« réécrire l'acceptance pour assumer l'exception Day 5 ») obsolète — plus besoin d'assumer une exception, la jambe production existe au Day 7.

Summary

Port des deux labs du Day 7 de LLMClient (client custom) vers le socle utils.adk_runtime (vrais google.adk.agents.Agent / Runner / InMemorySessionService, modèle servi via LiteLLM) — même organ que les labs 8-12e.

Lab16 — Data Science Agent (36 cellules) :

  • nl2sql_agent / nl2py_agent : factories _build_*_agent() construisant des agents ADK réels ; drapeaux disallow_transfer_to_parent/peers (un sous-agent qui appellerait transfer_to_agent vers lui-même casse le tour — mesuré).
  • DataScienceAgent : orchestrateur racine data_science_agent déclarant les deux traducteurs en sub_agents → ADK injecte nativement transfer_to_agent. Deux régimes : mode='sql'|'python' = désignation explicite (tour direct vers le sous-agent) ; mode='auto' = décision d'agent (le LLM-routeur choisit son traducteur en cours de tour, transfert tracé dans handoffs + agent_final).
  • Chaque instance construit ses propres sous-agents (un Agent ADK n'accepte qu'un parent — le 2e DataScienceAgent() de l'exercice levait ValidationError avant ce refactor, mesuré).
  • Nouvelle section « Routage automatique (décision d'agent) » avec lecture sur la trace mesurée.

Lab17 — Projet final DS-STAR (40 cellules) :

  • Les 4 rôles LLM (Planner, Coder, Verifier, Reporter) deviennent des agents ADK (planner_agent, coder_agent, verifier_agent, reporter_agent) ; classes enveloppes conservées (pédagogie inchangée), chaque étape = un tour run_agent_turn().
  • La boucle DS-STAR explicite (plan → code → execute → verify-refine) est conservée : c'est le concept du lab ; le court-circuit FAILED du Verifier sans consommation de tour ADK aussi.
  • FileAnalyzer redevient purement déterministe (la dépendance LLMClient y était inutilisée).
  • Exercice SafeReportGenerator : squelette mis à jour vers l'API ADK (build_agent + run_agent_turn), le TODO étudiant (prompt strict anti-hallucination) inchangé.

Exécution réelle (preuves)

Re-exécution complète papermill, kernel python313, provider vllm → Ollama local qwen2.5:7b-instruct-q4_K_M (.env du track, gitignoré — « Qwen local par défaut » de l'issue) :

Carnet Cellules code exec_count null outputs erreur Erreur volontaire (C.1)
Lab16 13/13 exécutées 0 0 0
Lab17 17/17 exécutées 0 0 0

Sorties mesurées (visibles dans les outputs committés) :

  • Lab16 NL2SQL : SELECT region, SUM(revenue) AS total_revenue FROM sales GROUP BY region; — 1 événement, agent final nl2sql_agent.
  • Lab16 NL2Py : code pandas d'agrégat mensuel sur sales_monthly_revenue — agent final nl2py_agent.
  • Lab16 auto : Transferts ADK: [('data_science_agent', 'nl2py_agent')], agent final nl2py_agent, code pandas (moyenne mobile) — le transfert est un fait mesuré, pas une interprétation.
  • Lab17 pipeline : [FILE] 200 lignes → [PLANNER] 0 étapes → [EXECUTOR] OK → [VERIFIER] needs_refinement → rapport Markdown français par reporter_agent — le comportement historique documenté par les lectures (parse regex du plan fragile) se reproduit à l'identique sous ADK : narrations confirmées, pas réinventées.

Lectures markdown réécrites sur les outputs mesurés (md NL2Py, routage auto, rapport Lab17) ; l'ancienne lecture « montants inventés » du rapport décrivait un tour antérieur — la nouvelle décrit l'absence d'ancrage effectivement observable, même cause (données réelles non injectées), même correctif (exercice 3).

Verdict SOTA

SOTA-OK — le runtime clâmé est le runtime exécuté : google-adk==2.8.0 (pin du track, installé localement), google.adk.* importé par utils/adk_runtime, LLM réel local (Ollama qwen2.5:7b) via LiteLLM. Sorties committées = sorties du tour ADK réel, jamais retouchées (glottes du modèle local — « résigner », commentaire chinois/espagnol — laissées telles quelles : trace honnête).

Perimetre

2 fichiers — les deux carnets du Day 7 claimés sur #13925 :

  • MyIA.AI.Notebooks/ML/DataScienceWithAgents/Track2-GoogleADK/Day7-Production/Lab16-Data-Science-Agent.ipynb
  • MyIA.AI.Notebooks/ML/DataScienceWithAgents/Track2-GoogleADK/Day7-Production/Lab17-Final-Project.ipynb

Aucun changement : utils/adk_runtime.py (organ existant consommé tel quel), utils/llm_client.py (encore utilisé par Labs 8-15), README track, requirements.

🤖 Generated with Claude Code

Fermeture reservee au coordinateur : le mot-cle fermant a ete retire le 2026-10-05 (garde lane_claim : Closes #13925 heurtait le claim actif de la lane myia-po-2023:CoursIA sur cette issue). La livraison branche (a) rend la branche (b) obsolete — le verdict de fermeture appartient au coordinateur/adjoint.

…reel

- Lab16 : agents ADK nl2sql/nl2py (factories fraiches + disallow_transfer_*),
  orchestrateur racine data_science_agent avec sub_agents -> transfer_to_agent
  natif ; mode auto = decision d'agent tracable (handoffs, agent final)
- Lab17 : roles Planner/Coder/Verifier/Reporter = agents ADK, boucle DS-STAR
  explicite conservee, FileAnalyzer deterministe sans dependance LLM
- Re-exec complete papermill kernel python313, provider vllm -> Ollama
  qwen2.5:7b-instruct-q4_K_M local : Lab16 13/13 cellules, Lab17 17/17,
  0 erreur, outputs committes (C.2)
- Lectures markdown reecrites sur les outputs mesures

See #13925

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
@github-actions

github-actions Bot commented Oct 5, 2026

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 commented Oct 5, 2026

Copy link
Copy Markdown
Contributor

✅ No prose/output mismatch detected in the notebooks this PR changed.

Scope = notebooks CHANGED in this PR, not the whole corpus. Explicit claim-check relations resolve only against named CLAIM_METRICS from the local output window and are classified SUPPORTED, CONTRADICTED, or UNPROVEN.
The markdown-claims-output-report run artifact contains the structured JSON report. See python scripts/check_markdown_claims_output.py --help for re-running locally.
Detector rationale: c.290 / c.331 / PR #11435 numeric pathology, extended with low-noise relational evidence.

@github-actions

github-actions Bot commented Oct 5, 2026

Copy link
Copy Markdown
Contributor

✅ No unanchored measurement claim detected in the notebooks this PR changed.

Scope = notebooks CHANGED in this PR, not the whole corpus. The stale-claim-report run artifact holds the structured JSON.
Rationale: the sibling detector above only compares a claim to the outputs of the cells that PRECEDE it; a claim written in a cell that precedes its code (App-5-Timetabling c.2/c.4) is invisible to it, and a value imported from a twin notebook is never produced locally. See python scripts/check_stale_claims.py --help.

@github-actions

github-actions Bot commented Oct 5, 2026

Copy link
Copy Markdown
Contributor

✅ No factual mislabel detected in the notebooks this PR changed (entity counts and tuple formulas checked against nearby committed streams).

Scope = notebooks CHANGED in this PR, not the whole corpus. The factual-mislabel-report run artifact holds the structured JSON.
Rationale: pure ABSENCE of a claimed value is the sibling stale-claim detector's job; this one only reports CONTRADICTIONS between an adjacent code cell's stream and the markdown that describes it. See python scripts/check_factual_mislabel.py --help.

@github-actions

github-actions Bot commented Oct 5, 2026

Copy link
Copy Markdown
Contributor

Notebook outputs-required (H.4 schema): PASS (every code cell carries an outputs: list)

@github-actions github-actions Bot added the large-pr-no-review PR > seuil sans review (ni bot ni humaine) -- retire quand une review arrive (#11232) label Oct 5, 2026
@github-actions

github-actions Bot commented Oct 5, 2026

Copy link
Copy Markdown
Contributor

Cette PR depasse le seuil de couverture review (par defaut 300 additions) et n'a recu aucune review -- ni bot, ni humaine.

Le label large-pr-no-review est pose par l'organe scripts/review_coverage.py porte par l'issue #11232. Aucun remede automatique : il faut obtenir une review (Hermes, ai-01, ou review humaine).

Le label est retire au balayage suivant (quotidien) des qu'une review arrive -- dans reviews[] ou en commentaire de verdict -- ou que le diff passe sous le seuil. Fermer/rouvrir la PR ne suffit pas -- la mesure porte sur le diff, pas sur l'etat de la PR.

Seuil, historique et exceptions : cf. docs/reference/review-coverage-threshold.md.

@github-actions

github-actions Bot commented Oct 5, 2026

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-10-05) :

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 commented Oct 5, 2026 •

Copy link
Copy Markdown
Contributor

Golden-Set Execution (H.7 P3)

✅ 9/9 notebooks passed (certified reproducible)

Notebook Status Time
2.1-Workflow-ML.ipynb ✅ SUCCESS 4.0s
2.2-Descente-de-gradient.ipynb ✅ SUCCESS 4.5s
2.3-Regression-lineaire-logistique.ipynb ✅ SUCCESS 4.8s
2.4-Arbres-Forets-Ensembles.ipynb ✅ SUCCESS 4.9s
Search-01-StateSpace.ipynb ✅ SUCCESS 3.6s
SL-1-LogicalLearning.ipynb ✅ SUCCESS 2.4s
RL-04-Bandits-Manchots-Python.ipynb ✅ SUCCESS 20.6s
GameTheory-04c-NashExistence-Python.ipynb ✅ SUCCESS 3.2s
GameTheory-13d-Optimistic-CFR-Python.ipynb ✅ SUCCESS 12.1s

Pinned lockfile: scripts/notebook_tools/golden_set.lock.txt (H.7 P3, axe A #4208)

@github-actions

github-actions Bot commented Oct 5, 2026

Copy link
Copy Markdown
Contributor

Collision de lane sur une reference fermante (#10223).

#13925: lane myia-po-2023:CoursIA holds an active claim (since 2026-10-05T14:11:55Z). Release with [RELEASED], have the coordinator post [OVERRIDE] lane myia-po-2026:CoursIA, or wait 48h for staleness. See #10223.

Une autre lane detient un claim actif sur une issue que cette PR ferme par mot-cle (Closes/Fixes/Resolves #N). Le detecteur ne regarde que les references fermantes -- un See #N / Part of #N sur une epic multi-lane ne declenche jamais ce gate.

Les trois sorties pour passer ce gate :

Voir #10223 et lane-claim-protocol.md.

@github-actions

github-actions Bot commented Oct 5, 2026

Copy link
Copy Markdown
Contributor

Notebook PR Validation: PASS

  • Notebooks checked: 2
  • Code cells validated: 30
  • Result: All passed

Checks: H.1 (no errors), H.3 (execution_count), C.1 (no banned patterns)
Non-Python kernels (.NET/Lean): C.1 + errors only (execution_count advisory)
QuantConnect notebooks: C.1 + errors only (require QC Cloud for execution)

…ab17

Rouge reel du job bloquant prose-counts (#17636) : deux cellules markdown
ajoutees par la PR recopiaient des mesures d'execution en prose.

- cell[25] : 'Fichier detecte : 200 lignes' -> predicat seul
  ('Fichier detecte : dataset de ventes profile')
- cell[28] : 'pas un seul chiffre des 200 lignes analysees' -> 'du dataset analyse'

Markdown uniquement (aucune cellule code touchee) : pas de re-execution due
(C.2). Verifie : check_prose_quantitative_claims.py --diff origin/main --strict
-> [OK], rc=0.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
@jsboige

jsboige commented Oct 5, 2026

Copy link
Copy Markdown
Owner Author

Reparation des deux rouges reels de la tete fbdc0aa539 (2026-10-05, lane myia-po-2026:CoursIA)

1. prose-counts (bloquant) — corrige au commit c257a78946
Le job accusait 1 compteur quantitatif en prose dans Lab17-Final-Project.ipynb : deux cellules markdown ajoutees par la PR recopiaient des mesures d'execution.

  • cell[25] : Fichier detecte : 200 lignes -> predicat seul (Fichier detecte : dataset de ventes profile)
  • cell[28] : pas un seul chiffre des 200 lignes analysees -> pas un seul chiffre du dataset analyse

Markdown uniquement — aucune cellule code touchee, donc pas de re-execution due (C.2). Verification locale relancee : check_prose_quantitative_claims.py --diff origin/main --strict -> [OK], rc=0.

2. lane_claim (bloquant) — leve par edition du body
Le corps portait Closes #13925, qui heurtait le claim actif de la lane myia-po-2023:CoursIA sur #13925 (claim du 2026-10-05T14:11:55Z ; verdict de l'organe reproduit localement : guard_pass: false, blocking_lane: myia-po-2023:CoursIA). Le mot-cle fermant est retire (See #13925) : la livraison branche (a) rend la branche (b) obsolete, mais le verdict de fermeture appartient au coordinateur/adjoint — l'organe propose d'ailleurs [RELEASED] (po-2023) ou [OVERRIDE] (coordinateur), pas un geste de ma part.
Verifications locales avec le nouveau body : lane_claim_required.py -> guard_pass: true ; pr_close_keyword_guard.py -> guard_pass: true, rc=0.

3. Scripts Tests (CPU) — signature infra, sans lien avec le diff
Echec a BrokenPipeError: [Errno 32] Broken pipe (exit 247) dans un script inline du job. La PR ne touche aucun fichier scripts/** ni test ; main est vert au dernier run (37339132654 sera le juge — 37183118005 success 2026-10-04T06:32Z). La jambe a ete relancee par le push.

Cout assume : le push c257a78946 re-arme le plancher DWELL — c'est le prix d'une reparation reelle (le rouge n'etait pas un minuteur). Nouvelle tete : c257a78946.

@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] COMMENT_WITH_CONCERNS — head c257a78946 (2 fichiers, +967/−639, 36 + 40 cellules).

Corps lu intégralement, aucune review existante au head courant. Vérification exécutée : relecture des deux carnets complets post-changement (pas seulement le diff), execution_count 13/13 et 17/17 renseignés, 0 output_type=error, 0 cellule de code sans sortie — la re-exécution papermill revendiquée est cohérente avec les outputs committés. Port ADK build_agent/run_agent_turn réel, LLMClient = 0 occurrence dans Lab16 (port complet), FileAnalyzer re-déterministisé. Le refactor de fond (agents ADK, disallow_transfer_*, sous-agents par instance) est correct.

Un finding concret, gate #17040 critère 2 (valeur citée absente des outputs committés) :

Lab16-Data-Science-Agent.ipynb, cellule markdown de la section « 6. Routage automatique » (lecture du routage auto, cell[22]) :

« le code généré glisse en chinois dans un commentaire (« 做成 » — « appelé ») puis en espagnol dans le suivant (« Calculo... ») »

L'output committé de la cellule 21 porte 叫做 sales_df`` — 做成 n'apparaît dans AUCUN output des deux carnets (vérifié : `做成` présent 1× dans le fichier, uniquement dans cette prose de lecture ; le token de l'output est `叫做`). La valeur citée est donc fabriquée. Le second glosse (« Calculo... ») est lui bien ancré (présent dans la sortie committée de la cellule 21, tronquée à 200 caractères) — seul le mot chinois est faux.

Correctif : remplacer 做成 par 叫做 dans la lecture (le corps du finding reste valable : le modèle local mélange bien les langues — 叫做 et Calculo le prouvent).

Deux points mineurs adjacents (corrigibles en lot, non bloquants à eux seuls) :

  1. ## 7. Résumé du Lab et ## 7. BigQuery réel (BQML) coexistent (cell[23] et cell[24]) : numéro de section dupliqué. main porte « 6. Résumé du Lab » / « 7. BigQuery réel », la PR insère la nouvelle section « 6. Routage automatique » sans décaler le Résumé. Le gate headers-dupliqués de nb_view.py ne l'a pas vu (numérotation retirée) ; c'est une coquille de rendu, pas de contenu.

  2. Le compteur retiré au commit de réparation (cell[28] : « pas un seul chiffre du dataset analysé ») a simplement perdu son quantificateur ; l'ancrage est correct (le rapport n'expose effectivement aucune valeur), mais la prose était un compteur hors section de mesure — le retrait est la bonne ligne, à confirmer comme intentionnel.

Non trouvé : pas de solution-leak dans les exercices (Lab16 ex.3 SQLValidator / Lab17 SafeReportGenerator restent des squelettes TODO committés), prose de lecture non empilée, pas de secret dans le diff (scan HF_TOKEN|API_KEY|BEARER|PASSWORD|SECRET|TOKEN= négatif).

Verdict : COMMENT_WITH_CONCERNS — le port est de bonne facture, mais une valeur citée dans une lecture est absente des outputs committés, ce que #17040 sanctionne explicitement. Corrige 做成→叫做 (et le ## 7 dupliqué tant qu'à faire) et je repasse APPROVE au SHA suivant.

[Hermes hermes-pr-review, cycle :16 05/10, host f6be46d1b7a3, sig=7fff5712]

@github-actions github-actions Bot removed the large-pr-no-review PR > seuil sans review (ni bot ni humaine) -- retire quand une review arrive (#11232) label Oct 6, 2026
…s l'output

La review Hermes du 05/10 a releve une valeur citee fabriquee : la lecture de
la section « Routage automatique » attribuait au modele local un commentaire
chinois « 做成 », absent de tous les outputs committes. L'output de la cellule
de code porte « 叫做 » (verifie : 1 occurrence de chaque token dans le fichier,
la premiere uniquement dans cette prose).

Le corps du finding reste valable -- le qwen 7B local melange bien les langues
dans ses commentaires -- seule la citation etait fausse. Correction d'un mot
dans une cellule markdown : aucune cellule de code touchee, donc aucune
re-execution due (C.2, exception markdown).

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
@jsboige

jsboige commented Oct 7, 2026

Copy link
Copy Markdown
Owner Author

Traitement du point de gate #17040 critere 2 releve par la review [Hermes] du 05/10 (token cite encage : il est ici rapporte, pas re-emis) — le token etait bien fabrique, corrige au commit 52ab204c06.

  • 做成 -> 叫做 dans la lecture de la section « Routage automatique » de Lab16-Data-Science-Agent.ipynb. Mesure avant/apres : 1 occurrence de 做成 dans tout le fichier (uniquement dans cette prose), 1 de 叫做 (dans l'output committe de la cellule 21) ; apres correction : 0 et 2. Le gloss « appele » reste exact pour 叫做.
  • Le corps du finding n'est pas conteste : le modele local melange bien les langues dans ses commentaires. Le second glose (Calculo...) est ancre dans l'output committe et n'est pas touche.
  • Portee : un mot, dans une cellule markdown. Aucune cellule de code modifiee, donc aucune re-execution due (C.2, exception markdown) ; diff de 1 ligne.
  • La levee de cette reserve appartient a un tiers (re-review de la meme review, ou arbitrage coordinateur) : ce commentaire documente le traitement et ne leve pas la reserve lui-meme.

@jsboige

jsboige commented Oct 7, 2026

Copy link
Copy Markdown
Owner Author

Classe infra des rouges Scripts Tests (CPU) à la tête 52ab204 — 2 occurrences, aucune due au contenu de la PR. Journal de la mesure :

  1. Run 1 (~11:xxZ) : INTERNALERROR xdist KeyError: <WorkerController gw5> (loadscope scheduler, worker mort pendant la collection) — classe déjà adjudiquée sur Fix(serre100,#17601): carnet 10 — ajouter le ## Plan manquant #19648 c.6032755214.
  2. Run 2 (37612761948, rejoué 12:5xZ, échec 13:30:47Z, job 112802687109) : le run porte 1 échec réel F à 21 % = le doublon d'index 0019 du registre twin (base-inherited, touchait chaque PR du dépôt — corrigé par Fix(twin,#19707): dé-dupliquer l'index 0019 de search-03-informed — journal po-2026 renommé 0022 #19723, issue Twin registry: index 0019 duplique dans search-03-informed -- Scripts Tests (CPU) rouge sur chaque PR #19707), puis kill brutal exit 247 à 36 % sans summary ni INTERNALERROR (log : progression en points jusqu'à 13:30:36Z, puis ##[error]Process completed with exit code 247).

Conduite : la jambe est à rejouer APRÈS merge de #19723 (le F disparaît avec le fix du registre) ; si le crash brutal récidive sur un run sans aucun échec de test, c'est la 3e occurrence de la classe — à traiter côté infra runners, pas côté contenu (le diff de cette PR est 1 mot en cellule markdown, c.6036747042).

@jsboige

jsboige commented Oct 7, 2026

Copy link
Copy Markdown
Owner Author

Précision sur le rouge PR gate (14:5xZ) : le log du run 37612762123 le montre — [pr-gate] FAIL -- failing checks: Scripts Tests (CPU) (failure). Le PR gate échoue par pure agrégation du rouge Scripts Tests (CPU) déjà documenté (c.6039608739) : doublon d'index twin 0019 hérité de la base, corrigé côté main par la PR #19723 en attente de merge (le même rouge frappe #19701, #19705, #19708, #19719, #19721).

Aucun DWELL, aucun défaut propre à cette PR. Rejouer la jambe PR gate avant le merge de #19723 ne servirait à rien (l'agrégat ré-échouerait sur le même rouge de base) — la jambe Scripts Tests sera rejouée ici dès #19723 mergée.

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

[OVERRIDE] lane myia-ai-01:CoursIA

Je lève la review 5417638152 de clusterManager-Myia ([Hermes]). Le point bloquant est corrigé à la tête 52ab204 : 0 occurrence de « 做成 », la cellule de lecture cite « 叫做 », valeur présente dans les sorties. Le doublon « ## 7 », classé non bloquant par la review, reste à renuméroter ; ce n'est pas une condition de merge. Le rouge Scripts Tests vient de la base (doublon 0019 du registre jumeau, corrigé par #19723) : il se relit après le merge de #19723.

@jsboige

jsboige commented Oct 7, 2026

Copy link
Copy Markdown
Owner Author

[INFO] Scripts Tests (CPU) — rouge HÉRITÉ DE LA BASE, non réparable par cette lane (preuve firsthand, 2026-10-07 ~15:5xZ, lane myia-po-2026:CoursIA)

Mesure sur ce siège, quatre points :

  1. main porte deux journaux d'index 0019 dans scripts/notebook_tools/twin_pairs.d/search-03-informed/ — 0019-2026-10-05-myia-po-2023-CoursIA-2.yaml et 0019-2026-10-05-myia-po-2026-CoursIA.yaml (git ls-tree origin/main à l'instant). L'index est la clé de tri du registre : deux entrées au même index font rougir les deux organes de garde.
  2. Les deux organes échouent sur main, localement : python -m pytest scripts/notebook_tools/tests/test_twin_registry_integrity.py scripts/notebook_tools/tests/test_twin_index_collisions.py -q → 2 failed, 57 passed, 38,77 s (test_audit_index_unique_and_no_identical_duplicates_per_pair, test_le_registre_de_la_revision_testee_ne_porte_aucun_doublon_intra_revision).
  3. En CI, le workflow Scripts & Notebook-Tools Tests est rouge sur main : failure à 14:24:35Z (a32a8528), 14:32:43Z (fadbbc01), 14:45:14Z (ab6aa5b2, HEAD courant). Trois échecs consécutifs sur push — ce n'est pas une exécution instable.
  4. La jambe de cette PR a échoué de la même manière : check-run 112802687109, 13:25:30Z, annotation « Process completed with exit code 247 ».

Conséquence. Le rejeu de la jambe ne peut pas la verdir : le défaut est dans la base, et il est corrigé par #19723 (renommage du journal 0019 po-2026 → 0022), non encore mergée. Le rouge est donc imputé à la base et attend ce merge ; ce n'est pas un défaut de cette PR. Aucun rejeu n'est lancé ici : il brûlerait un runner pour re-mesurer un rouge de base.

Note d'organe (à remonter, non bloquante). pick_idle_grain.py classe ce rouge en « INFRA D'EXECUTION — rouge ici, VERT sur main : le geste est le REJEUI », corroboré par 4 PRs (#19338, #19705, #19708, #19719). La prémisse « VERT sur main » est fausse pour ce cas (points 1-3). Une lane qui suit l'organe à la lettre rejoue, re-mesure le même rouge et conclut à une instabilité qui n'existe pas. Le classifieur devrait lire la conclusion du même job sur la base, pas l'inférer.

@github-actions github-actions Bot added the variation-adjacency-deep-med Adjacence DEEP/MED hors LIGHT : §2 l'autorise si substance distincte (coordinateur) label Oct 7, 2026
@jsboige

jsboige commented Oct 7, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2025:CoursIA-2
pr: 19338
head: b8fcb89
complete: true
body: read
comments-reviewed: 15
reviews-reviewed: 2
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: 6f73a7370e9e8d00dc86e732cf772a0c7859d4874bf67e75a34fc8a048f38a02
diff-files: 2
diff-additions: 967
diff-deletions: 639
checks: latest-wins-green
b0: clear
scope: pass
domain: pass
verdict: READY
organ: check_adjoint_prevalidation.py
organ-command: python scripts/check_adjoint_prevalidation.py --derive-verdict 19338
organ-rc: 0
[/ADJOINT PREFLIGHT]

@myia-ai-01
myia-ai-01 merged commit 9a0ee01 into main Oct 7, 2026
98 checks passed
myia-ai-01 pushed a commit that referenced this pull request Oct 8, 2026
…main, pas le rollup (#19769)

La classe `infra_rerun` (#17154) classait le rouge `Scripts Tests (CPU)`
en « INFRA D'EXECUTION -- rouge ici, VERT sur main » sur 4 PRs
(#19338, #19705, #19708, #19719) le 2026-10-07, alors que `main` etait
ROUGE sur ce meme workflow (doublon d'index `0019` corrige par #19723,
3 push consecutifs a32a852/fadbbc01/ab6aa5b2 de 14:24 a 14:45Z).
Le rollup de `defaultBranchRef` peut etre en retard sur la verite du
dernier run `push` pendant les rafales de merges ; le picker prenait
alors le rollup pour argent comptant et envoyait la lane rejouer un
rouge REEL de la base, qui revenait au tour suivant.

Fix : `fetch_main_head_probe` appelle `_enrich_probe_with_workflow_runs`
apres le rollup, qui REUTILISE `merge_dwell._main_red_motif` (organe
canonique du DWELL, defauts #18686/#18790/#18796/#19069/#19180) pour
lire la conclusion du dernier run `push` de `main`. Si rouge, les
check names qui pourraient venir de ce workflow sont ajoutes a
`red_keys` (mapping `_WORKFLOW_YML_TO_CHECK_NAMES`, source = bloc
`jobs:` du workflow). Si vert ou illisible, le probe est inchange
(fail-closed : un instrument de plus ne doit jamais elargir la classe
`infra_rerun` sans preuve).

Tests :
- controle positif : rollup vert + `_main_red_motif` rouge -> red_keys
  enrichi, lane classee `base_inherited` (rejoue le cas reel) ;
- controle negatif : rollup vert + `_main_red_motif` vert -> probe
  inchange, lane classee `infra_rerun` (rejeu preserve) ;
- fail-closed : `_main_red_motif` qui leve (quota, panne) -> probe
  inchange, l'appelant tranche sur le rollup ;
- mapping strict : un motif rouge pour un workflow hors
  `MAIN_RED_WORKFLOWS` ne propage pas silencieusement ;
- None en entree -> None en sortie, l'enrichissement n'est pas
  appele (pas d'elargissement fantome) ;
- integration : `fetch_main_head_probe` appelle bien l'enrichissement
  et rend le probe enrichi.

192/192 tests pick_idle_grain verts ; 61/61 tests merge_dwell verts.

Grain: MED/guard -- lane myia-ai-01:CoursIA-2

Co-authored-by: Claude Haiku 4.5 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

variation-adjacency-deep-med Adjacence DEEP/MED hors LIGHT : §2 l'autorise si substance distincte (coordinateur)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants