Repository navigation
Conversation
`_cli` serialisait sur `sys.stdout` via `json.dump(..., ensure_ascii=False)`. Sous une console Windows cp1252, un seul titre d'EPIC portant un caractere hors cp1252 (U+21C4, U+2192, emoji) levait `UnicodeEncodeError` et le rapport entier etait perdu, y compris les entrees encodables. Mesure du 2026-11-04 (lane myia-po-2027): premier run tronque a 1980 octets sur 59 findings, soit 2 findings visibles sur 59. Le run n'a pu etre obtenu qu'en imposant `PYTHONIOENCODING=utf-8`, c'est-a-dire en corrigeant a la main la console de chaque lane qui mesure — or le roulement #13906 est un protocole de flotte : chaque lane qui l'execute doit obtenir le meme rapport. Le correctif ecrit les octets directement sur `sys.stdout.buffer`, avec repli sur `sys.stdout.write` quand la sortie est un objet sans buffer (capture de test). Le rapport ne depend plus de l'encodage de la console. Preuves: - `python -m pytest scripts/tests/test_epic_body_staleness.py -q` -> 39 passed (38 avant, +1 test de regression qui rejoue le defaut). - Controle negatif: le nouveau test, lance sans le correctif, leve `JSONDecodeError: Expecting value: line 1 column 1 (char 0)` sur une sortie vide — la perte totale est reproduite. - Bout-en-bout sans `PYTHONIOENCODING`: rc=0, JSON valide, 95 EPICs x 120 PRs, 19 findings, un titre hors cp1252 present dans la charge. See #13906 Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
|
[RETRAIT] doublon de #24622 — retire par sa lane, pas de contenu perdu Je ferme cette PR : elle double #24622 ( La cause du doublon, mesuree : j'ai lu le body de #23553, l'organe, puis code le correctif, sans relire le registre des verifications en attente de la lane — qui porte la ligne c491 nommant #24622 et sa tete. La recherche de plateau (L898) a ete faite pour le grain de roulement, pas pour ce correctif. Cout : une branche et un run de tests inutiles, aucun contenu perdu. Ce que cette PR apporte de plus, et qui peut servir a #24622 : un controle negatif executable — le test rejoue le defaut en simulant une console cp1252 (objet dont Aucune action attendue ici. La suite du correctif est sur #24622. |
|
G-VAR-2/3 GENRE signals (advisory, non bloquant, #10020).
G-VAR-2 plafonne a max(1, grains_mergees_du_jour // 3) LIGHT par lane et par jour, toutes categories LIGHT confondues -- un RATIO, pas un plafond plat ; le cap calcule du jour est dans le tally ci-dessus. G-VAR-3 interdit deux genres LIGHT consecutifs. Les signaux ci-dessus rendent le fait VISIBLE (labels |
|
No organ-duplication: no added def/class collides with another series organ API (scripts/audit/organ_api_index.yaml). Detector: |
Grain: MED/tooling — lane myia-po-2027:CoursIA — prev: MED/tooling #24067
Le défaut, reproduit avant fix
_clisérialisait sursys.stdoutviajson.dump(..., ensure_ascii=False). Sous une console Windows cp1252, un seul titre d'EPIC portant un caractère hors cp1252 (U+21C4, U+2192, emoji) lèveUnicodeEncodeErrorà la ligne 462, et le rapport entier est perdu — y compris les entrées dont le titre était encodable.Mesure du 2026-11-04, lane
myia-po-2027:CoursIA, sur le corpus réel (95 EPICs × 800 PRs) :PYTHONIOENCODINGUnicodeEncodeErrorsur\x97PYTHONIOENCODING=utf-8Le second run est celui qui a servi la tranche de roulement du jour. Il n'a été obtenu qu'en corrigeant à la main la console de la lane — or #13906 est un protocole de flotte : toute lane qui l'exécute doit obtenir le même rapport, sans connaître cette variable.
Ce que fait le correctif
build_payloadest sérialisé en mémoire, puis écrit en octets sursys.stdout.buffer, avec repli sursys.stdout.writequand la sortie est un objet sans buffer (capture de test). Le rapport ne dépend plus de l'encodage de la console.Preuves
python -m pytest scripts/tests/test_epic_body_staleness.py -qJSONDecodeError: Expecting value: line 1 column 1 (char 0)sur une sortie vide : la perte totale est reproduite, le test mesure bien le défautPYTHONIOENCODINGLe test de régression simule la console cp1252 par un objet dont
.writeencode en cp1252 (donc lève) et dont.bufferest unBytesIO: il échoue sur l'ancien code, passe sur le nouveau.Portée
--json/--prettyet le contratchecks: latest-wins-greenne sont pas touchés.Ce que ce correctif ne fait pas
Il ne change pas le fait que l'organe ne distingue pas une livraison d'axe d'une citation incidente — cette limite est déclarée par l'organe lui-même et reste à la charge de la lecture humaine (cf. la tranche du jour sur #23553, 3 livraisons d'axe sur 4 PRs citées).
See #13906
🤖 Generated with Claude Code