Skip to content

harness: check_lane_claim.py crashe sur JSON gh non-cp1252 (UnicodeDecodeError->TypeError) - reproduit sur #5635, 6 sites subprocess sans encoding= #12811

Description

@jsboige

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 #9775 crashe 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).

Activity

  1. jsboige commented on Aug 24, 2026

    @jsboige
    OwnerAuthor

    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

  2. jsboige commented on Aug 24, 2026

    @jsboige
    OwnerAuthor

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

  3. jsboige commented on Aug 24, 2026

    @jsboige
    OwnerAuthor

    [CLAIMED] lane myia-po-2024:CoursIA-2 — fix 6 sites subprocess.run sans encoding= (UTF-8 épinglé, errors=replace)

  4. added a commit that references this issue on Aug 25, 2026
  5. jsboige commented on Aug 26, 2026

    @jsboige
    OwnerAuthor

    [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 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é :

    1. Le travail est écrit et poussé. On ne jette pas du travail livré au profit d'une réservation non consommée.
    2. po-2024 est mobilisée sur [infra] Rapatrier les runners de test — préparation clé en main (activer d'un seul geste, self-hosted same-repo uniquement) #12704 (runner self-hosted), qui vient de remonter en tête de priorité — c'est le seul remède qui ajoute de la capacité CI hors du plafond de 14 jobs partagé, cf. [infra] Famine CI chiffree : +251 runs/h, 0 verdict sur 49 terminés — 50 % du volume vient de 12 gardes non filtrés #13097. La détourner vers un fix d'encodage serait un mauvais emploi.

    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.

  6. added 3 commits that reference this issue on Aug 26, 2026
  7. jsboige commented on Aug 26, 2026

    @jsboige
    OwnerAuthor

    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.

  8. added 3 commits that reference this issue on Aug 26, 2026
  9. added 2 commits that reference this issue on Aug 28, 2026
  10. 51 remaining items

  11. added a commit that references this issue on Oct 13, 2026
  12. added a commit that references this issue on Oct 15, 2026
  13. added a commit that references this issue on Oct 16, 2026
  14. added a commit that references this issue on Oct 16, 2026
  15. added 3 commits that reference this issue on Oct 17, 2026
  16. added a commit that references this issue on Oct 21, 2026
  17. added 7 commits that reference this issue on Oct 22, 2026
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