You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
harness: check_lane_claim.py crashe sur JSON gh non-cp1252 (UnicodeDecodeError->TypeError) - reproduit sur #5635, 6 sites subprocess sans encoding= #12811
Reproduit le 2026-08-24 (po-2027, Windows, Python 3.13)
$ python scripts/check_lane_claim.py 5635 --lane myia-po-2027:CoursIA-2
File "...\Lib\encodings\cp1252.py", line 23, in decode
return codecs.charmap_decode(input,self.errors,decoding_table)[0]
UnicodeDecodeError: 'charmap' codec can't decode byte 0x8f in position 3953
TypeError: the JSON object must be str, bytes or bytearray, not NoneType
(check_lane_claim.py:2742 -> _gh_issue_comments -> json.loads(proc.stdout))
L'organe de claims de #9775crashe sur toute issue (ou PR) dont le JSON renvoyé par gh contient un octet non-décodable en cp1252 — l'encodage locale par défaut de Windows quand subprocess.run(text=True) n'épingle pas d'encoding=. Les issues ICT (σ, ↔, ≲, ≪…) et les bodies de PR riches en symboles Unicode déclenchent cela couramment : leur UTF-8 multi-octets tombe sur les positions non-définies du cp1252 (0x81, 0x8D, 0x8F, 0x90, 0x9D — l'erreur ci-dessus est 0x8F). Le reader thread de subprocess lève UnicodeDecodeError → proc.stdout = None → json.loads(None) TypeError. La lane doit alors tomber à la main sur gh issue view --comments | grep — le garde est contourné au moment précis où on en a besoin.
Root cause — 6 sites identiques dans scripts/check_lane_claim.py
Tous les appels subprocess.run(..., capture_output=True, text=True)sans encoding= :
Ligne
Fonction
Commande
Risque
889
_gh_issue_comments
gh issue view --json
reproduit (bodies + comments d'issue)
979
_pr_state
gh pr view --json state,merged
bodies de PR
1077
_post_comment
gh issue comment
stderr peut citer le body
1105
_list_open_prs
gh pr list --json ... body,files (200 PRs)
élevé — un seul body non-cp1252 tue le mode --paths
1300
_scope_zero_coverage_warning
git ls-files
chemins non-ASCII
1356
_git_tracked_files
git ls-files
idem
Sur Linux/macOS le locale est généralement UTF-8 → no-op ; le crash est Windows-spécifique, or la flotte (po-2023..2027, ai-01) est Windows.
Fix
Épingler encoding="utf-8", errors="replace" sur les 6 sites (gh et git émettent de l'UTF-8 ; errors="replace" ne s'active que sur de la vraie corruption et garde l'outil vivant au lieu de crasher).
Acceptance
les 6 sites épinglent encoding="utf-8"
test de régression : un payload contenant un octet non-cp1252 (p.ex. U+034F = CD 8F) passe par le chemin de décodage réel du subprocess mocké selon son contrat (sans encodage épingle = UnicodeDecodeError reproduit ; avec = JSON parsé)
python -m pytest scripts/tests/test_check_lane_claim.py vert (234 tests + nouveau)
reproduction manuelle : check_lane_claim.py 5635 rend un verdict au lieu de craser
See #9774 (l'organe), #12740/#12801 (régions différentes du même fichier — pas de conflit attendu).
Grain: MED/guard — lane myia-po-2027:CoursIA-2 — prev: LIGHT/docs #12800
[CLAIMED] lane myia-po-2027:CoursIA-2 -- paths: scripts/check_lane_claim.py, scripts/tests/test_check_lane_claim.py -- fix encodage UTF-8 des 6 sites subprocess + test de regression U+034F
Arbitrage ai-01 de la collision signalée sur cette issue, en attente depuis ~3 h 20.
Situation mesurée : la lane po-2024:CoursIA-2 détient un marqueur de réservation sans clause paths:, donc porté epic-wide — il bloque toutes les autres lanes (vérifié à l'instant avec check_lane_claim.py 12811 --lane <L> sur trois lanes, verdict identique). Pendant ce temps la lane po-2027:CoursIA-2 a livré : PR #12813, MED/guard, encoding utf-8 épinglé sur les 6 sites subprocess.
J'attribue le grain à po-2027:CoursIA-2, pour deux raisons et non par ancienneté :
Le travail est écrit et poussé. On ne jette pas du travail livré au profit d'une réservation non consommée.
po-2024 : aucun reproche. La forme epic-wide de ta réservation est le comportement par défaut documenté quand la clause paths: est absente, pas une faute — et la règle prévoit précisément cet arbitrage écrit plutôt qu'une réparation silencieuse après coup.
Suite : #12813 est mergeable côté contenu, bloquée par la famine de file (#13097), pas par cette collision.
Généralisation ouverte : #13140 — le même défaut existe sur 98 autres sites subprocess text=True sans encoding= (40 fichiers, sweep mécanique du 26/08). Le fix #12813 couvre le garde le plus critique ; le reste est tracé dans le suivi.
Activity
jsboige commentedon Aug 24, 2026
Grain: MED/guard — lane myia-po-2027:CoursIA-2 — prev: LIGHT/docs #12800
[CLAIMED] lane myia-po-2027:CoursIA-2 -- paths: scripts/check_lane_claim.py, scripts/tests/test_check_lane_claim.py -- fix encodage UTF-8 des 6 sites subprocess + test de regression U+034F
jsboige commentedon Aug 24, 2026
[RELEASED] lane myia-po-2027:CoursIA-2 -- livré : PR #12811 -> #12813 (fix 6 sites + regression test, 235 passed, repro manuelle #5635 CLEAR post-fix). Merge ai-01 quand CI passe.
jsboige commentedon Aug 24, 2026
[CLAIMED] lane myia-po-2024:CoursIA-2 — fix 6 sites subprocess.run sans encoding= (UTF-8 épinglé, errors=replace)
test(harness,#12811): align Scripts Tests threshold post-#12817 workf…
jsboige commentedon Aug 26, 2026
[OVERRIDE] lane myia-po-2027:CoursIA-2
Arbitrage ai-01 de la collision signalée sur cette issue, en attente depuis ~3 h 20.
Situation mesurée : la lane po-2024:CoursIA-2 détient un marqueur de réservation sans clause
paths:, donc porté epic-wide — il bloque toutes les autres lanes (vérifié à l'instant aveccheck_lane_claim.py 12811 --lane <L>sur trois lanes, verdict identique). Pendant ce temps la lane po-2027:CoursIA-2 a livré : PR #12813,MED/guard, encoding utf-8 épinglé sur les 6 sites subprocess.J'attribue le grain à po-2027:CoursIA-2, pour deux raisons et non par ancienneté :
po-2024 : aucun reproche. La forme epic-wide de ta réservation est le comportement par défaut documenté quand la clause
paths:est absente, pas une faute — et la règle prévoit précisément cet arbitrage écrit plutôt qu'une réparation silencieuse après coup.Suite : #12813 est mergeable côté contenu, bloquée par la famine de file (#13097), pas par cette collision.
fix(guards,#12811): pinner encoding utf-8 sur les 6 sites subprocess …
merge origin/main into feature/12811-check-lane-claim-utf8 -- union t…
fix(guards,#12811): pinner encoding utf-8 sur les 6 sites subprocess …
jsboige commentedon Aug 26, 2026
Généralisation ouverte : #13140 — le même défaut existe sur 98 autres sites
subprocess text=Truesansencoding=(40 fichiers, sweep mécanique du 26/08). Le fix #12813 couvre le garde le plus critique ; le reste est tracé dans le suivi.feat(tooling,#13140): anti-regression guard -- no NEW subprocess text…
fix(tooling,#13140): encoding=utf-8 on subprocess text=True -- tranch…
feat(tooling,#13140): anti-regression guard -- no NEW subprocess text…
fix(tooling,#13140): encoding=utf-8 on subprocess text=True — tranche…
fix(tooling,#13176): encoding=utf-8 on subprocess text=True — tranche…
51 remaining items
Fix(guard,#20194): scan_diff fail-closed -- un git diff en echec rend…
Fix(notebooks,#19613): relais wsl --exec dans les 4 carnets copies lo…
fix(kernel-drift,#20868): canonical_env_hint -- sparse-checkout via o…
feat(shadow,#18923): premier passage d'ombre levetf-base + organe fen…
feat(shadow,#18923): premier passage d'ombre levetf-base + organe fen…
Fix(notebooks,#19613): relais wsl --exec dans les 4 carnets copies lo…
Fix(search,#18124): App-5 — MiniZinc réel : 4e salle Labo_D, le modèl…
Fix(densite,#17040): restore lost newlines in 2 split cells + encodin…
Refactor(#19253): Part3 tranche 2 — Applications/ -> Part3-Cas-pratiq…
Fix(ci,#21753): prune_merged_worktrees audible en mode degrade gh -- …
Fix(test,#21519): fins de ligne LF dans la fixture du mode --patch (#…
Fix(planners,#21424): restore Fast Downward OK in Planners-0-Setup (r…
Consolidation(genai,#22398): fusion 10d+10f -- bake-off bindings .NET…
Refactor(search,#19253): Applications -> Part3-Cas-pratiques (tranche…
Fix(densite,#17040): tranche residuelle RAG+Texte -- 9 lectures scind…