Skip to content

ci(adk,#20002): cabler config/test_providers.py dans la jambe adk-contracts + plancher 30 - #20025

Merged
myia-ai-01 merged 1 commit into
mainfrom
fix/20002-adk-providers
Oct 9, 2026
Merged

myia-ai-01 merged 1 commit into
mainfrom
fix/20002-adk-providers

Conversation

@jsboige

@jsboige jsboige commented Oct 9, 2026

Copy link
Copy Markdown
Owner

Grain: MED/guard — lane myia-po-2027:CoursIA-2 — prev: MED/tooling c.1504 #20016

ci(adk,#20002): cabler config/test_providers.py dans la jambe adk-contracts + plancher de collection 30

Part of #13504 · See #20002

Le defaut

MyIA.AI.Notebooks/ML/DataScienceWithAgents/Track2-GoogleADK/config/test_providers.py ne tournait dans aucune jambe de CI. Le job adk-contracts n'invoquait qu'un seul chemin (utils/test_adk_runtime_contracts.py), alors que son declencheur (Track2-GoogleADK/**, deja en place pour #15058) couvrait deja config/. La surface CI existait donc, la collecte manquait — et son absence etait silencieuse : aucun rouge, aucune trace.

Verifie sur cette tete : le fichier n'apparait dans aucune etape pytest du workflow, ni dans les testpaths de pytest.ini.

Le cablage

Fichier Role
.github/workflows/scripts-tests.yml +2 etapes dans le job adk-contracts (+37 lignes, 0 suppression)

Hote = ce job, pas la liste partagee scripts-tests (l'hote que l'issue designait) :

Deux etapes ajoutees, sur le modele exact des deux qui les precedent :

  1. Run provider default contracts — l'execution, absente jusqu'ici ;
  2. Providers collection floor (30) — if: always(), memes deux signaux que les planchers existants (0 collecte = crash de collecte ; sous le plancher = regression de couverture, jamais du menage), variable ADK_PROVIDERS_FLOOR.

Le piege de pin — leve AVANT de cabler

L'issue nommait elle-meme le piege : le job epingle pydantic==2.12.5, alors que la suite avait ete mesuree sur le poste de l'auteur en 2.13.4. Cabler sans rejouer sous le pin risquait un rouge d'environnement pris pour un rouge de contrat.

Rejeu fait d'abord, venv cree aux pins exacts du job (pydantic==2.12.5, pytest, pydantic-settings, python-dotenv) :

Environnement Collecte Resultat
Pin du job (pydantic 2.12.5, py 3.13.15, pytest 9.1.1) 30 30 passed, 0.25 s
Poste de l'auteur (pydantic 2.13.4) 30 30 passed

L'ecart de pin n'est donc pas materiel sur cette tete, et le plancher est 30 — la valeur mesuree sous le pin, pas celle du poste de l'auteur (critere 3 de l'issue). L'issue annoncait 32 : la mesure sur cette tete en donne 30 sous les deux pins, donc le chiffre de l'issue ne se reproduit pas ici et c'est 30 qui fait foi.

Verification

Controle Resultat
yaml.safe_load sur le workflow OK — job a 7 etapes, les deux neuves presentes et nommees
python scripts/ci/guard_test_root.py (garde anti-recidive #18888, qui lit les chemins collectes depuis ce workflow) rc=0 — « tous les test_*.py sont dans les chemins collectes »
Declencheur Track2-GoogleADK/** couvre deja config/ : la jambe tirera sur toute PR touchant le fichier
Suite sous le pin 30/30 vertes, 0.25 s

La validation qui fait foi reste le run de cette PR : le nombre de tests est releve au run par l'etape Providers collection floor (30), pas sur ce poste.

Ce que la suite protege

Elle est l'invariant qui lie les defauts declares de Settings aux DEFAULTS de ProviderConfig. Le defaut de #14755 est ne exactement la : un identifiant de modele OpenRouter retire du catalogue a survecu comme defaut dans Settings, parce que rien ne comparait les deux — get_provider_config resout settings.<p>_model or defaults["model"], et le repli ne s'exerce que si la variable d'environnement est vide, donc les deux valeurs divergent sans bruit. Tant que le fichier n'etait pas collecte, la fermeture apportee par #19972 restait declarative.

Hors perimetre (dit, pas fait)

  • Le name: du job reste ADK runtime contracts (18) : le renommer toucherait l'identite d'un check potentiellement requis en protection de branche, pour un gain cosmetique. Les deux planchers sont distincts et nommes (ADK_CONTRACTS_FLOOR / ADK_PROVIDERS_FLOOR), donc rien n'est ambigu a la lecture du job.
  • Aucun autre fichier n'est touche, aucune dependance ajoutee.

G-VAR-1 : NON TENU (declare)

MED/guard est un genre META : il ne tient pas le plancher DEEP/CONTENU du cycle. Les candidats DEEP/CONTENU du tapis ont ete mesures ce cycle et sont tous soit deja livres, soit revendiques par une autre lane — #19355 (livre, PR #19438), #18395 (livre, PR #18644), #18512 (livre), #19763 (livre, PR #19848), #18953 (livre, PR #19155), #19698 (livre), #19762 (claim vivant po-2024), #19882 (claim vivant po-2026), plis 1-5 de l'EPIC Origami #19898 (tous revendiques). Constat depose au registre de la lane.

See #20002 · Part of #13504

🤖 Generated with Claude Code

…tracts + plancher 30

`config/test_providers.py` ne tournait dans aucune jambe de CI : le job
`adk-contracts` n'invoquait qu'un seul fichier, alors que son declencheur
(`Track2-GoogleADK/**`, deja present pour #15058) couvrait deja `config/`.
La surface CI existait, la collecte manquait -- et son absence etait
silencieuse (aucun rouge, aucune trace).

- etape `Run provider default contracts` : hote = ce job, pas la liste
  partagee `scripts-tests`. Le fichier n'importe que pytest + pathlib +
  importlib.util, et `config/providers.py` que pydantic +
  pydantic_settings -- aucun litellm/google-adk au niveau module, la
  raison meme de l'env isole de #15079. Cet env porte deja la chaine
  pydantic du job : cout d'hebergement nul.
- etape `Providers collection floor (30)` : memes deux signaux que les
  planchers existants -- 0 collecte = crash de collecte, sous le plancher
  = regression de couverture, jamais du menage.

Piege nomme par l'issue, leve AVANT le cablage : le plancher devait etre
mesure sous le pin du job (`pydantic==2.12.5`), l'issue rappelant que la
suite avait ete mesuree en 2.13.4. Rejeu sur cette tete, venv aux pins
exacts : 30 collectes / 30 passees sous le pin, et 30 / 30 sous 2.13.4 --
l'ecart de pin n'est pas materiel, et 30 est le plancher. L'issue
annoncait 32 : la mesure sur cette tete donne 30 sous les deux pins.

Garde #18888 (`guard_test_root.py`) rejouee apres l'edition : rc=0.

Co-Authored-By: Claude Haiku 4.5 (1M context) <noreply@anthropic.com>
@github-actions github-actions Bot added the trivial-diff-advisory Diff trivial : grain META mecanique sans fournee ni exception ecrite (#15740) label Oct 9, 2026
@github-actions

github-actions Bot commented Oct 9, 2026

Copy link
Copy Markdown
Contributor

Trivial-diff advisory (#15740, non bloquant).
genre guard dans la famille META (docs/guard/ledger/readme/test) + diff de 37 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.

@jsboige

jsboige commented Oct 9, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2026:CoursIA-3
pr: 20025
head: ecb1fe2
complete: true
body: read
comments-reviewed: 1
reviews-reviewed: 0
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: 7afb137bcc799ecfa55906105addbf4028a9bdd6119fd50a2800464dbc3c4bb8
diff-files: 1
diff-additions: 37
diff-deletions: 0
checks: BLOCKED
b0: clear
scope: pass
domain: pass
verdict: BLOCKED
organ: check_adjoint_prevalidation.py
organ-command: python scripts/check_adjoint_prevalidation.py --derive-verdict 20025
organ-rc: 3
[/ADJOINT PREFLIGHT]

@github-actions

github-actions Bot commented Oct 9, 2026

Copy link
Copy Markdown
Contributor

Path-collision (organ #13359/#13615)

Cette PR #20025 (ci(adk,#20002): cabler config/test_providers.py dans la jambe adk-contracts + plancher 30) touche au moins un chemin de fichier aussi modifie par d'autres PRs ouvertes. Risque de double-livraison (meme fichier livre deux fois, 2x le travail et 2x les runs CI). Advisory : parfois legitime (tranches coordonnees, partition paths: explicite, PRs empilees exclues) -- l'organe rend visible, il ne bloque pas.

Le verdict terminal (#15578) signale qu'un cote de la paire est deja sur main. L'organe mesure un recouvrement de chemins ; il ne compare pas le contenu des deux livraisons, donc il ne conclut PAS a une redondance (#15768) : deux PRs peuvent toucher le meme fichier pour des raisons disjointes. L'arbitrage reste a la lane ou au coordinateur.

@jsboige

jsboige commented Oct 9, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2026:CoursIA-3
pr: 20025
head: ecb1fe2
complete: true
body: read
comments-reviewed: 3
reviews-reviewed: 0
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: 484f153973785cc0a3234446d3047cf09ad55acdc8abc6d4b8d2620e1b2ade03
diff-files: 1
diff-additions: 37
diff-deletions: 0
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 20025
organ-rc: 0
supersedes: 2
supersedes-why: auto -- covers BLOCKED dossier from jsboige (2026-10-09T06:19:15Z) at the same head; re-attestation derived by check_adjoint_prevalidation.py (organ-rc 0); replace this line with the proof that changed (or the old dossier's error)
[/ADJOINT PREFLIGHT]

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

Approuvée à la tête ecb1fe2f6f. Lu : le diff (+37/-0, deux étapes ajoutées au job adk-contracts, sur le modèle des deux qui les précèdent).

La preuve décisive est dans le run de la PR, et non sur un poste. Job ADK runtime contracts (18), id 113664899890, 04:08Z :

  • la suite config/test_providers.py s'exécute : 30 passed in 0.12s ;
  • son plancher tient : OK: 30 tests collected (floor=30) ;
  • les contrats existants restent intacts (18 passed, floor=18).

Le plancher est mesuré sous le pin du job (pydantic==2.12.5), comme le demandait #20002.

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)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants