Skip to content

Organe : versions canoniques des bibliothèques chargées par les carnets — refuser une rétrogradation, voir la dispersion, monter une version d'un seul geste #23073

Open

Description

@myia-ai-01

Origine

Le mainteneur, le 2026-10-28, à propos de #23047 :

« Ca méritera un organe pour stabiliser les versions d'API et de libs, car ce genre de regressions sont parmis les plus terribles et incidieuses. C'est toute une serie de notebook qui peut exploser »

Cas déclencheur. #23047 ré-exécute le carnet archivé SymbolicAI/_archive/Tweety.ipynb sous Tweety 1.28, alors que la série est en 1.30. Sa cellule de provisionnement pointe toujours vers tweetyproject.org/builds/1.28/, qui répond 404. La ré-exécution a donc utilisé des JARs copiés depuis un dossier de projet étudiant, et personne ne peut la rejouer depuis le dépôt. Deux demandes de changements la retiennent : 5677880182 (Hermes) et 5678857012 (coordinateur).

Un carnet isolé, c'est un incident. Pour une bibliothèque partagée par une série, il en va autrement : sans référence commune, chaque ré-exécution peut charger une autre version. Une rupture d'API apparaît alors carnet par carnet, des mois plus tard, et parfois en silence.

Ce qui existe, ce qui manque

Organe Ce qu'il voit Ce qu'il ne voit pas
scripts/notebook_tools/check_kernel_drift.py l'interpréteur (Python major.minor) et le format des flottants NumPy, entre base et tête les bibliothèques chargées par les cellules
scripts/notebook_tools/notebook_env_census.py la provenance d'interpréteur d'une série idem
SymbolicAI/Tweety/scripts/download_tweety_tools.py fixe TWEETY_VERSION = "1.30" et télécharge depuis Maven rien ne lui compare les carnets
#4362 Mathlib pour les lakes Lean hors de cette issue

Aucun organe ne compare les versions qu'un carnet charge à la version canonique de sa série.

Mesure (main 54002c6fb79, 2026-10-28)

Littéraux de version dans les cellules de code des carnets suivis (#r "nuget: X, v", pip install x==v, littéraux Tweety) :

  • NuGet : 56 paquets épinglés, dont 9 à versions multiples :
Paquet Versions (nombre de carnets)
IKVM 8.14.0 (6) · 8.15.0 (20)
IKVM.Image 8.14.0 (5) · 8.15.0 (18)
pythonnet 3.0.5 (7) · 3.1.0 (14)
Google.OrTools 9.11.4210 (11) · 9.15.6755 (2)
dotNetRDF 3.2.1 (7) · 3.4.0 (1) · 3.4.1 (5)
Microsoft.ML 3.0.0 (1) · 5.0.0 (11)
SkiaSharp 2.88.3 (1) · 3.119.4 (10)
Microsoft.ML.AutoML 0.22.3 (1) · 0.23.0 (2)
CsvHelper 27.1.1 (1) · 33.0.1 (1)
  • pip == : 4 paquets épinglés, aucun à versions multiples.
  • Tweety : seul le carnet archivé est épinglé sous la 1.30. Les mentions « 1.28+ » de Tweety-01, Tweety-04 et Argumentation-05b sont des commentaires sur un changement d'API, pas des épinglages.

Deux corrections déjà faites sont revenues :

Un repli indexé sur la version masque une rupture d'API. Tweety-04-Belief-Revision-Python contient print("Skipped: imports CrMas non disponibles (Tweety 1.28+ API change)."). Les sorties committées passent par le vrai chemin, mais au prochain changement de version ce repli produirait une sortie appauvrie sans erreur. Aujourd'hui, seul le ratchet de perte de sortie (#15327) pourrait le voir, et seulement par la taille.

Réserve sur l'instrument. Le recensement compte des littéraux. Il ne distingue pas une dérive d'un épinglage justifié : ML.AutoML 0.22.3 peut être requis par un ML.NET plus ancien. C'est le classement demandé ci-dessous qui tranche.

Ce qui est demandé

  1. Un manifeste des versions canoniques, une source par bibliothèque. Quand un organe de série fixe déjà la version (TWEETY_VERSION), le manifeste pointe vers lui et ne recopie pas la valeur, sinon les deux surfaces divergent. Sinon (NuGet, pip), le manifeste porte la valeur. L'organe et ses données vivent sous scripts/notebook_tools/.

  2. Une garde de PR sur les carnets modifiés. Elle rougit dans trois cas :

    • une version chargée inférieure à la canonique (rétrogradation) ;
    • une version supérieure sans montée du manifeste dans la même PR ;
    • une source de provisionnement hors de l'organe de série (URL morte ou divergente, binaires venant d'un chemin hors dépôt).

    Seule exception : une entrée d'allowlist arbitrée, avec son motif écrit. La garde démarre en advisory dans scripts/ci/fast_lane_registry.py, son taux de faux positifs se mesure sur les dernières PRs de carnets, puis elle devient bloquante, comme les autres ratchets.

  3. Un recensement de tout le dépôt (rc 0) qui produit la table de dispersion ci-dessus et classe chaque divergence : à faire converger, ou justifiée avec son motif. Les convergences deviennent des grains du tapis, une série par PR, avec ré-exécution.

  4. Monter une version en un seul geste. La montée du manifeste et la ré-exécution de toute la série vont dans la même PR, ou dans un escalier de PRs par série. Une rupture d'API se voit alors sur toute la série d'un coup, et les incompatibilités mesurées s'écrivent dans le body : cellule, appel, erreur. La procédure s'écrit dans docs/reference/.

  5. Les replis indexés sur une version (« non disponible », « Skipped … API change ») sont recensés. Un run committé qui passe par l'un d'eux rougit.

Critères d'acceptation

Périmètre

See #23047, #12789, #19673, #21424, #4362.

Activity

  1. myia-ai-01 commented on Oct 28, 2026

    @myia-ai-01
    CollaboratorAuthor

    [CLAIMED] lane myia-ai-01:CoursIA-2 -- organe check_lib_versions (manifeste + garde advisory + recensement), pose au dispatch par myia-ai-01:CoursIA -- paths: scripts/notebook_tools/check_lib_versions*, scripts/notebook_tools/lib_versions*, scripts/notebook_tools/tests/test_check_lib_versions*, scripts/ci/fast_lane_registry.py, docs/reference/lib-versions*

  2. jsboige commented on Oct 28, 2026

    @jsboige
    Owner

    [CLAIMED-AMEND] lane myia-ai-01:CoursIA-2 -- paths: scripts/notebook_tools/check_lib_versions*, scripts/notebook_tools/lib_versions*, scripts/notebook_tools/tests/test_check_lib_versions*, scripts/ci/fast_lane_registry.py, scripts/ci/fast_lane.py, docs/reference/lib-versions*

    Amendement de perimetre, porte par la lane qui execute : la clause du dispatch ne mentionnait pas scripts/ci/fast_lane.py.

    Motif mesure : un garde enregistre dans scripts/ci/fast_lane_registry.py n'est execute que s'il appartient a une liste explicitement agreguee par le moteur. scripts/ci/fast_lane.py agrege ses groupes ligne 395 (+ TRANCHE26 + TRANCHE27 + TRANCHE28) et les importe ligne 48 ; un groupe nouveau (TRANCHE29) demande ces deux lignes, sans quoi le garde est declare mais jamais lance -- un rouge muet, exactement la classe que l'issue #19098 a fermee.

    Aucun autre fichier n'est touche : ni workflow, ni catalogue, ni carnet.

  3. jsboige commented on Oct 28, 2026

    @jsboige
    Owner

    [DELIVERED] lane myia-ai-01:CoursIA-2 -- PR #23112 -- paths: MyIA.AI.Notebooks/GameTheory/GameTheory-05-ZeroSum-Minimax-CSharp.ipynb, MyIA.AI.Notebooks/GameTheory/GameTheory-15c-CooperativeGames-CSharp.ipynb, MyIA.AI.Notebooks/Search/Part1-Foundations/Search-09-LinearProgramming-CSharp.ipynb, MyIA.AI.Notebooks/Search/Part2-CSP/CSP-5-Optimization-CSharp.ipynb, MyIA.AI.Notebooks/Search/Part3-Cas-pratiques/App-11b-Picross-CSharp.ipynb, MyIA.AI.Notebooks/Search/Part3-Cas-pratiques/App-13b-TSP-Metaheuristics-CSharp.ipynb, MyIA.AI.Notebooks/Search/Part3-Cas-pratiques/App-16-Crossword-CSP-CSharp.ipynb, MyIA.AI.Notebooks/Search/Part3-Cas-pratiques/App-17b-VRP-Logistics-CSharp.ipynb, MyIA.AI.Notebooks/Search/Part3-Cas-pratiques/App-19-ProceduralGeneration-WFC-CSharp.ipynb, MyIA.AI.Notebooks/Search/Part3-Cas-pratiques/App-2b-GraphColoring-CSharp.ipynb, MyIA.AI.Notebooks/Search/Part3-Cas-pratiques/App-5-Timetabling-CSharp.ipynb

    Tranche livree : convergence de Google.OrTools sur 9.15.6755. Les 11 carnets du
    recensement portaient 9.11.4210 sans motif ecrit dans le depot (ecart donc classe « a
    converger » par l'organe des versions). La PR #23112 monte l'epinglage sur la version
    canonique et re-execute les 11 carnets avec l'executeur canonique du depot
    (scripts/notebook_tools/dotnet_executor.py, kernel .net-csharp) : 140 cellules de
    code, 0 erreur, 0 execution_count nul, aucune sortie recrite a la main.

    Etat mesure apres la livraison (--census sur la tete de la branche) :
    Google.OrTools n'apparait plus qu'en 9.15.6755, classe canonique, sur 13 carnets
    (les 11 livres + les 2 carnets Sudoku deja sur la version canonique). L'entree
    9.11.4210 du manifeste devient une divergence fantome : son retrait suit le merge
    du manifeste (#23079, tranche de creation de l'organe, encore en relecture) — cette
    tranche-la n'est pas fermee par la presente livraison.

    Un point d'hygiene signale et repare. La premiere re-execution de GameTheory-05
    avait degrade sa cross-validation trois-moteurs : Gambit (Tranche 3) n'etait pas
    installe sur cette machine, et la comparaison des trois resolutions avait ete remplacee
    par un message d'absence porteur du chemin machine de l'utilisateur. Les deux ratchets
    de sortie l'ont signale (cellule 98a90823 : 2 963 -> 1 738 caracteres ; 3 chemins
    machine nouveaux). La cause a ete reparee, pas contournee : MSI officiel
    gambit-16.0.2.msi extrait sans elevation dans %LOCALAPPDATA%\Gambit\Gambit\ (l'emplacement
    que la recherche du carnet consulte sur Windows), puis carnet re-execute — la comparaison
    a trois resolutions est restituee, sans chemin machine, et le ratchet de collapse ne
    signale plus rien.

    Garde de perimetre : check_pr_perimeter --scan-thread sur #23112 rend OK ; les
    ratchets de sortie (check_output_collapse, check_output_failure_text,
    check_source_collapse) rendent 0 flagged / 0 regressed sur la tete exacte.

    La tranche manifeste de cette issue reste ouverte de mon cote (claim alive sur
    scripts/notebook_tools/lib_versions*) et n'est pas reprise par cette livraison.

  4. added 5 commits that reference this issue on Oct 28, 2026
  5. added 2 commits that reference this issue on Oct 30, 2026
  6. added 2 commits that reference this issue on Oct 31, 2026
  7. added 2 commits that reference this issue on Oct 31, 2026
  8. added a commit that references this issue on Oct 31, 2026
  9. 3 remaining items

  10. myia-ai-01 commented on Oct 31, 2026

    @myia-ai-01
    CollaboratorAuthor

    [INFO] lane myia-ai-01:CoursIA — un angle mort de l'organe, mesuré sur une PR réelle, à intégrer à la suite du chantier (aucune issue neuve : le veto du mainteneur tient tant que les issues ouvertes sont au moins 350).

    Sur #23807 (TV-00a, tranche 1 de la convergence kernel #23805), les bannières de sortie montrent torch 2.13.0+cpu à la base et torch 2.8.0+cu126 à la tête. C'est un recul de cinq versions mineures. Pourtant Library versions guard (advisory, #23073) est vert à cette tête, parce que torch n'est pas dans scripts/notebook_tools/lib_versions_manifest.json. Le manifeste couvre les versions épinglées par les cellules. torch vient de l'environnement du noyau, et le carnet n'en garde la trace que dans sa sortie (print(torch.__version__)).

    La forme qui attraperait ce cas : comparer, base contre tête, les versions imprimées par les bannières de sortie des bibliothèques nommées au manifeste (au minimum torch, numpy, transformers, z3), et signaler un recul. Le relevé de la lane sur #23807 montre aussi qu'il n'existe aucun canon torch dans les sorties de la flotte (2.6, 2.8, 2.13 et 2.14 coexistent). Ma décision pour #23805 : pas de recul sous la version de la base, torch au moins égal à 2.13 en roue cu126 dans l'interpréteur 3.13.

  11. myia-ai-01 commented on Nov 1, 2026

    @myia-ai-01
    CollaboratorAuthor

    [COORD] Instance mesurée le 2026-11-01, à verser au recensement de cette issue : une rétrogradation de torch est passée sur main par une PR de canonisation 3.13.

    Carnet main avant main après #23581
    RL/RL-13-Curiosite-RND-Python.ipynb Python 3.11.9, torch 2.13.0+cpu Python 3.13.15, torch 2.6.0+cu124

    La même pile est proposée dans #23673 (RLPT-00d), où je demande des changements. La cause, rapportée par la lane : sur son siège, torch est bridé à 2.6 par torchvision 0.21.0 et stable-baselines3.

    Ce qui l'a laissée passer.

    C'est exactement le cas que cet organe doit refuser.

  12. myia-ai-01 commented on Nov 1, 2026

    @myia-ai-01
    CollaboratorAuthor

    Complément à l'instance RL-13 ci-dessus : la mesure étendue aux carnets RL du siège myia-po-2027:CoursIA trouve la même rétrogradation sur RL-06b (#23624, 2.13.0+cpu → 2.6.0+cu124) et RL-12 (#23617, 2.8.0+cpu → 2.6.0+cu124), toutes deux mergées. RL-06c (#23626) et RL-06d (#23573) importent torch sur le même siège sans imprimer sa version.

    Ce qui l'a laissée passer : la lane avait écrit le point dans le body (« divergence torch documentée, pin machine délibérée »), en prose et sans marqueur. B.0 ne le voit pas, et le dossier de prévalidation non plus. Aucune garde ne compare les lignes de version de bibliothèque entre la base et la tête. C'est la pièce que cet organe doit apporter.

    Arbitrage et suite : #23384 (commentaire 6553575746).

  13. added 2 commits that reference this issue on Nov 1, 2026
  14. added 4 commits that reference this issue on Nov 2, 2026
  15. added a commit that references this issue on Nov 7, 2026
  16. jsboige commented on Nov 7, 2026

    @jsboige
    Owner

    [DELIVERED] lane myia-ai-01:CoursIA-2 -- PR #25060 -- paths: scripts/notebook_tools/check_lib_versions.py, scripts/notebook_tools/lib_versions_manifest.json, scripts/notebook_tools/tests/test_check_lib_versions.py, docs/reference/lib-versions.md -- 2026-11-07T13:39Z

  17. added a commit that references this issue on Nov 7, 2026
  18. jsboige commented on Nov 7, 2026

    @jsboige
    Owner

    [CLAIMED-AMEND] lane myia-ai-01:CoursIA-2 -- paths: scripts/notebook_tools/check_lib_versions.py, scripts/notebook_tools/lib_versions_manifest.json, scripts/notebook_tools/tests/test_check_lib_versions.py, docs/reference/lib-versions.md, MyIA.AI.Notebooks/RL/RL-06-DQN-Policy-Gradient-Python.ipynb, MyIA.AI.Notebooks/RL/RL-01c-Distillation-Politique-Prolog-Python.ipynb, MyIA.AI.Notebooks/RL/PostTraining/RLPT-00e-DPO-TRL-Python.ipynb, MyIA.AI.Notebooks/RL/PostTraining/RLPT-00f-GRPO-TRL-contre-PPO-Maison-Python.ipynb, MyIA.AI.Notebooks/RL/PostTraining/RLPT-00g-PPO-TRL-Experimental-Python.ipynb, MyIA.AI.Notebooks/RL/PostTraining/RLPT-04-DPO-Offline-contre-GRPO-Online-Python.ipynb, MyIA.AI.Notebooks/RL/requirements.txt -- tranche de convergence du corpus sous le plancher (critere 3 de l'issue : « les convergences deviennent des grains du tapis, une serie par PR, avec re-execution »)

    L'organe est livre par #25060 (ouverte, CLEAN). Cette tranche-ci converge les carnets de la serie RL qui portent une version chargee sous le plancher torch 2.13 du manifeste :

    carnet version chargee (commitee) remarque
    RL-06-DQN-Policy-Gradient torch 2.8.0+cu126 re-execution CPU prevue
    RLPT-00e-DPO-TRL torch 2.6.0+cu124 (cpu) transformers 5.15.1, trl 1.10.0
    RLPT-00f-GRPO-TRL-contre-PPO-Maison torch 2.9.0+cu126 transformers 5.2.0 sous le plancher declare >=5.12
    RLPT-00g-PPO-TRL-Experimental torch 2.9.0+cu126 idem
    RLPT-04-DPO-Offline-contre-GRPO-Online torch 2.6.0+cu124, GPU (3070) barriere GPU : a router
    RL-01c-Distillation-Politique-Prolog torch 2.11.0+cpu barriere : moteur SWI-Prolog absent de ce siege

    RLPT-02-GRPO-Minimal (4-bit + modele local) reste GPU-bound. Aucune autre PR ouverte ne touche ces fichiers (verifie : #24778 -> RLPT-03, #24939 -> RL-21, #25010 -> RLPT-03/RL-19).

  19. added a commit that references this issue on Nov 7, 2026
  20. jsboige commented on Nov 7, 2026

    @jsboige
    Owner

    [DELIVERED] lane myia-ai-01:CoursIA-2 -- PR #25126 -- paths: MyIA.AI.Notebooks/RL/RL-06-DQN-Policy-Gradient-Python.ipynb, MyIA.AI.Notebooks/RL/requirements.txt

    Premiere tranche du critere 3 (convergence des carnets sous le plancher torch >= 2.13) : RL-06.

    • Garde de version dans la cellule de setup (TORCH_FLOOR = (2, 13), assert + ligne de conformite) : la source change, la re-execution complete est due et livree — 15/15 cellules, 0 erreur, sous l'env epingle au plancher (torch 2.14.1+cpu ; numpy 2.4.3, gymnasium 1.3.0, matplotlib 3.10.3 reconstruits des versions commitees — convergence a variable unique).
    • Rejeu de base mesure avant edition : le carnet inchange a d'abord ete rejoue, la derive de version est documentee cellule par cellule ; les lectures chiffrees (8 cellules markdown) sont re-alignees sur les nouvelles sorties — deux lectures qualitatives se retournent (ablation : sans-target-net nettement pire ; evaluation : les deux politiques franchissent le seuil 475) et le retournement est documente DANS le carnet (note de provenance).
    • requirements.txt : torch>=2.0 -> torch>=2.13, renvoi a la garde du carnet.

    Suites nommees (hors de cette tranche) : RLPT-00e/00f/00g (CPU-executables, env epingle par carnet requis — trl 1.17.1 pour 00f/00g, surface trl.experimental.ppo absente en 1.13+), RLPT-04 et RLPT-02 (GPU), RL-01c (SWI-Prolog).

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions