From 0cac6bbf09f6bf66db3174e23d889eb45ca067c5 Mon Sep 17 00:00:00 2001 From: Claude Date: Mon, 5 Oct 2026 03:30:31 +0200 Subject: [PATCH 1/6] fix(kernel-drift,#19181): canon Python 3.11 QC/Python + transitions 3.10->3.11 et 3.11->3.13 La serie QC/Python porte 11 versions heterogenes (3.8.10 a 3.13.14) sur 60 carnets ``python3`` + 2 ``conda-torch``. La table CANONICAL_LANGUAGE_TRANSITIONS ne couvrait que C# 12.0 -> 13.0 ; la convergence Python etait assimilee a une regression. Le canon documente dans requirements.txt est Python 3.11 (QuantConnect cloud). La transition 3.10 -> 3.11 est la migration historique ; 3.11 -> 3.13 la convergence future. Les deux sont ajoutees a la table, en direction du canon. La direction inverse reste rouge. Tests : 1 test qui consacrait l'ancien bug (``python_minor_stays_out``) est inverse en 5 tests (2 positifs, 2 negatifs direction inverse, 1 negatif kernelspec change). 70/70 verts (38 + 22 + 10). Co-Authored-By: Claude Haiku 4.5 (1M context) --- .../QuantConnect/requirements.txt | 7 ++- scripts/notebook_tools/check_kernel_drift.py | 17 +++++-- .../tests/test_check_kernel_drift.py | 46 +++++++++++++++++-- 3 files changed, 63 insertions(+), 7 deletions(-) diff --git a/MyIA.AI.Notebooks/QuantConnect/requirements.txt b/MyIA.AI.Notebooks/QuantConnect/requirements.txt index 7645621ec3..75410c807d 100644 --- a/MyIA.AI.Notebooks/QuantConnect/requirements.txt +++ b/MyIA.AI.Notebooks/QuantConnect/requirements.txt @@ -154,6 +154,11 @@ cloudpickle>=3.0.0 # - Requires Docker Desktop running # # Version Compatibility: -# - Python 3.11+ recommended +# - Python 3.11 recommended (canon #19181, aligne sur QuantConnect cloud) # - Compatible with QuantConnect cloud (Python 3.11) +# - La table CANONICAL_LANGUAGE_TRANSITIONS du cliquet +# ``scripts/notebook_tools/check_kernel_drift.py`` accepte les +# transitions 3.10 -> 3.11 (migration historique) et 3.11 -> 3.13 +# (convergence future) en direction du canon. La direction inverse +# reste rouge. # - NumPy < 2.0 for compatibility with some libraries diff --git a/scripts/notebook_tools/check_kernel_drift.py b/scripts/notebook_tools/check_kernel_drift.py index a65c263040..20c556fd5f 100644 --- a/scripts/notebook_tools/check_kernel_drift.py +++ b/scripts/notebook_tools/check_kernel_drift.py @@ -221,12 +221,23 @@ def diff_kernel(base_info, head_info): # coordinateur 2026-09-26) : la derive va dans le sens du canon decide -- # ce n'est pas une regression, pas plus qu'une derive de patch (#17371). # La DIRECTION porte l'acceptation : la transition inverse reste rouge. -# Portee au kernel .NET C# mesure dans le depot (kernelspec -# ``.net-csharp`` : 141 notebooks a 13.0, 7 a 12.0 au 2026-09-27) -- la -# classe fondatrice Python 3.11 -> 3.13 reste hors table. +# Portee mesuree au 2026-10-05 : +# - C# ``.net-csharp`` : 141 notebooks a 13.0, 7 a 12.0 (#17679, transition acceptee) ; +# - Python ``python3`` (serie QC/Python) : 11 versions heterogenes +# (3.8.10, 3.9.0, 3.10.0, 3.10.11, 3.10.19, 3.11.0, 3.11.9, 3.11.14, +# 3.11.15, 3.13.3, 3.13.7, 3.13.12, 3.13.14) ; 60 carnets ``python3`` + 2 +# ``conda-torch`` ; canon documente dans requirements.txt = 3.11 +# (QuantConnect cloud, ligne 23). La transition 3.10 -> 3.11 est la +# migration historique de la serie ; 3.11 -> 3.13 la convergence +# future. Les deux restent acceptees en direction du canon. +# La transition inverse (3.13 -> 3.11, 3.11 -> 3.10) reste rouge. CANONICAL_LANGUAGE_TRANSITIONS = { (".net-csharp", "12.0", "13.0"): "C# 12.0 -> 13.0 : convergence vers le canon C# 13.0 (#17679)", + ("python3", "3.10", "3.11"): + "Python 3.10 -> 3.11 : convergence vers le canon QC/Python (#19181)", + ("python3", "3.11", "3.13"): + "Python 3.11 -> 3.13 : convergence vers le canon Python 3.13 (#19181)", } diff --git a/scripts/notebook_tools/tests/test_check_kernel_drift.py b/scripts/notebook_tools/tests/test_check_kernel_drift.py index 6e9bb4b8b4..f61820645d 100644 --- a/scripts/notebook_tools/tests/test_check_kernel_drift.py +++ b/scripts/notebook_tools/tests/test_check_kernel_drift.py @@ -317,11 +317,51 @@ def test_canonical_transition_kernelspec_change_refused(): assert ckd.accepted_canonical_transition(a, b) is False -def test_canonical_transition_python_minor_stays_out(): - # La classe fondatrice (Python 3.11 -> 3.13) reste hors table : la - # table est scoped au kernel, pas au couple de numeros. +# --- #19181 : table d'acceptation canon Python (QC/Python) ----------------- +# Mesure du 2026-10-05 sur la serie QC/Python : 11 versions heterogenes +# (3.8.10 a 3.13.14) ; 60 carnets ``python3`` + 2 ``conda-torch``. Canon +# documente dans ``MyIA.AI.Notebooks/QuantConnect/requirements.txt`` (3.11, +# QuantConnect cloud). La transition 3.10 -> 3.11 est la migration +# historique de la serie ; 3.11 -> 3.13 la convergence future. Les deux +# restent acceptees en direction du canon ; la direction inverse reste +# rouge. + + +def test_canonical_transition_python_311_to_313_accepted(): + # Positif 1 : la convergence vers Python 3.13 est couverte. a = {"language_version": "3.11.16", "kernelspec_name": "python3"} b = {"language_version": "3.13.3", "kernelspec_name": "python3"} + assert ckd.accepted_canonical_transition(a, b) is True + # la derive brute existe bien -- c'est la table qui l'accepte. + assert ckd.diff_kernel(a, b) + + +def test_canonical_transition_python_310_to_311_accepted(): + # Positif 2 : la migration historique vers le canon 3.11 est couverte. + a = {"language_version": "3.10.19", "kernelspec_name": "python3"} + b = {"language_version": "3.11.9", "kernelspec_name": "python3"} + assert ckd.accepted_canonical_transition(a, b) is True + + +def test_canonical_transition_python_313_to_311_refused(): + # Negatif 1 : la direction inverse est une regression du canon. + a = {"language_version": "3.13.3", "kernelspec_name": "python3"} + b = {"language_version": "3.11.16", "kernelspec_name": "python3"} + assert ckd.accepted_canonical_transition(a, b) is False + + +def test_canonical_transition_python_311_to_310_refused(): + # Negatif 2 : retombada sur 3.10 apres adoption du canon 3.11. + a = {"language_version": "3.11.9", "kernelspec_name": "python3"} + b = {"language_version": "3.10.19", "kernelspec_name": "python3"} + assert ckd.accepted_canonical_transition(a, b) is False + + +def test_canonical_transition_python_kernelspec_change_refused(): + # Negatif 3 : un changement de kernelspec.name reste rouge, meme avec + # des versions couvertes par la table. + a = {"language_version": "3.11.9", "kernelspec_name": "python3"} + b = {"language_version": "3.13.3", "kernelspec_name": "python311"} assert ckd.accepted_canonical_transition(a, b) is False From 113536593185d2f1dfe0bcee48710b86280dbbd4 Mon Sep 17 00:00:00 2001 From: jsboige Date: Mon, 5 Oct 2026 05:54:01 +0200 Subject: [PATCH 2/6] fix(kernel-drift,#19199): transitions 3.8/3.9/3.10 -> 3.13 + decision duale QC Cloud (3.11) / local (3.13) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Reponse au DISPATCH coord msg-20261005T034346-qyldsl (MEDIUM, 2026-10-05 05:43Z) : la table CANONICAL_LANGUAGE_TRANSITIONS ne couvrait pas 3.10 -> 3.13 (le cas fondateur de #19181, PR #19163) ; le libellé parlait 'canon Python 3.13' alors que requirements.txt pose 'canon 3.11'. 1. Trois transitions ajoutees (direction vers le canon d'execution 3.13) : - 3.10 -> 3.13 (cas fondateur 3.10.11 -> 3.13.3) ; - 3.9 -> 3.13 ; - 3.8 -> 3.13 (saut le plus large). La direction inverse (3.13 -> 3.8/3.9/3.10/3.11) reste rouge. 2. Quatre tests positifs/negatifs ajoutes (42 tests total, tous verts) : - test_canonical_transition_python_31011_to_3133_accepted : cas fondateur. - test_canonical_transition_python_38_to_313_accepted : saut 3.8 -> 3.13. - test_canonical_transition_python_39_to_313_accepted : saut 3.9 -> 3.13. - test_canonical_transition_python_313_to_38_refused : symetrie inversee rouge. 4. Libelles alignes (decision coordonnateur) : - check_kernel_drift.py en-tete : Python 3.10.11 -> 3.13.3, 3.11 -> 3.13. - requirements.txt : canon QC Cloud 3.11 + canon d'execution local 3.13 (deux canons par design). - Libelles table : 'convergence vers le canon QC/Python 3.11' vs 'convergence vers le canon d'execution 3.13'. Body PR : section '## Diagnostic derive' cause (e) stochasticite non-seedee, verdict CAUSE_FIXED (la flotte resserre sur Python 3.13 alors que les algorithmes deployes QC Cloud restent en 3.11 ; deux canons par design). 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Haiku 4.5 (1M context) --- .../QuantConnect/requirements.txt | 10 +++- scripts/notebook_tools/check_kernel_drift.py | 39 +++++++++---- .../tests/test_check_kernel_drift.py | 58 ++++++++++++++++--- 3 files changed, 83 insertions(+), 24 deletions(-) diff --git a/MyIA.AI.Notebooks/QuantConnect/requirements.txt b/MyIA.AI.Notebooks/QuantConnect/requirements.txt index 75410c807d..fa89516c91 100644 --- a/MyIA.AI.Notebooks/QuantConnect/requirements.txt +++ b/MyIA.AI.Notebooks/QuantConnect/requirements.txt @@ -156,9 +156,13 @@ cloudpickle>=3.0.0 # Version Compatibility: # - Python 3.11 recommended (canon #19181, aligne sur QuantConnect cloud) # - Compatible with QuantConnect cloud (Python 3.11) +# - L'execution locale des carnets se fait en Python 3.13 (l'interpreteur +# de la flotte, qui ecrit ``language_info.version`` a chaque rejeu). +# Deux canons par design, pas un seul. # - La table CANONICAL_LANGUAGE_TRANSITIONS du cliquet # ``scripts/notebook_tools/check_kernel_drift.py`` accepte les -# transitions 3.10 -> 3.11 (migration historique) et 3.11 -> 3.13 -# (convergence future) en direction du canon. La direction inverse -# reste rouge. +# transitions 3.10 -> 3.11 (migration historique vers QC Cloud), +# 3.11 -> 3.13 (convergence vers l'interpreteur local), et les sauts +# directs 3.8/3.9/3.10 -> 3.13 (cas fondateur #19181, PR #19163 : +# 3.10.11 -> 3.13.3). La direction inverse reste rouge. # - NumPy < 2.0 for compatibility with some libraries diff --git a/scripts/notebook_tools/check_kernel_drift.py b/scripts/notebook_tools/check_kernel_drift.py index 20c556fd5f..a3005cc8c7 100644 --- a/scripts/notebook_tools/check_kernel_drift.py +++ b/scripts/notebook_tools/check_kernel_drift.py @@ -8,10 +8,10 @@ - Kernel change: ``metadata.kernelspec.name`` or ``metadata.language_info.version`` differs at major.minor level - (Python 3.11 -> 3.13). Patch-only drift (3.13.3 -> 3.13.15) is NOT - flagged: the venv patch evolves under the canonical interpreter and - never changes repr() semantics (#17371). Outputs may format - ``repr(np.float64(0.9999999999999999))`` instead + (Python 3.10.11 -> 3.13.3, 3.11 -> 3.13). Patch-only drift (3.13.3 -> + 3.13.15) is NOT flagged: the venv patch evolves under the canonical + interpreter and never changes repr() semantics (#17371). Outputs may + format ``repr(np.float64(0.9999999999999999))`` instead of ``[1.0, 1.0, ...]`` even when the cell computes the same values. - Float format drift: NumPy 1.x prints ``[1.0, 1.0, 1.0]``; NumPy 2.x prints ``[1.0, 0.9999999999999999, 1.0]``. The values are within @@ -222,22 +222,37 @@ def diff_kernel(base_info, head_info): # ce n'est pas une regression, pas plus qu'une derive de patch (#17371). # La DIRECTION porte l'acceptation : la transition inverse reste rouge. # Portee mesuree au 2026-10-05 : -# - C# ``.net-csharp`` : 141 notebooks a 13.0, 7 a 12.0 (#17679, transition acceptee) ; +# - C# ``.net-csharp`` : 141 notebooks a 13.0, 7 a 12.0 (#17679). # - Python ``python3`` (serie QC/Python) : 11 versions heterogenes # (3.8.10, 3.9.0, 3.10.0, 3.10.11, 3.10.19, 3.11.0, 3.11.9, 3.11.14, # 3.11.15, 3.13.3, 3.13.7, 3.13.12, 3.13.14) ; 60 carnets ``python3`` + 2 -# ``conda-torch`` ; canon documente dans requirements.txt = 3.11 -# (QuantConnect cloud, ligne 23). La transition 3.10 -> 3.11 est la -# migration historique de la serie ; 3.11 -> 3.13 la convergence -# future. Les deux restent acceptees en direction du canon. -# La transition inverse (3.13 -> 3.11, 3.11 -> 3.10) reste rouge. +# ``conda-torch``. +# - Decision duale sur le canon (coord. 2026-10-05T03:43:46Z, DM +# msg-20261005T034346-qyldsl) : **deux canons**, pas un seul -- +# (a) **canon des algorithmes deployes sur QC Cloud = Python 3.11**, +# documente dans ``MyIA.AI.Notebooks/QuantConnect/requirements.txt`` ; +# (b) **canon de l'execution locale des carnets = Python 3.13**, qui est +# l'interpreteur de la flotte -- c'est lui qui ecrit +# ``language_info.version`` a chaque rejeu. +# Les deux roles sont separes par design ; la migration historique +# ``3.10 -> 3.11`` reste couverte, et la convergence future +# ``3.11 -> 3.13`` aussi, plus les sauts directs ``3.8/3.9/3.10 -> 3.13`` +# (cas fondateur de #19181, PR #19163 : 3.10.11 -> 3.13.3). +# La transition inverse (3.13 -> 3.11, 3.11 -> 3.10, 3.13 -> 3.8/3.9/3.10) +# reste rouge. CANONICAL_LANGUAGE_TRANSITIONS = { (".net-csharp", "12.0", "13.0"): "C# 12.0 -> 13.0 : convergence vers le canon C# 13.0 (#17679)", ("python3", "3.10", "3.11"): - "Python 3.10 -> 3.11 : convergence vers le canon QC/Python (#19181)", + "Python 3.10 -> 3.11 : convergence vers le canon QC/Python 3.11 (#19181)", ("python3", "3.11", "3.13"): - "Python 3.11 -> 3.13 : convergence vers le canon Python 3.13 (#19181)", + "Python 3.11 -> 3.13 : convergence vers le canon d'execution 3.13 (#19181)", + ("python3", "3.10", "3.13"): + "Python 3.10 -> 3.13 : convergence directe vers le canon d'execution 3.13 (#19181, cas fondateur)", + ("python3", "3.9", "3.13"): + "Python 3.9 -> 3.13 : convergence directe vers le canon d'execution 3.13 (#19181)", + ("python3", "3.8", "3.13"): + "Python 3.8 -> 3.13 : convergence directe vers le canon d'execution 3.13 (#19181)", } diff --git a/scripts/notebook_tools/tests/test_check_kernel_drift.py b/scripts/notebook_tools/tests/test_check_kernel_drift.py index f61820645d..57162dcc6b 100644 --- a/scripts/notebook_tools/tests/test_check_kernel_drift.py +++ b/scripts/notebook_tools/tests/test_check_kernel_drift.py @@ -319,16 +319,22 @@ def test_canonical_transition_kernelspec_change_refused(): # --- #19181 : table d'acceptation canon Python (QC/Python) ----------------- # Mesure du 2026-10-05 sur la serie QC/Python : 11 versions heterogenes -# (3.8.10 a 3.13.14) ; 60 carnets ``python3`` + 2 ``conda-torch``. Canon -# documente dans ``MyIA.AI.Notebooks/QuantConnect/requirements.txt`` (3.11, -# QuantConnect cloud). La transition 3.10 -> 3.11 est la migration -# historique de la serie ; 3.11 -> 3.13 la convergence future. Les deux -# restent acceptees en direction du canon ; la direction inverse reste -# rouge. +# (3.8.10 a 3.13.14) ; 60 carnets ``python3`` + 2 ``conda-torch``. +# Decision duale coord. (2026-10-05T03:43:46Z, DM +# msg-20261005T034346-qyldsl) : +# - canon des algorithmes deployes sur QC Cloud = Python 3.11 +# (documented in ``MyIA.AI.Notebooks/QuantConnect/requirements.txt``) ; +# - canon de l'execution locale des carnets = Python 3.13 (l'interpreteur +# de la flotte qui ecrit ``language_info.version`` a chaque rejeu). +# Transitions acceptees en direction du canon : 3.10 -> 3.11 (historique +# QC Cloud), 3.11 -> 3.13 (convergence locale), et sauts directs +# 3.8/3.9/3.10 -> 3.13 (cas fondateur de #19181, PR #19163 : 3.10.11 -> +# 3.13.3). La direction inverse reste rouge. def test_canonical_transition_python_311_to_313_accepted(): - # Positif 1 : la convergence vers Python 3.13 est couverte. + # Positif 1 : la convergence vers Python 3.13 (canon d'execution) est + # couverte. a = {"language_version": "3.11.16", "kernelspec_name": "python3"} b = {"language_version": "3.13.3", "kernelspec_name": "python3"} assert ckd.accepted_canonical_transition(a, b) is True @@ -337,12 +343,38 @@ def test_canonical_transition_python_311_to_313_accepted(): def test_canonical_transition_python_310_to_311_accepted(): - # Positif 2 : la migration historique vers le canon 3.11 est couverte. + # Positif 2 : la migration historique vers le canon QC Cloud 3.11 est + # couverte. a = {"language_version": "3.10.19", "kernelspec_name": "python3"} b = {"language_version": "3.11.9", "kernelspec_name": "python3"} assert ckd.accepted_canonical_transition(a, b) is True +def test_canonical_transition_python_31011_to_3133_accepted(): + # Positif 3 (cas fondateur #19181, PR #19163) : la convergence directe + # 3.10.11 -> 3.13.3 est couverte. La flotte rejette les carnets en + # 3.13 (interpreteur local), donc cette transition est le passage + # reel ; les transitions via 3.11 sont possibles mais ne se + # composent pas (cle tuple exact). + a = {"language_version": "3.10.11", "kernelspec_name": "python3"} + b = {"language_version": "3.13.3", "kernelspec_name": "python3"} + assert ckd.accepted_canonical_transition(a, b) is True + + +def test_canonical_transition_python_38_to_313_accepted(): + # Positif 4 : 3.8 -> 3.13 (le saut le plus large) est couvert. + a = {"language_version": "3.8.10", "kernelspec_name": "python3"} + b = {"language_version": "3.13.3", "kernelspec_name": "python3"} + assert ckd.accepted_canonical_transition(a, b) is True + + +def test_canonical_transition_python_39_to_313_accepted(): + # Positif 5 : 3.9 -> 3.13 est couvert. + a = {"language_version": "3.9.0", "kernelspec_name": "python3"} + b = {"language_version": "3.13.3", "kernelspec_name": "python3"} + assert ckd.accepted_canonical_transition(a, b) is True + + def test_canonical_transition_python_313_to_311_refused(): # Negatif 1 : la direction inverse est une regression du canon. a = {"language_version": "3.13.3", "kernelspec_name": "python3"} @@ -357,8 +389,16 @@ def test_canonical_transition_python_311_to_310_refused(): assert ckd.accepted_canonical_transition(a, b) is False +def test_canonical_transition_python_313_to_38_refused(): + # Negatif 3 : retomber de 3.13 a 3.8 reste rouge, meme si 3.8 -> 3.13 + # est accepte dans l'autre sens. + a = {"language_version": "3.13.3", "kernelspec_name": "python3"} + b = {"language_version": "3.8.10", "kernelspec_name": "python3"} + assert ckd.accepted_canonical_transition(a, b) is False + + def test_canonical_transition_python_kernelspec_change_refused(): - # Negatif 3 : un changement de kernelspec.name reste rouge, meme avec + # Negatif 4 : un changement de kernelspec.name reste rouge, meme avec # des versions couvertes par la table. a = {"language_version": "3.11.9", "kernelspec_name": "python3"} b = {"language_version": "3.13.3", "kernelspec_name": "python311"} From 68350663126f7c7b6e7e5d98824e7d9e14699805 Mon Sep 17 00:00:00 2001 From: jsboige Date: Mon, 5 Oct 2026 06:25:58 +0200 Subject: [PATCH 3/6] fix(kernel-drift,#19199): exclure 3.8/3.9 -> 3.13 (ICT pinnee <3.10, reserve Hermes) La revue Hermes PRR_kwDOH2Odns8AAAABQnPfEQ a releve que les sauts 3.8 -> 3.13 et 3.9 -> 3.13 feraient passer vert un carnet ICT rejoue par erreur sous 3.13, alors que la serie ICT (#5635, ICT-24) reste pinnee 'requires-python >=3.9,<3.10' (contrainte 'pyphi==1.2.0', mesure #19160) et que le cliquet n'a pas de scope par chemin/serie. Le commit 113536593 a ajoute les transitions et les 2 tests positifs. On retire ici les 2 transitions + les 2 tests positifs, on les remplace par 2 tests negatifs (3.8/3.9 -> 3.13 rouges). Les 2 rescapes 3.8.10 et 3.9.0 (1 carnet chacun, mesure body) sont traites au cas par cas. Coquille '3.10 ou 3.12' corrigee en '3.10 ou 3.13' dans la section Portee du body PR (mineur Hermes, meme revue). 42 tests, tous verts. Co-Authored-By: Claude Haiku 4.5 (1M context) --- scripts/notebook_tools/check_kernel_drift.py | 16 ++++++++++------ .../tests/test_check_kernel_drift.py | 17 +++++++++++------ 2 files changed, 21 insertions(+), 12 deletions(-) diff --git a/scripts/notebook_tools/check_kernel_drift.py b/scripts/notebook_tools/check_kernel_drift.py index a3005cc8c7..3d72977507 100644 --- a/scripts/notebook_tools/check_kernel_drift.py +++ b/scripts/notebook_tools/check_kernel_drift.py @@ -236,9 +236,17 @@ def diff_kernel(base_info, head_info): # ``language_info.version`` a chaque rejeu. # Les deux roles sont separes par design ; la migration historique # ``3.10 -> 3.11`` reste couverte, et la convergence future -# ``3.11 -> 3.13`` aussi, plus les sauts directs ``3.8/3.9/3.10 -> 3.13`` +# ``3.11 -> 3.13`` aussi, plus le saut direct ``3.10 -> 3.13`` # (cas fondateur de #19181, PR #19163 : 3.10.11 -> 3.13.3). -# La transition inverse (3.13 -> 3.11, 3.11 -> 3.10, 3.13 -> 3.8/3.9/3.10) +# Les sauts ``3.8 -> 3.13`` et ``3.9 -> 3.13`` sont **exclus** : la +# serie ICT (#5635, ICT-24) reste sur ``requires-python >=3.9,<3.10`` +# (contrainte ``pyphi==1.2.0``, mesure #19160), et le cliquet n'a +# pas de scope par chemin/série -- ajouter ces transitions ferait +# passer vert un carnet ICT rejoue par erreur sous 3.13 (reserve +# Hermes PRR_kwDOH2Odns8AAAABQnPfEQ, 2026-10-05). Les 2 rescapes +# ``3.8.10`` et ``3.9.0`` (1 carnet chacun, mesure body) sont +# traites au cas par cas. +# La transition inverse (3.13 -> 3.11, 3.11 -> 3.10, 3.13 -> 3.10) # reste rouge. CANONICAL_LANGUAGE_TRANSITIONS = { (".net-csharp", "12.0", "13.0"): @@ -249,10 +257,6 @@ def diff_kernel(base_info, head_info): "Python 3.11 -> 3.13 : convergence vers le canon d'execution 3.13 (#19181)", ("python3", "3.10", "3.13"): "Python 3.10 -> 3.13 : convergence directe vers le canon d'execution 3.13 (#19181, cas fondateur)", - ("python3", "3.9", "3.13"): - "Python 3.9 -> 3.13 : convergence directe vers le canon d'execution 3.13 (#19181)", - ("python3", "3.8", "3.13"): - "Python 3.8 -> 3.13 : convergence directe vers le canon d'execution 3.13 (#19181)", } diff --git a/scripts/notebook_tools/tests/test_check_kernel_drift.py b/scripts/notebook_tools/tests/test_check_kernel_drift.py index 57162dcc6b..a59b983c1b 100644 --- a/scripts/notebook_tools/tests/test_check_kernel_drift.py +++ b/scripts/notebook_tools/tests/test_check_kernel_drift.py @@ -361,18 +361,23 @@ def test_canonical_transition_python_31011_to_3133_accepted(): assert ckd.accepted_canonical_transition(a, b) is True -def test_canonical_transition_python_38_to_313_accepted(): - # Positif 4 : 3.8 -> 3.13 (le saut le plus large) est couvert. +def test_canonical_transition_python_38_to_313_refused(): + # Negatif 5 : 3.8 -> 3.13 reste rouge par construction. Le saut 3.8 + # n'est pas couvert par la table (serie ICT pinnée <3.10, pyphi==1.2.0, + # mesure #19160 ; sans scope par chemin/série, ajouter la transition + # ferait passer vert un carnet ICT rejoue par erreur -- reserve Hermes + # PRR_kwDOH2Odns8AAAABQnPfEQ, 2026-10-05). Les 2 rescapes 3.8.10/3.9.0 + # sont traites au cas par cas. a = {"language_version": "3.8.10", "kernelspec_name": "python3"} b = {"language_version": "3.13.3", "kernelspec_name": "python3"} - assert ckd.accepted_canonical_transition(a, b) is True + assert ckd.accepted_canonical_transition(a, b) is False -def test_canonical_transition_python_39_to_313_accepted(): - # Positif 5 : 3.9 -> 3.13 est couvert. +def test_canonical_transition_python_39_to_313_refused(): + # Negatif 6 : 3.9 -> 3.13 reste rouge (meme raison que 3.8). a = {"language_version": "3.9.0", "kernelspec_name": "python3"} b = {"language_version": "3.13.3", "kernelspec_name": "python3"} - assert ckd.accepted_canonical_transition(a, b) is True + assert ckd.accepted_canonical_transition(a, b) is False def test_canonical_transition_python_313_to_311_refused(): From e658391f65ba70c6a4218e950924f6f025a8dcc5 Mon Sep 17 00:00:00 2001 From: jsboige Date: Mon, 5 Oct 2026 06:52:19 +0200 Subject: [PATCH 4/6] fix(kernel-drift,#19199): transition 3.12 -> 3.13 (ICT-47 a 3.12.13 sur main, oubli coord) Oubli du tableau de transitions initial : le dispatch du 2026-10-05T03:43Z listait 3.8/3.9/3.10/3.11 -> 3.13 mais pas 3.12 -> 3.13. ICT-47 (PainAxisDistillation) sur main est a 'language_info.version=3.12.13' (mesure directe, 2026-10-05) ; la flotte le rejeu en 3.13, donc la transition est reelle et le carnet rougirait systematiquement sans cette entree. Ajouts : - entree ('python3', '3.12', '3.13') dans CANONICAL_LANGUAGE_TRANSITIONS - test positif 'test_canonical_transition_python_31213_to_3133_accepted' - test negatif symetrique 'test_canonical_transition_python_313_to_312_refused' - en-tete documente ICT-47 + raison de l'ajout Body PR amende : section 'Une transition' devient 'Deux transitions', liste des tests au complet (44 tests), section 'Diagnostic derive' pointe l'oubli coord (commentaire 5988053521). 44 tests, tous verts. Co-Authored-By: Claude Haiku 4.5 (1M context) --- scripts/notebook_tools/check_kernel_drift.py | 13 ++++++++++-- .../tests/test_check_kernel_drift.py | 21 +++++++++++++++++++ 2 files changed, 32 insertions(+), 2 deletions(-) diff --git a/scripts/notebook_tools/check_kernel_drift.py b/scripts/notebook_tools/check_kernel_drift.py index 3d72977507..fcfb1a3bb7 100644 --- a/scripts/notebook_tools/check_kernel_drift.py +++ b/scripts/notebook_tools/check_kernel_drift.py @@ -238,6 +238,13 @@ def diff_kernel(base_info, head_info): # ``3.10 -> 3.11`` reste couverte, et la convergence future # ``3.11 -> 3.13`` aussi, plus le saut direct ``3.10 -> 3.13`` # (cas fondateur de #19181, PR #19163 : 3.10.11 -> 3.13.3). +# Le saut ``3.12 -> 3.13`` est couvert : ICT-47 (PainAxisDistillation) +# sur main est a ``language_info.version = 3.12.13`` (mesure directe +# sur le carnet, 2026-10-05), et la flotte le rejeu en 3.13 -- +# sans cette entree, le carnet rougirait systematiquement. Le saut +# ``3.11 -> 3.12`` reste lui aussi implicite (3.12 = release +# courante de plusieurs carnets), mais n'est pas ajoute en +# l'absence d'un carnet de reference qui le pratique. # Les sauts ``3.8 -> 3.13`` et ``3.9 -> 3.13`` sont **exclus** : la # serie ICT (#5635, ICT-24) reste sur ``requires-python >=3.9,<3.10`` # (contrainte ``pyphi==1.2.0``, mesure #19160), et le cliquet n'a @@ -246,8 +253,8 @@ def diff_kernel(base_info, head_info): # Hermes PRR_kwDOH2Odns8AAAABQnPfEQ, 2026-10-05). Les 2 rescapes # ``3.8.10`` et ``3.9.0`` (1 carnet chacun, mesure body) sont # traites au cas par cas. -# La transition inverse (3.13 -> 3.11, 3.11 -> 3.10, 3.13 -> 3.10) -# reste rouge. +# La transition inverse (3.13 -> 3.12, 3.13 -> 3.11, 3.11 -> 3.10, +# 3.13 -> 3.10) reste rouge. CANONICAL_LANGUAGE_TRANSITIONS = { (".net-csharp", "12.0", "13.0"): "C# 12.0 -> 13.0 : convergence vers le canon C# 13.0 (#17679)", @@ -257,6 +264,8 @@ def diff_kernel(base_info, head_info): "Python 3.11 -> 3.13 : convergence vers le canon d'execution 3.13 (#19181)", ("python3", "3.10", "3.13"): "Python 3.10 -> 3.13 : convergence directe vers le canon d'execution 3.13 (#19181, cas fondateur)", + ("python3", "3.12", "3.13"): + "Python 3.12 -> 3.13 : convergence vers le canon d'execution 3.13 (#19181, ICT-47 a 3.12.13 sur main)", } diff --git a/scripts/notebook_tools/tests/test_check_kernel_drift.py b/scripts/notebook_tools/tests/test_check_kernel_drift.py index a59b983c1b..bbf3aebef4 100644 --- a/scripts/notebook_tools/tests/test_check_kernel_drift.py +++ b/scripts/notebook_tools/tests/test_check_kernel_drift.py @@ -402,6 +402,27 @@ def test_canonical_transition_python_313_to_38_refused(): assert ckd.accepted_canonical_transition(a, b) is False +def test_canonical_transition_python_31213_to_3133_accepted(): + # Positif : la transition 3.12 -> 3.13 est couverte. ICT-47 + # (PainAxisDistillation) sur main est a language_info.version=3.12.13 + # (mesure directe, 2026-10-05) ; la flotte le rejeu en 3.13, donc + # la transition est reelle. Ajout a la demande du coordinateur + # (commentaire 5988053521, 2026-10-05T04:22Z), oubli du dispatch + # initial qui ne listait pas 3.12 dans les couverts. + a = {"language_version": "3.12.13", "kernelspec_name": "python3"} + b = {"language_version": "3.13.3", "kernelspec_name": "python3"} + assert ckd.accepted_canonical_transition(a, b) is True + + +def test_canonical_transition_python_313_to_312_refused(): + # Negatif : la direction inverse 3.13 -> 3.12 reste rouge (n'a pas + # ete ajoutee a la table ; convention : la table n'accepte que les + # convergences vers le canon, pas la descente). + a = {"language_version": "3.13.3", "kernelspec_name": "python3"} + b = {"language_version": "3.12.13", "kernelspec_name": "python3"} + assert ckd.accepted_canonical_transition(a, b) is False + + def test_canonical_transition_python_kernelspec_change_refused(): # Negatif 4 : un changement de kernelspec.name reste rouge, meme avec # des versions couvertes par la table. From e3f8fc47346d528e136c1b3362b3b647d9edcd65 Mon Sep 17 00:00:00 2001 From: jsboige Date: Mon, 5 Oct 2026 07:23:57 +0200 Subject: [PATCH 5/6] fix(kernel-drift,#19199): aligner docs sur la table finale (oubli adjoint 5988483737) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit L'adjoint po-2025 (commentaire 5988483737) a releve trois contradictions documentaires entre la table finale et les commentaires qui l'annoncent encore : 1. requirements.txt:163-167 et test_check_kernel_drift.py:329-332 continuent de lister '3.8/3.9/3.10 -> 3.13' alors que la table ne contient plus que 3.10 -> 3.13 + 3.12 -> 3.13. Aligner les deux blocs sur la table finale. 2. Le temoin ICT-47 ne couvre pas le tuple 3.12 -> 3.13 : son kernelspec sur main est 'py310-gpu' (distinct de 'python3'), donc la table (qui exige le meme nom de kernel entre base et tete) ne s'applique pas. ICT-47 reste bien a 3.12.13 (mesure directe), mais hors scope du tuple python3. L'entree anticipe la convergence pour un futur carnet 'python3' a 3.12.x ; aucun carnet de cette forme n'est encore mesure sur main. 3. Body PR rafraichi d'apres la tete : '70 passed (38 + 22 + 10)' -> '76 passed (44 + 22 + 10)' ; 'Quatre tests' -> 'Onze tests ajoutes' (8 Python + 3 C#) avec chaque nom explicite ; motif ICT-47 retire des sections 'Deux transitions' et 'Complément'. 44 tests, tous verts. Co-Authored-By: Claude Haiku 4.5 (1M context) --- MyIA.AI.Notebooks/QuantConnect/requirements.txt | 9 ++++++--- scripts/notebook_tools/check_kernel_drift.py | 16 ++++++++++------ .../tests/test_check_kernel_drift.py | 9 ++++++--- 3 files changed, 22 insertions(+), 12 deletions(-) diff --git a/MyIA.AI.Notebooks/QuantConnect/requirements.txt b/MyIA.AI.Notebooks/QuantConnect/requirements.txt index fa89516c91..1b4fbe78b7 100644 --- a/MyIA.AI.Notebooks/QuantConnect/requirements.txt +++ b/MyIA.AI.Notebooks/QuantConnect/requirements.txt @@ -162,7 +162,10 @@ cloudpickle>=3.0.0 # - La table CANONICAL_LANGUAGE_TRANSITIONS du cliquet # ``scripts/notebook_tools/check_kernel_drift.py`` accepte les # transitions 3.10 -> 3.11 (migration historique vers QC Cloud), -# 3.11 -> 3.13 (convergence vers l'interpreteur local), et les sauts -# directs 3.8/3.9/3.10 -> 3.13 (cas fondateur #19181, PR #19163 : -# 3.10.11 -> 3.13.3). La direction inverse reste rouge. +# 3.11 -> 3.13 (convergence vers l'interpreteur local), le saut +# direct 3.10 -> 3.13 (cas fondateur #19181, PR #19163 : 3.10.11 +# -> 3.13.3), et 3.12 -> 3.13 (anticipation de convergence, pas de +# carnet `python3` a 3.12 mesuré a l'instant -- ICT-47 sur main est +# a `py310-gpu` 3.12.13, kernelspec distinct de `python3`, donc hors +# scope). La direction inverse reste rouge. # - NumPy < 2.0 for compatibility with some libraries diff --git a/scripts/notebook_tools/check_kernel_drift.py b/scripts/notebook_tools/check_kernel_drift.py index fcfb1a3bb7..1ae3d36d1f 100644 --- a/scripts/notebook_tools/check_kernel_drift.py +++ b/scripts/notebook_tools/check_kernel_drift.py @@ -240,11 +240,15 @@ def diff_kernel(base_info, head_info): # (cas fondateur de #19181, PR #19163 : 3.10.11 -> 3.13.3). # Le saut ``3.12 -> 3.13`` est couvert : ICT-47 (PainAxisDistillation) # sur main est a ``language_info.version = 3.12.13`` (mesure directe -# sur le carnet, 2026-10-05), et la flotte le rejeu en 3.13 -- -# sans cette entree, le carnet rougirait systematiquement. Le saut -# ``3.11 -> 3.12`` reste lui aussi implicite (3.12 = release -# courante de plusieurs carnets), mais n'est pas ajoute en -# l'absence d'un carnet de reference qui le pratique. +# sur le carnet, 2026-10-05), mais son kernelspec est ``py310-gpu`` +# (distinct de ``python3``), donc le tuple ``("python3", "3.12", "3.13")`` +# ne s'applique pas a ce carnet -- la table exige le meme nom de +# kernel entre base et tete. L'entree anticipe la convergence vers +# le canon pour un futur carnet ``python3`` a 3.12.x ; aucun carnet +# de cette forme n'est encore mesuré sur main. Le saut +# ``3.11 -> 3.12`` reste implicite (3.12 = release courante de +# plusieurs carnets), mais n'est pas ajoute en l'absence d'un carnet +# de reference ``python3`` qui le pratique. # Les sauts ``3.8 -> 3.13`` et ``3.9 -> 3.13`` sont **exclus** : la # serie ICT (#5635, ICT-24) reste sur ``requires-python >=3.9,<3.10`` # (contrainte ``pyphi==1.2.0``, mesure #19160), et le cliquet n'a @@ -265,7 +269,7 @@ def diff_kernel(base_info, head_info): ("python3", "3.10", "3.13"): "Python 3.10 -> 3.13 : convergence directe vers le canon d'execution 3.13 (#19181, cas fondateur)", ("python3", "3.12", "3.13"): - "Python 3.12 -> 3.13 : convergence vers le canon d'execution 3.13 (#19181, ICT-47 a 3.12.13 sur main)", + "Python 3.12 -> 3.13 : convergence vers le canon d'execution 3.13 (#19181, anticipation -- pas de carnet `python3` a 3.12 mesure)", } diff --git a/scripts/notebook_tools/tests/test_check_kernel_drift.py b/scripts/notebook_tools/tests/test_check_kernel_drift.py index bbf3aebef4..46b863f5f7 100644 --- a/scripts/notebook_tools/tests/test_check_kernel_drift.py +++ b/scripts/notebook_tools/tests/test_check_kernel_drift.py @@ -327,9 +327,12 @@ def test_canonical_transition_kernelspec_change_refused(): # - canon de l'execution locale des carnets = Python 3.13 (l'interpreteur # de la flotte qui ecrit ``language_info.version`` a chaque rejeu). # Transitions acceptees en direction du canon : 3.10 -> 3.11 (historique -# QC Cloud), 3.11 -> 3.13 (convergence locale), et sauts directs -# 3.8/3.9/3.10 -> 3.13 (cas fondateur de #19181, PR #19163 : 3.10.11 -> -# 3.13.3). La direction inverse reste rouge. +# QC Cloud), 3.11 -> 3.13 (convergence locale), 3.10 -> 3.13 (cas +# fondateur de #19181, PR #19163 : 3.10.11 -> 3.13.3), et 3.12 -> 3.13 +# (anticipation de convergence ; ICT-47 sur main est a `py310-gpu` +# 3.12.13, kernelspec distinct de `python3`, donc hors scope de ce +# tuple -- l'entree anticipe un futur carnet `python3` a 3.12). La +# direction inverse reste rouge. def test_canonical_transition_python_311_to_313_accepted(): From 4fd5d90b3ba90badd048dcf477fcaaad5ed16dbf Mon Sep 17 00:00:00 2001 From: myia-ai-01 Date: Mon, 5 Oct 2026 08:27:36 +0200 Subject: [PATCH 6/6] fix(test,#19199): test_canonical_transition_python_31213_to_3133_accepted commentaire Anticipation Le commentaire en tete du test affirmait a tort que la flotte rejouait ICT-47 sous 3.13. Mesure directe : le kernelspec d'ICT-47 (PainAxisDistillation) est py310-gpu, distinct de python3, donc le tuple (python3, 3.12, 3.13) ne s'applique pas a ce carnet -- le cliquet exige le meme nom de kernel entre base et tete. ICT-47 reste a 3.12.13 sur main, et le test couvre un tuple synthetique en anticipation d'un futur carnet python3 a 3.12.x. Mention reserve adjoint 5988942776 (2026-10-05T05:42Z, c.162) : la levee du point 1 par commit, qui re-armarde le DWELL 120 min. Co-Authored-By: Claude Haiku 4.5 (1M context) --- .../tests/test_check_kernel_drift.py | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/scripts/notebook_tools/tests/test_check_kernel_drift.py b/scripts/notebook_tools/tests/test_check_kernel_drift.py index 46b863f5f7..e86139ea5d 100644 --- a/scripts/notebook_tools/tests/test_check_kernel_drift.py +++ b/scripts/notebook_tools/tests/test_check_kernel_drift.py @@ -406,12 +406,17 @@ def test_canonical_transition_python_313_to_38_refused(): def test_canonical_transition_python_31213_to_3133_accepted(): - # Positif : la transition 3.12 -> 3.13 est couverte. ICT-47 - # (PainAxisDistillation) sur main est a language_info.version=3.12.13 - # (mesure directe, 2026-10-05) ; la flotte le rejeu en 3.13, donc - # la transition est reelle. Ajout a la demande du coordinateur - # (commentaire 5988053521, 2026-10-05T04:22Z), oubli du dispatch - # initial qui ne listait pas 3.12 dans les couverts. + # Positif : la transition 3.12 -> 3.13 est couverte. Anticipation : + # aucun carnet main n'exerce aujourd'hui le tuple (`python3`, `3.12`, + # `3.13`) — le seul carnet a 3.12 mesure est ICT-47 + # (PainAxisDistillation), dont le kernelspec est `py310-gpu` (distinct + # de `python3`), donc hors scope de ce tuple (le cliquet exige le meme + # nom de kernel entre base et tete). L'entree est ajoutee pour + # preparer la convergence d'un futur carnet `python3` a 3.12.x. Le + # temoin effectif du test est le tuple synthetique ci-dessous, pas + # ICT-47. Ajout a la demande du coordinateur (commentaire 5988053521, + # 2026-10-05T04:22Z), oubli du dispatch initial qui ne listait pas + # 3.12 dans les couverts. a = {"language_version": "3.12.13", "kernelspec_name": "python3"} b = {"language_version": "3.13.3", "kernelspec_name": "python3"} assert ckd.accepted_canonical_transition(a, b) is True