Constat
scripts/notebook_tools/tests/test_check_exec_ratchet.py::TestCli — 2 tests échouent sur main propre sous Windows (vérifié le 2026-09-22) :
test_exit_1_on_regression — TypeError: argument of type 'NoneType' is not iterable sur assert "::error file=a.ipynb" in out.stderr
test_failure_points_to_failbydesign_protocol — même signature
Cause
Le test lance check_exec_ratchet.py en subprocess dont le stderr contient un em-dash (byte 0x97 en cp1252 Windows). Le reader thread du subprocess.run(text=True) décode en UTF-8 par défaut → UnicodeDecodeError: 'utf-8' codec can't decode byte 0x97 in position 111 → stderr=None → le assert échoue sur None (le vrai échec d'origine étant masqué).
Classe connue : subprocess sans encoding="utf-8" explicite sous Windows cp1252 (famille leçon cp1252 consolidée).
Repro
python -m pytest scripts/notebook_tools/tests/test_check_exec_ratchet.py::TestCli -q
# 2 failed (stderr=None / UnicodeDecodeError)
PYTHONIOENCODING=utf-8 python -m pytest scripts/notebook_tools/tests/test_check_exec_ratchet.py::TestCli -q
# 4 passed
Vérifié identique sur main propre et sur la branche feature/17416-causalbridges-renum — base-inherited, découvert via le check Exec-sequence ratchet (base vs PR) de la PR #17421 (étape « Organ unit tests »).
Attendu
Passer encoding="utf-8" (ou errors="replace") au subprocess.run du harnais de test (et vérifier les appels de l'organe lui-même) pour que le verdict du test porte sur le ratchet, pas sur la page de code de la machine.
Constat
scripts/notebook_tools/tests/test_check_exec_ratchet.py::TestCli— 2 tests échouent surmainpropre sous Windows (vérifié le 2026-09-22) :test_exit_1_on_regression—TypeError: argument of type 'NoneType' is not iterablesurassert "::error file=a.ipynb" in out.stderrtest_failure_points_to_failbydesign_protocol— même signatureCause
Le test lance
check_exec_ratchet.pyen subprocess dont le stderr contient un em-dash (byte0x97en cp1252 Windows). Le reader thread dusubprocess.run(text=True)décode en UTF-8 par défaut →UnicodeDecodeError: 'utf-8' codec can't decode byte 0x97 in position 111→stderr=None→ le assert échoue sur None (le vrai échec d'origine étant masqué).Classe connue : subprocess sans
encoding="utf-8"explicite sous Windows cp1252 (famille leçon cp1252 consolidée).Repro
Vérifié identique sur
mainpropre et sur la branchefeature/17416-causalbridges-renum— base-inherited, découvert via le checkExec-sequence ratchet (base vs PR)de la PR #17421 (étape « Organ unit tests »).Attendu
Passer
encoding="utf-8"(ouerrors="replace") ausubprocess.rundu harnais de test (et vérifier les appels de l'organe lui-même) pour que le verdict du test porte sur le ratchet, pas sur la page de code de la machine.