Repository navigation
Conversation
check_unaddressed_nits.gh_json lancait subprocess.run sans timeout= : les 11 sites d'appel de l'organe (grep -c timeout = 0 sur 1cef8a5) pouvaient bloquer la lecture du merge-gate B.0 sans rendre de verdict. - gh_json porte timeout=GH_CALL_TIMEOUT_S (90 s, par appel). - Une expiration n'est jamais avalee : improper_dismissals ne rend plus set() (un ensemble vide lirait la reserve d'un tiers comme levee), _gh_fetch_issue ne met plus None en cache, main() imprime NON MESURE sur stderr et rend 1 (non-CLEAN, fail-closed). - Tests : scripts/tests/test_check_unaddressed_nits_19643.py (5 tests ; 4 echouent avant le correctif, le controle 404 passe avant et apres). - Hors perimetre, signale et non corrige : pick_idle_grain.py (appels nus l.717 et l.935, `except Exception: continue` l.3984 autour de analyse_pr) ; CalledProcessError toujours avalee par improper_dismissals. See #19643 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LRbWZZHE9jZscr8ya3niWA
Path-collision (organ #13359/#13615)Cette PR #20752 (
|
|
Le check
Generated by Claude Code |
|
No organ-duplication: no added def/class collides with another series organ API (scripts/audit/organ_api_index.yaml). Detector: |
See #19643
Hors flotte (exemption #17713).
Summary
scripts/check_unaddressed_nits.pyne contenait aucune occurrence detimeout; ses 11 sites d'appelghpassent tous pargh_json, qui lancaitsubprocess.runsans borne.gh_jsonporte maintenant une borne par appel,GH_CALL_TIMEOUT_S = 90. Une expiration n'est jamais avalee :improper_dismissalset_gh_fetch_issuela laissent remonter, etmain()la rend enNON MESUREsur stderr avecrc=1(non-CLEAN, fail-closed).scripts/tests/test_check_unaddressed_nits_19643.py, 5 tests. Les 4 tests de comportement echouent surorigin/mainet passent apres correctif ; le 5e est un controle (404) qui passe dans les deux etats.pick_idle_grain.unaddressed_review_points(except Exception: continuel.3984 autour deanalyse_pr) avale desormais l'expiration d'une PR et la sort de la file de reparation sans le dire. Avant ce correctif, l'appel pendait. Suivi a ouvrir apres Fix(picker,#16926): la file de reparation lit le verdict de corps des reviews COMMENTED #20661, qui touche le meme fichier picker.Changes
scripts/check_unaddressed_nits.pyGH_CALL_TIMEOUT_S = 90, avec le motif de la valeur.gh_jsonpassetimeout=GH_CALL_TIMEOUT_Sasubprocess.run._gh_fetch_issue) :except subprocess.TimeoutExpired: raiseavant leexcept Exceptionexistant. Un 404 (CalledProcessError) garde sonNonemis en cache (fix(gate): la voie 3 de B.0 est morte — gh issue view n'expose pas isPullRequest, et la reparer seule ouvre une trappe #13725).improper_dismissals) :except subprocess.TimeoutExpired: raiseavant leexcept Exception: return set().main()) : le dispatchaudit/gateest dans untry;TimeoutExpiredimprimeNON MESURE : gh n'a pas repondu en <N>s (...)sur stderr et rend 1. Message en ASCII seul (stderr peut etre une console cp1252, cf check_unaddressed_nits : un mot francais lu comme un SHA, et un rebase-amend classe 'arbre differe' alors que les fichiers de la PR sont intacts #16103).scripts/tests/test_check_unaddressed_nits_19643.py(nouveau) :subprocess.runremplace par une fausse fonction, aucun reseau.test_gh_json_porte_une_borne_par_appeltest_improper_dismissals_propage_l_expirationtest_gh_fetch_issue_ne_cache_pas_none_sur_expirationtest_gh_fetch_issue_404_reste_none_et_cache(controle positif)test_main_rend_non_mesure_sur_expirationLe perimetre annonce par la fiche etait 4 tests ; le controle 404 est le cinquieme. Aucun autre fichier n'est touche : pas de notebook, pas de
pick_idle_grain.py.Verdicts
Constats de la fiche et de l'issue #19643, re-verifies sur
origin/main1cef8a5 (la fiche citait les lignes de ce commit, toutes exactes).gh_jsonlancesubprocess.runsans bornegit show 1cef8a5502:scripts/check_unaddressed_nits.pyl.3355-3359 ;grep -c timeout= 0 sur ce fichier ; apres : l.3361 et l.3367gh_jsonnusgrep -n 'gh_json('= 12 avec la definition)improper_dismissalsrendset()sur expirationexcept Exception: return set()) ; consommateur l.5097if login not in (dismissed_improperly or ()): continue: un ensemble vide lit la reserve d'un tiers comme levee. Avant correctif,test_improper_dismissals_propage_l_expiration:Failed: DID NOT RAISE TimeoutExpired_gh_fetch_issuemetNoneen cache sur expirationtest_gh_fetch_issue_ne_cache_pas_none_sur_expiration:Failed: DID NOT RAISE TimeoutExpired(la fonction rendNone)gate()etmain()ne traitent aucune exceptiondata = gh_json(["pr", "view", ...])) et l.5656 (main) ; avant correctif,test_main_rend_non_mesure_sur_expiration:subprocess.TimeoutExpired: Command '['gh', 'pr', 'view', '123', ...]' timed out after 0 secondsremonte nuimproper_dismissalsavale aussiCalledProcessError(fail-open pre-existant)except Exception: return set(); suivi a ouvrir_newest_remote_issue_update) et l.935 (fetch_raw,gh issue list) ;except Exception: continuel.3984pick_idle_grain.pyl.692-717, l.929-935, l.3984. Les lignes citees par l'issue (l.788, l.570) ont bouge surorigin/main; celles-ci sont a jourAucun constat de la fiche n'est FALSE POSITIVE.
Validation
Baseline, worktree sur 1cef8a5, avant toute edition :
Nouveaux tests sur l'organe NON modifie (
git stashdecheck_unaddressed_nits.pyseul, puispop) :Apres correctif, commit dcb0329 (relance apres le commit) :
Le detail par test (
-v, meme contenu) : les 4 tests en echec avant correctif passent, et le controle 404 passe dans les deux etats.Modules qui importent l'organe (
test_check_adjoint_prevalidation,test_check_lane_claim,test_pick_idle_grain,test_merge_ready,test_variation_adjacency_guard,test_variation_light_cap) :Cet echec est pre-existant : le meme test echoue sur 1cef8a5 (mesure avant edition). Le carnet Sudoku-09 est absent du sparse checkout de la session ; ce grain ne touche ni
check_lane_claim.pyni ce carnet.Bout en bout, vrai
subprocess,ghfactice qui dort 30 s dans le PATH, borne reduite a 2 s par le pilote :Ce qui n'a pas pu etre fait dans la session : un vrai
check_unaddressed_nits.py <PR>sur GitHub.gh pr viewpasse par GraphQL, rendu 403 ici.Lint et structure :
Collision (scan REST des 100 PR ouvertes, fichiers par PR, 2026-10-14) :
scripts/check_unaddressed_nits.pyest touche par #20741 seulement (_print_sha_notes, l.5518, +1 -1, et son testtest_check_unaddressed_nits_20066.py). Son diff s'applique sans conflit sur cette tete (git apply --check). Aucune autre PR ouverte ne touche l'organe ;pick_idle_grain.pyest touche par #20661.Le sujet de la borne par appel n'est pas teste sous Windows (siege po-2026 de la mesure de l'issue) : le chemin d'expiration de
subprocess.runy est different. A verifier au premier passage reel.Review Checklist
git diff --stat origin/main), aucun carnet, aucunpick_idle_grain.py.subprocessavecghfactice (sortie ci-dessus). La gate sur une PR reelle n'a pas pu etre lancee (GraphQL 403 dans la session). Pas de carnet a ré-executer.gh_json(11 sites de l'organe, aucun autre module ne l'importe),improper_dismissals(un seul appelant,gate),_gh_fetch_issue(viagh_issue_info, passe aanalyse). Appelants externes de l'organe :check_adjoint_prevalidationenveloppe toute exception enRuntimeError(non mesure, fail-closed) ;pick_idle_grainl.3984 avale (signale plus haut) ;review_coverage,nit_lift_authorship,pool_review_verdictsn'appellent nigh_jsonni les fonctions modifiees. Lesgh_jsonhomonymes deepic_body_staleness.py,check_epic_charter.py,lane_claim_epic_wide.py,check_closure_dossier.pysont des definitions locales.Hors perimetre (signale, non traite)
scripts/pick_idle_grain.py: appelssubprocess.runnus l.717 et l.935 ;except Exception: continuel.3984 qui avale maintenant une expiration de PR. A traiter apres merge de Fix(picker,#16926): la file de reparation lit le verdict de corps des reviews COMMENTED #20661 (meme fichier).improper_dismissals:CalledProcessErrortoujours avalee enset()(fail-open pre-existant, meme classe d'erreur).Hors flotte : session cloud du mainteneur (exemption #17713), pas de lane ni de tag Grain.
🤖 Generated with Claude Code
https://claude.ai/code/session_01LRbWZZHE9jZscr8ya3niWA
Generated by Claude Code